Skip to content

refactor(objectql): move the compatibility-API bodies out of engine.ts into engine-compatibility-api.ts (#25522 cut 8) - #26229

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-4vp88a
Oct 26, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-4vp88a

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Leehom · project thread
Part of #25522
Clause-②: no
Metadata-protocol: none
Ruling-ref: 6348891160

Cut 8 of the packages/objectql/src/engine.ts split (#24586 ruling A, recorded in 6270097840). The claim is 6419652034. Six bodies of the "Compatibility API" section move unedited into a new module, packages/objectql/src/engine-compatibility-api.ts: registerObject, getConfigs, introspectDatasource, syncSchemas, syncObjectSchema and removePackage. No behaviour changes. #25522 stays open for the later cuts.

Branch claude/project-thread-4vp88a (the card thread's harness-pinned branch), cut from origin/main at 7111e14ac, which contains cut 7's merge (dbfb52a66, #26160).

Why this area (the fresh seam table)

Measured on origin/main 7111e14ac. engine.ts is 23,165 lines, 7,359 of them (31.8%) from the last 30 days (git blame -s --since=2026-09-26T15:20Z). scripts/pm/git-history.mjs count (window covered, exit 0): 126 commits in 30 days, 32 in 7. class ObjectQL holds 318 members, 255 methods and accessors plus the constructor. Sections are cut 1's contiguous member ranges, re-located by first member name, docblocks included. The measuring script, run on cut 7's base d1ea2363f, reproduces cut 7's table and move screen byte for byte, so the readings compare. "inferred public" stays; "U" counts this.FIELD.delete/insert/update( sites (AST, casts stripped); "private statics" stay.

| range | section | first … last member | lines | 30-day lines | methods | inferred public | U | private statics |
| 4758-4983 | Instance state and constructor | txStore … constructor | 226 | 50 | 0 (0 public) | - | 0 | - |
| 4984-5006 | Status and registry accessor | getStatus … registry | 23 | 0 | 2 (2 public) | getStatus | 0 | - |
| 5007-5350 | Hook and function registry | registerHook … triggerHooks | 344 | 6 | 16 (16 public) | registerHook, triggerHooks | 1 | - |
| 5351-5706 | Hook dispatch internals | hasHooksFor … assertBulkPerRowHookBudget | 356 | 61 | 7 (0 public) | - | 0 | - |
| 5707-5867 | Action registry and activation | registerAction … setActionActive | 161 | 19 | 10 (10 public) | - | 1 | - |
| 5868-6149 | Registered resolvers and write-gate probes | _heldFileResolver … registerInsertRecomputeListener | 282 | 116 | 6 (6 public) | - | 0 | - |
| 6150-6903 | Readable-ids security and permission/formula resolution | readableIdsSecurityReported … resolveDefaultPermissions | 754 | 546 | 15 (2 public) | - | 0 | - |
| 6904-7010 | Authz invalidation and middleware registration | writeEpoch … hasObjectMiddleware | 107 | 18 | 4 (4 public) | - | 0 | - |
| 7011-7246 | Execution plumbing (middleware, session, provenance, users) | executeWithMiddleware … buildUser | 236 | 37 | 7 (0 public) | - | 0 | - |
| 7247-7577 | Driver options and engine posture | buildDriverOptions … resolveEnginePosture | 331 | 209 | 6 (0 public) | - | 0 | - |
| 7578-7787 | Organization probe and system-insert organization | probeInstallOrganizations … transactionCoversDriverFor | 210 | 45 | 4 (0 public) | - | 0 | - |
| 7788-8153 | Field defaults | resolveNowDefault … defaultFieldEntries | 366 | 4 | 6 (0 public) | - | 0 | - |
| 8154-8766 | Autonumber | applyAutonumbers … seedAutonumber | 613 | 80 | 6 (0 public) | - | 1 | - |
| 8767-9431 | Package, app, plugin and driver registration | registrationConversionWarned … registerDriver | 665 | 170 | 6 (3 public) | registerApp, registerDriver | 0 | - |
| 9432-9640 | Datasource registry | supplyFileColumnsMovedResolver … listUnavailableDatasources | 209 | 1 | 8 (7 public) | - | 3 | - |
| 9641-9792 | Write guard and realtime publish | assertWriteAllowed … publishBulkDataEvent | 152 | 18 | 4 (1 public) | - | 0 | - |
| 9793-9891 | Validation-message i18n | setI18nService … objectDisplayLabel | 99 | 14 | 4 (1 public) | - | 0 | - |
| 9892-10984 | Referential integrity and master-detail resolution | assertReferencesResolve … masterDeclaredFields | 1093 | 429 | 12 (0 public) | - | 0 | - |
| 10985-11100 | Dangling-reference and cascade inspection | inspectDanglingReferences … inspectCascadeDelete | 116 | 48 | 2 (2 public) | - | 0 | - |
| 11101-11195 | Crypto and tenancy providers | setCryptoProvider … setTenancyPostureProvider | 95 | 20 | 4 (4 public) | - | 1 | - |
| 11196-11615 | Secret and internal-field handling | encryptSecretFields … resolveInternalField | 420 | 61 | 9 (3 public) | - | 0 | - |
| 11616-11684 | Schema lookup and filter judging | getSchema … judgeFilter | 69 | 48 | 3 (2 public) | - | 0 | - |
| 11685-11950 | Datasource routing | LIFECYCLE_DATASOURCE … setDatasourceMapping | 266 | 20 | 8 (3 public) | setDatasourceMapping | 0 | - |
| 11951-12118 | Lifecycle init and health | init … resolvePrimaryDatasource | 168 | 16 | 3 (3 public) | init | 0 | - |
| 12119-12192 | Media and value-shape presence | objectHasMediaField … valueShapeStrictFor | 74 | 13 | 4 (0 public) | - | 0 | mediaFieldPresence, coveredValueFieldPresence |
| 12193-12875 | Migration flags and attestations | isFileReferencesMigrationVerified … wasDatastoreCreatedFromEmpty | 683 | 81 | 17 (8 public) | - | 0 | - |
| 12876-12898 | destroy | destroy … destroy | 23 | 0 | 1 (1 public) | destroy | 0 | - |
| 12899-12917 | Expand/cascade limits (statics) | MAX_EXPAND_DEPTH … MAX_BULK_PER_ROW_HOOK_ROWS | 19 | 0 | 0 (0 public) | - | 0 | MAX_EXPAND_DEPTH, MAX_CASCADE_DEPTH |
| 12918-13368 | Roll-up summaries | autonumberCounters … recomputeSummaries | 451 | 0 | 7 (1 public) | - | 0 | - |
| 13369-13622 | Related-record expansion | expandRelatedRecords … expandRelatedRecords | 254 | 10 | 1 (0 public) | - | 0 | - |
| 13623-14066 | File-reference hydration | resolveFileReferences … readParentDerivedFiles | 444 | 310 | 5 (0 public) | - | 0 | - |
| 14067-14545 | Query lowering | resolveWhereTokens … requireFindOnePredicate | 479 | 272 | 9 (0 public) | - | 0 | - |
| 14546-15102 | find / findOne | find … staticReadonlyCreateStrip | 557 | 142 | 4 (2 public) | - | 0 | - |
| 15103-15760 | validate | validate … validate | 658 | 447 | 1 (1 public) | - | 0 | - |
| 15761-17107 | insert / insertMany | readUpdatePriorRow … insertMany | 1347 | 439 | 3 (2 public) | - | 1 | - |
| 17108-19041 | update | update … update | 1934 | 275 | 1 (1 public) | - | 0 | - |
| 19042-20582 | Delete cascade and reference walking | planCascadeAtomicity … organizationOwnedRowCounts | 1541 | 733 | 22 (1 public) | - | 0 | storedReferenceIncludes, remainderAfterMemberRemoval, referenceCheckContext, outlivesOrganization, keepsOrganizationReference, organizationCountContext |
| 20583-21152 | delete | delete … delete | 570 | 47 | 1 (1 public) | - | 0 | - |
| 21153-21772 | count / aggregate | count … aggregate | 620 | 236 | 3 (2 public) | - | 0 | - |
| 21773-22081 | execute and transactions | execute … enforceTransactionOrigin | 309 | 74 | 8 (2 public) | - | 0 | - |
| 22082-22447 | Compatibility API | registerObject … create | 366 | 41 | 16 (16 public) | - | 0 | - |

The per-method move screen for every section, and the full pricing, are in the project file pm-orders/server/25522-cut8-seam-table.md. A body stays if any of these holds: an inferred-return public method, a U site, a private-static read, an objectql/src/engine.ts#NAME pointer under packages/spec/** or docs/adr/**, a this.update( / this.insert( / this.delete( self-call, or a static. Bodies earlier cuts moved count as stubs, not as movable.

Pricing (net engine.ts lines): a stub costs a comment, the host literal's open and close and the .call, plus two lines per field read (a read* closure and a getter) and one per method read (a late-bound closure); a body that reads no member costs two; the import adds about three.

area 30-day lines paying bodies net why not / why
Compatibility API (this PR) 41 of 366 6 of 16 bodies, 116 body lines -70 measured the coldest section that pays; the six moved bodies carry 32 recent lines (31 in syncSchemas); no field writes, so one getter-only host; no packages/spec pointer
Execution plumbing 37 of 236 buildSession 43, buildProvenance 9, buildEvalUser 6, buildUser 8 (no member reads) about -55 pays less; the next candidate
Autonumber 80 of 613 101 body lines about -75 pays five lines more but holds twice the recent lines; #26026 edited this section during cut 7
count / aggregate 236 of 620 count 58, rejectCredentialAggregation 38 about -71 hot
Migration flags and attestations 81 of 683 8 bodies about -91 the section writes five fields, so its host needs setters (a seat ruling first, as cut 7 said)
Package registration, Referential integrity, File-reference hydration, Readable-ids, Delete cascade, Driver options, validate 170 to 733 161 to 469 -120 to -439 the hottest sections; the card says take the coldest

What stays in the section: getDriverByName (ADR-0096 cites it as engine.ts#getDriverByName); create (a static factory); createContext, which passes the engine itself to ScopedContext, a class engine.ts defines, so its body would need a value import of the engine (a run-time cycle); and unregisterObject, getObject, getDriverForObject, dropObjectSchema, datasource, on and close, whose stubs would cost as much as their bodies or more.

The shape (#23050 shape B, as cuts 1 to 7 apply it)

  • The class keeps all six methods with name, modifiers, signature, docblock and position. Each body is now one host literal plus fn.call(host, …), marked [#25522 cut 8]. All six are public with declared return types, so none is an inferred-return public member.
  • CompatibilityApiHost is new: _registry, drivers, hooks, logger, getDriverForObject, removeActionsByPackage, each typed as the class member (ObjectQL['_registry']). Each moved function types its this as the Pick of exactly the members its body reads, and each stub annotates its literal as ThisParameterType of that function. There is no cast, and no member changes visibility.
  • The four fields go as GETTERS, so each read happens when the body makes it. The two methods go as late-bound closures over the instance, so a double or spy set on the engine still intercepts (syncSchemas and syncObjectSchema call the public getDriverForObject, which a caller may override).
  • registerObject keeps its default parameter (packageId: string = '__runtime__') on both the method and the function; the stub passes the value it received.
  • Imports. The module imports ObjectQL as a TYPE only and nothing re-exports it. Its value imports are StorageNameMapping (@objectstack/spec/system) and isFederatedObject (./federated-object.js), the same bindings engine.ts uses; both still have readers in engine.ts, so its import list is unchanged apart from the new module import.

Net lines (the seat's rule)

engine.ts goes from 23,165 to 23,095 lines, net -70 (46 added, 116 removed). The module is 225 lines: the header and host interface (about 66), six one-line docblocks, and the 116 moved body lines with their signatures. With the two re-keyed rows of the reader pin, the diff is 391 changed lines over 3 files (+273 / -118), far under the 3,000-line human-merge threshold.

The published .d.ts does not change (ruling 6348891160)

Base: @objectstack/objectql built with engine.ts restored from 7111e14ac and the new module removed (tree only; restored with git checkout HEAD --, blob hashes compared, git status clean). Head: built at 9fce8d910. The head dist/index.mjs carries syncSchemas.call(host once and the base build has it zero times, so each leg built the source it names. All six declaration files are byte-identical, and equal to the hashes cut 7 recorded:

file sha256, base = head
core.d.ts 1d20303a455a909e4b55fd0802fb0b0bcb59ec51784daf27d5ef4c0659410953
index.d.ts 0454d5e70b156d8effbf27b8915587c7cbee241dcd7d698013c0a4c369a02aa5
util-CVzOGxAn.d.ts 85ef1cbec2b016d5f7afabaa21689c86c6dffc573076fdfdeb8ea0f1a1b1ad53
core.d.mts ef178bf0725eccc2f358f082ce13dc5122a6d5a53c19ef630017256f67de03b4
index.d.mts ccf900240aa137abe72f82b8abfc872d42c5645467400134c580285f2a3b3090
util-CVzOGxAn.d.mts 85ef1cbec2b016d5f7afabaa21689c86c6dffc573076fdfdeb8ea0f1a1b1ad53

Positive control: every moved member is public, so the control edits a moved member's published signature instead of its visibility: widening the stub getConfigs()'s declared return to a Record of ServiceObject | undefined (anchor landed once, 0 / 1 after) and rebuilding changed all six hashes and the chunk name (util-CPRlCSiG.d.ts 00b673476de74bfc…, index.d.ts 4097f6aa775e78e4…), and the widened type appears in the util chunk. Restored with git checkout HEAD --, blob hash compared, rebuilt, and all six files compared equal to the head build again. Export lists are the same for ESM and CJS at both ends: . 182 names (sorted sha256 881616cc17…) and ./core 54 (393e806906…). No moved name, and not CompatibilityApiHost, is exported.

Proof of move-only

A TypeScript-AST leaf-token compare (recursive getChildren, JSDoc skipped) of base engine.ts (7111e14ac) against the head module:

  • For each of the six, the parameters (less this, default value included), return type, type parameters and body tokens are SAME, async matches, and every body line equals the base line less two leading spaces, comments included: registerObject 72 tokens / 9 lines, getConfigs 57 / 8, introspectDatasource 58 / 8, syncSchemas 312 / 63, syncObjectSchema 117 / 17, removePackage 79 / 11.
  • Negative controls: flipping === 'function' to !== 'function' on the syncSchema probe in the moved syncSchemas reports DIFFER on its body tokens; editing only one comment in the moved syncObjectSchema fails the line rule. Both exit 1, and the module was restored from HEAD and its blob hash compared after each.
  • Class: 318 members at both ends, in the same order. 312 are byte-identical (full text, docblocks included), and the 6 stubs keep docblock, modifiers and signature byte-identical up to the body.
  • Top level: 230 of 231 base statements are byte-identical in head; the other is the class. Head adds the new module import with its comment.

Readers of the moved lines

  • Reader pin (migrated in this PR). packages/objectql/src/federated-injected-column-readers.test.ts keys every federated-predicate use in @objectstack/objectql's source as FILE#FUNCTION :: SEAM. The two schema-sync rows move from engine.ts#syncSchemas / engine.ts#syncObjectSchema to engine-compatibility-api.ts#syncSchemas / #syncObjectSchema, with the same disposition and reason. Control: with the base copy of the test restored over this head, it goes red naming exactly those two new keys (1 failed / 4 passed), so the pin does read the moved code; restored from HEAD, blob hash compared.
  • ADR anchors. No scripts/adr-anchors/ entry describes a moved body: the engine entry's one paragraph is the transaction seam, and its ids stay cited in engine.ts. So no entry is added. check-adr-anchors at base 7111e14ac: 89 anchored files, 1,881 decision-letter citations; at head: 89 anchored files, 1,881 decision-letter citations (resolving citations 59,157 → 59,159, the module header's two ADR ids). The moved bodies cite no decision letter.
  • No objectql/src/engine.ts#NAME pointer under packages/spec/** or docs/adr/** names the six. Prose that names a method with ObjectQL. or engine. (ADR-0015 on ObjectQL.syncObjectSchema, federated-object.ts, plugin.ts, error-code-ledger.zod.ts comments, the durability checker's syncObjectSchema vocabulary) still resolves, because every method stays on the class.
  • No gate baseline keys a moved body: durability-read-invention.baseline.json names referenceExists only, and query-options-erasure reports its key set unchanged with the file counts held. The tests that assert the moved bodies' runtime messages (external-write-gate.test.ts, schema-sync-durability-log-level.test.ts, sync-schemas-federated-object.test.ts) assert behaviour, not source text, and pass.

Acceptance notes

Verification

At 9fce8d910:

  • pnpm --filter @objectstack/objectql typecheck (tsc --noEmit + check:test-typecheck, 39 files / 233 errors / 64 pinned signatures held): VERDICT command-exit 0. pnpm exec eslint --no-inline-config packages/objectql: exit 0.
  • pnpm --filter @objectstack/objectql exec vitest run --project local --maxWorkers=2: 471 files, 8,774 tests passed (VERDICT command-exit 0). A focused verbose run of federated-injected-column-readers.test.ts, sync-schemas-federated-object.test.ts, schema-sync-durability-log-level.test.ts and external-write-gate.test.ts: 4 files, 28 tests passed.
  • Dependants: every changed member keeps its declaration and all six published .d.ts files are byte-identical, so no dependant can see a difference. CI's TypeScript Type Check covers them.
  • Gates at 9fce8d910: dispatch-gates --commands derived 62 families on the real diff. Every one was run, each exit code captured before any pipe, then reconciled with --ran: 62 accounted for, 61 run, 1 NOT MEASURED. NOT MEASURED (CI runs it): check:dual-build-cjs-loads, exit 3, PREREQUISITE NOT MET (it needs every package's dist/; the export lists above answer it for objectql). check:lean-entry-closure first exited 3 for want of objectql's dist/ and was re-run green after the head build (15 packages, the admitted set held). Named readings: check-system-context-census OK (151 read sites, 144 of 144 symbols cited), check:logger-receiver-detach OK (3,737 files, 0 detaches), check:durability-log-level exit 0, check:query-options-erasure exit 0 (key set verified, no files added), check-engine-split-ratio --days 90 97.6%.
  • Hand gates outside the derivation, all exit 0 at 9fce8d910: check-adr-anchors at base and head (above), check-adr-symbol-anchors (2,660 anchors resolve), check-tenant-audit-census (243 write call sites), check-nul-bytes, check-platform-checklist --changed-from origin/main (13 anchors judged, 0 lost) and check-commit-card-trailers --range origin/main..HEAD.
  • No ablation, because no tested behaviour changed. test:repo was not run locally; CI's Test Core runs it.

skip-changeset: move-only. The published .d.ts files and export lists are byte-identical, liveness/ and every other published path are untouched, and the module's runtime is the same code under a different file name.


Generated by Claude Code

…s into engine-compatibility-api.ts (#25522 cut 8)

registerObject, getConfigs, introspectDatasource, syncSchemas,
syncObjectSchema and removePackage move unedited into a new module; each
method keeps its name, signature, docblock and position and hands the body
the members it reads through CompatibilityApiHost. The federated
injected-column reader pin re-keys the two schema-sync rows to the module.

Claude-Session: https://claude.ai/code/session_012CWiXJotHHDyeTL3Hea2Ad
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 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/protocol/kernel/error-handling.mdx (via registerObject (symbol, a method of class ObjectQL; a top-level function))
  • content/docs/protocol/kernel/index.mdx (via syncSchemas (symbol, a method of class ObjectQL; a top-level function))
What this run could not see
  • 3 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 f143cd8809aa2f26e2a2d9bccd4a9b17ad51c07a → packageMentionDocs.

Which tree this was computed on

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

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

⚠️ 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 f143cd8809aa2f26e2a2d9bccd4a9b17ad51c07a → 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 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo · 2026-10-26T16:40Z · head 9fce8d910e6ce5cd3eb90f3154af2733f8f3ccf7 · #25522 cut 8

The maintainer's standing authorisation for landing reviewed PRs, verbatim: 「按照 pm-dispatch 规则复核过的都授权」.

  1. Shape: a draft against main. The body opens with Part of #25522 (⛔ not Fixes; the card stays open for later cuts). Clause-②: no and Metadata-protocol: none are line-initial. skip-changeset applies: the change is move-only. check-governed-merges --pr 26229: NOT governed, 391 changed lines.
  2. Premise measured: the claim 6419652034 asked for a seam table re-measured after cut 7; it is at pm-orders/server/25522-cut8-seam-table.md and in the PR body, and picks "Compatibility API", the area cut 7 proposed (engine.ts net −70). registerObject, getConfigs, introspectDatasource, syncSchemas, syncObjectSchema and removePackage move into engine-compatibility-api.ts through CompatibilityApiHost; each stub hands its body a getter-only host of exactly the members it reads, with methods delegated through this, so an override or a spy is still the one the body reaches. The seat compared every line removed from engine.ts with the new module after stripping indentation: each one is present there. The one path reader, federated-injected-column-readers.test.ts, re-keys its two schema-sync rows to the new module in the same PR (same disposition, same reason). No ADR anchor paragraph describes a moved body, so no anchor entry moves (89 files, 1,881 decision letters at base and head). The dev reports the objectql suite at 471 files / 8,774 tests green, the AST move proof 6/6 SAME with two negative controls, and six .d.ts byte-identical with a positive control.
  3. Gates: at this stamp the head's 52 check-runs read 36 success and 16 skipped (path-filtered), with none failing or in progress; mergeable, clean. The dev reports 61 of 62 derived gate families green locally, reconciled with --ran; the one not measured (dual-build-cjs-loads) is CI's.
  4. Accepted deviations: none beyond the series shape. The proposed next cut, "Execution plumbing" (about −55), is noted for cut 9.
  5. Out of scope: none filed.
  6. Landing: this seat runs pr_ready and then automerge_enable through the relay, confirms MERGED on both readings, and records the landing on [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 with a Release: back to pm:queue for cut 9.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 26, 2026 16:42
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 26, 2026 16:42
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 26, 2026
Merged via the queue into main with commit 43f1da0 Oct 26, 2026
53 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-4vp88a branch October 26, 2026 17:23
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 tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants