Repository navigation
refactor(objectql): move the package registration bodies out of engine.ts into engine-package-registration.ts (#25522 cut 17) - #26881
Conversation
…e.ts into engine-package-registration.ts The bodies of ObjectQL#convertPackageBodyForward, #resolveNavObjectNames and #registerPlugin move unedited into engine-package-registration.ts behind PackageRegistrationHost; the class keeps each method's signature, docblock and position. stampPackage and stampObjectPackage, which registerApp and registerMetadataCollections still read, gain export in place and are imported back, never copied. Claude-Session: https://claude.ai/code/session_01FEkQ5psvNaMgx2AgmL3NgA Co-authored-by: Claude <noreply@anthropic.com>
…ported metadata-core Keeps the evaluation order of every external package as it was in the ESM bundles (the module brings the only metadata-core import engine.ts had). Claude-Session: https://claude.ai/code/session_01FEkQ5psvNaMgx2AgmL3NgA Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
What this run could not see
Coarse fallback — 19 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 0514c3ad6440c509247d70b731b2e1fd0853b8a3 && git checkout 0514c3ad6440c509247d70b731b2e1fd0853b8a3
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 1a8b7ebef23aefacc78f5ed0f1850ba9fe6f59dc 1e7a0e96fe6b004796be314008b5972bd2292c6f && git checkout -B drift-repro 1a8b7ebef23aefacc78f5ed0f1850ba9fe6f59dc && git merge --no-ff 1e7a0e96fe6b004796be314008b5972bd2292c6f
node scripts/docs-audit/affected-docs.mjs --json 1a8b7ebef23aefacc78f5ed0f1850ba9fe6f59dc
|
席位核对ACCEPT · The maintainer's standing authorisation for landing reviewed PRs, verbatim: 「按照 pm-dispatch 规则复核过的都授权」.
Generated by Claude Code |
Requested by Leehom · project thread
Part of #25522
Clause-②: no
Metadata-protocol: none
Ruling-ref: 6348891160 + 6441032442
维护者速读
engine.ts里包注册区的三个方法体(convertPackageBodyForward注册门的协议前向转换、registerPlugin嵌套插件注册、resolveNavObjectNames导航对象名解析)原样搬进新文件engine-package-registration.ts;类上的方法签名、注释、位置不变,方法体换成转交。两者与留下的registerApp共用的stampPackage/stampObjectPackage原地加export、由新文件导入(不复制)。engine.ts21,733 → 21,661 行。src/engine.ts(23,903 lines, +7,501 in 30 days) along itsObjectQLseams, one move-only slice per PR #25522 按缝拆分engine.ts的第 17 刀。本区原定价 −233,但 feat!: ownership queues and assignment rules (ADR-0142 phase 2) #26337 落地时在packages/spec/liveness/里把engine.ts#registerMetadataCollections登记为生产者(18 处),它按系列规则留在原文件;剩下可搬的三个方法重定价 −75,仍高于 −30,按派单取本区。.d.ts六个文件与基线逐字节相同(含正控);运行期导出名单相同;构建产物里只多出新文件一个区段,外部包的导入顺序一条不差(新文件在engine.ts原先导入@objectstack/metadata-core的位置导入);一次性晚绑定探针在新旧两版构建产物上逐行一致。回滚 = revert 本 PR。packages/objectql/src/engine-package-registration.ts(三个函数与PackageRegistrationHost)、packages/objectql/src/engine.ts里三个转交桩、新的导入行与两处原地export。pnpm --filter @objectstack/objectql exec vitest run --project local --maxWorkers=2 src/engine-nested-plugin-collections.test.ts src/registry-installed-package-retired-page-declarations.test.ts,应见两个文件全部通过(嵌套插件注册与注册门前向转换各自的测试)。Cut 17 of the
packages/objectql/src/engine.tssplit (#24586 ruling A, recorded in6270097840), under the claim6450667239. Three bodies of the "Package, app, plugin and driver registration" section move unedited into a new module,packages/objectql/src/engine-package-registration.ts, behindPackageRegistrationHost:convertPackageBodyForward(ADR-0087 D2's forward conversion at the package registration door),registerPlugin(a nested plugin's objects, plugin-as-app and stack collections, registered under its parent package) andresolveNavObjectNames(the navigationobjectNameresolution). No behaviour changes. Every published declaration file is byte-identical to the base. #25522 stays open for the later cuts.Branch
claude/project-thread-y39a3j(the card thread's harness-pinned branch), cut fromorigin/mainate1bfde3601, which contains cut 16's merge (d8b943b620, #26792) and #26337.What changes
Why this area, and why it now pays -75 and not -233
Re-measured on
e1bfde3601with cut 11's measure script and cut 14's price step (price3.mjs), both unchanged.engine.tsis 21,733 lines, 6,745 of them from the last 30 days (git blame --since=2026-09-27T18:45Z, clone deepened to 2026-09-21 first);class ObjectQLholds 324 members, 259 methods and accessors. Query-options erasure sites: 8 at base (lines 8372, 9690, 9936, 10000, 10332, 13612, 13911, 18522), none in this area.Cut 16's table priced the section at -233 with four bodies,
registerMetadataCollections(166 body lines) the largest. #26337, the PR that held the section out, landed with 18 producer pointerspackages/objectql/src/engine.ts#registerMetadataCollectionsinpackages/spec/liveness/queue.json(6) andassignment_rule.json(12). A body named by anengine.ts#NAMEpointer underpackages/specstays in this series, and the claim forbidspackages/spec/**edits, soregisterMetadataCollectionsstays, and with itMETADATA_ARRAY_KEYS,resolveMetadataItemNameandpermissionSetOwnerRegistrationRefusal(its helpers) and thecheck-stack-collection-maps.mjsrow that namesMETADATA_ARRAY_KEYSinengine.ts.registerAppandregisterDriverstay as the order says (public, inferred return type). The other three re-price at -75. That still pays more than -30, so under the order this cut takes the section rather than the fallback (Delete cascade and reference walking, -124). It is also the colder of the two: 36 of 98 body lines from the last 30 days, against 128 of 167.Seam table on
e1bfde3601(43 sections ofclass ObjectQL; U = untyped receivers)txStore…constructorgetStatus…registryregisterHook…triggerHookshasHooksFor…assertBulkPerRowHookBudgetregisterAction…setActionActive_heldFileResolver…registerInsertRecomputeListenerreadableIdsSecurityReported…resolveDefaultPermissionswriteEpoch…hasObjectMiddlewareexecuteWithMiddleware…buildUserbuildDriverOptions…resolveEnginePostureprobeInstallOrganizations…transactionCoversDriverForresolveNowDefault…defaultFieldEntriesapplyAutonumbers…seedAutonumberregistrationConversionWarned…registerDriversupplyFileColumnsMovedResolver…listUnavailableDatasourcesassertWriteAllowed…publishBulkDataEventsetI18nService…objectDisplayLabelassertReferencesResolve…masterDeclaredFieldsinspectDanglingReferences…inspectCascadeDeletesetCryptoProvider…setTenancyPostureProviderencryptSecretFields…resolveInternalFieldgetSchema…judgeFilterLIFECYCLE_DATASOURCE…setDatasourceMappinginit…resolvePrimaryDatasourceobjectHasMediaField…valueShapeStrictForisFileReferencesMigrationVerified…wasDatastoreCreatedFromEmptydestroy…destroyMAX_EXPAND_DEPTH…MAX_BULK_PER_ROW_HOOK_ROWSautonumberCounters…recomputeSummariesexpandRelatedRecords…expandRelatedRecordsresolveFileReferences…readParentDerivedFilesresolveWhereTokens…requireFindOnePredicatefind…staticReadonlyCreateStripvalidate…assignmentreadUpdatePriorRow…insertManyupdate…updateplanCascadeAtomicity…organizationOwnedRowCountsdelete…deletecount…aggregateexecute…enforceTransactionOriginregisterObject…createThe per-member screen and the full price output are in the project files,
pm-orders/server/25522-cut17-seam-table.md. (The seam script's section boundary aftervalidatenow lands on an orphaned docblock, so its "validate" row readsvalidate…assignment; the member screen is unaffected.)fe53769a8e, -75 re-priced, -72 landedconvertPackageBodyForward28 body lines,resolveNavObjectNames15,registerPlugin55;registerMetadataCollectionsstays, pointed at frompackages/spec/liveness/)resolveFormulaRelatedThe shape
PackageRegistrationHostmembers it reads, plus a.call, marked[#25522 cut 17], as cuts 8 and 10 to 16 did. Fields go as getters over areadXclosure (registrationConversionWarned,logger,_registry); methods go as late-bound closures (resolveNavObjectNames,registerMetadataCollections), so a spy or double set on the engine is still the one a call reaches.resolveNavObjectNamesreads no member, so its stub calls the function directly. No body assigns a field (registrationConversionWarned.add(mutates the set the getter returns, the same object), so there is no setter.convertPackageBodyForwardis public with a declared return type (any);registerPluginandresolveNavObjectNamesare private, so their.d.tsline isprivate NAME;either way. No moved body has athis.FIELD.delete/insert/update(site, a private-static read, a self-call toinsert/update/delete, anengine.ts#NAMEpointer or an ADR anchor paragraph of its own.registerPluginreads two top-level helpers, both also read by bodies that stay:stampObjectPackage(registerApp) andstampPackage(registerApp,registerMetadataCollections,stampObjectPackage). Both gainexportin place, byte for byte otherwise (leading docblocks included), and the module imports them as values from./engine.js; nothing is copied. Measured alone before the move (dts-export-variant-cut17.sh, base engine.ts plus theexport, no move): each export and both together leave all published declaration files byte-identical.index.tsandcore.tsname their exports singly, so nothing new is published.engine.tsand the module import each other. The module runs nothing at evaluation (declarations only). The movedconvertPackageBodyForwardwasengine.ts's only reader of@objectstack/metadata-core, so that import line leavesengine.tswith it. The first build imported the module after./engine-validate.js(the cut-16 position); that kept the internal module order but moved@objectstack/metadata-core's first import in the ESM bundles three externals later (after@objectstack/metadata/view-container,ajv,ajv-formats). So the module is imported exactly whereengine.tsimported@objectstack/metadata-core. The module's other imports (./registry.js,./engine.js, a type from@objectstack/spec/data) are already loaded by then: the bundles placeregistry.tslong before that region. Measured on the built bundles (bundlecmp.py;index.mjs,core.mjs,index.js,core.js): with the// src/engine.tsmarkers set aside (9 at base, 10 at head, because the new region splits one), the// src/...region order at head equals the base's with one line added,// src/engine-package-registration.ts, inside theengine.tsregion where the import sat. Every externalimportstatement (113 and 96 in the ESM bundles) and everyrequire(call (148 and 130 in the CJS bundles) is identical and in the same order. The late-binding probe answers the same on base and head (Tests).ServiceObject(type),applyArtifactForwardConversionsandresolveDeclaredRange(@objectstack/metadata-core),computeFQN(./registry.js),stampObjectPackageandstampPackage(values) andObjectQL(type) from./engine.js.engine.tsloses the@objectstack/metadata-coreimport line (its last reader moved) andcomputeFQNfrom the./registry.jsline (likewise).registerApp,registerMetadataCollectionsandregisterDriverstay, and how the helpers were handled.Net lines (the seat's rule)
engine.tsgoes from 21,733 to 21,661 lines, net -72 (30 added, 102 removed). The module is 192 lines. The diff againstorigin/mainis 324 changed lines over 2 files (+222 / -102).Readers of the moved lines
engine.tspath. Searched:engine.ts#NAMEandengine.ts … NAMEspellings of all three methods, the two helpers,registrationConversionWarned,applyArtifactForwardConversions,resolveDeclaredRangeandcomputeFQNunderpackages/**,scripts/**,docs/**andcontent/**: none. The prose mentions found (packages/cli/src/**comments,docs/qa/platform-checklist/areas/platform-core.json, ADR-0029 line 559) nameregisterApp,registerMetadataCollections,METADATA_ARRAY_KEYSorcomputeFQN's behaviour, not a moved body.scripts/check-stack-collection-maps.mjs'sMETADATA_ARRAY_KEYSrow readspackages/objectql/src/engine.ts, where the constant stays (it isregisterMetadataCollections' helper), so it does not move. The gate is green at head.canReadObject((core'srow-serving-door-exposure.pin.test.tsis unchanged), noreferenceTargetOf((second-object-read-exposure.pin.test.tsis unchanged), noisFederatedObject/resolveTenantFieldName(federated-injected-column-readers.test.tskeys none), and read noisSystem(system-context.mdxis unchanged; its census is green). They hold noquery-options/no-any-erasuresite and no tenant-audit untyped receiver.engine.tsentry is the transaction-seam paragraph), so the module needs no anchor entry of its own.src/protocol.ts(33,065 lines, +10,169 in 30 days) along itsObjectStackProtocolImplementationseams, one move-only slice per PR #25467).check-durability-degradation-log-level --listat base and head: identical once line numbers are masked (164 lines: 48 durability seams and 88 read seams, the same entries); none of the moved names appears.check-adr-anchorsat basee1bfde3601(clean detached worktree): 1,898 decision-letter citations on the anchored surface, 59,997 resolving citations across 8,409 files. At head: 1,898, 59,998 across 8,410 (the new module: one more file, and the header'sADR-0087 D2). The moved bodies cite ADR-0087, ADR-0010 and ADR-0122 without a decision letter, so no letter leaves the anchored surface.Why
#25522 splits
engine.tsone seam at a time so that a change to one area reads, reviews and conflicts as that area alone. The registration section was next in cut 16's table and was held out only for #26337, which has landed. 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, and no test reads a moved line by path.
Public
.d.ts: byte-identical (ruling6348891160item 1), with the6441032442report block and a positive controlBuilt
@objectstack/objectqlat the base (e1bfde3601:engine.tsblobfa37297312da, noengine-package-registration.ts) and at head (engine.tsblobf9aa217bc55d), each from a cleansrc/(dts-cut17.sh: the base leg restores all ofsrc/from the base and deletes the module; both legs check the blob). The builds are the moved code, not a stale cache:convertPackageBodyForward.call(hostoccurs 0 times in the basedist/index.mjsand once in the head's.Every declaration file is raw byte-identical base to head, so
6348891160item 1 holds without any normalisation, and no chunk is renamed (util-DdsJlVTFat both). The6441032442block, for the record (normaliserpm-orders/server/evidence/25522/dtsnorm.mjs, sha25625226e0677bdad24726e9eff76a7e247bf7319440d2430d28cbaab0db6add94b, run asnode dtsnorm.mjs --diff BASE_FILE HEAD_FILE):core.d.ts642b5a3662c27aabde2dae4bb5877f515cb89f4c1e8075f21c0598b7e602520640e2fde86719d3ccd1cf492314c426c977ab836a5ab54580800cd1f41352247a4450aaf478092516…(1 decl) EQUALcore.d.mts07f5718a09a2662c2f94bc3d79a8e74b67310efa82071a5d81ed1b716adaa69c171eab8743fd8dfabc014a162c40c3e034be29f262b26a2bcc24cb3e06be04594450aaf478092516…EQUALindex.d.ts6dd970eb9c7dc4364e2fe99d22460672edc270302287f812231d8230904911222bb6a21a929b41c8dbb85c72c600f87ed3a3af12ca731d1cace61f5d4aa3d57e9136189ce4d0aba3…(103 decls) EQUALindex.d.mts37153868b48bef0e9ad655d74b549a30f51510977cb704e0d6624db1d8e83781c7d7bab765f3b0fb35241fa03bd0b716a93139c98e5638d209379dad96528f989136189ce4d0aba3…EQUALutil-DdsJlVTF.d.ts856d98e0e45ced3ec15bf72a1ac09420a2c4f73b5165ab598c1d7d0000705f02a4372dd015163a46e90b82473d806423a5ca982b8bef21e6e8bfed2b0655b9dd71a464127e0b90b1…(173 decls) EQUALutil-DdsJlVTF.d.mts856d98e0e45ced3ec15bf72a1ac09420a2c4f73b5165ab598c1d7d0000705f02a4372dd015163a46e90b82473d806423a5ca982b8bef21e6e8bfed2b0655b9dd71a464127e0b90b1…EQUALstatements only in base: 0; only in head: 0, declared-surface digest EQUAL. (b) Every normalised sha256 EQUAL. (c) Specifier sets EQUAL; the run-time export lists are too (index182 names andcore54, ESM and CJS, the same sorted list at base and head). (d) Raw diff: 0 lines in every file; the same 14 files indist/at both. (e) After the head build, the fullturbo run build(116 of 116 tasks, the dependents' DTS builds included) andpnpm --filter @objectstack/core typecheckran on the headdist/: exit 0 each.packages/objectql/package.jsonexportsnames./dist/index.*and./dist/core.*only,driver-sql's./dist/index.*only; (P3)git grep -n -E 'objectql/dist|driver-sql/dist' -- scripts package.json: 0 hits.dts-export-variant-cut17.sh, baseengine.tswith onlyexportadded):none,stampObjectPackage,stampPackage, and both together all print the sameutil-DdsJlVTF.d.ts,index.d.ts6dd970eb9c7d…andcore.d.ts642b5a3662c2….Positive control. On this head, one
seddroppedprivatefromprivate registerPlugin((a moved member's stub; anchor count 1 to 0, replacement count 0 to 1;engine.tsblobf9aa217bc55dto7c36c1c279c1) and rebuilt (posctl17.sh, build exit 0). The chunk is renamedutil-Xhg7Kcdwand now publishesregisterPlugin(plugin: any, parentId: string, parentNamespace?: string, parentVersion?: string): void;(line 7555); its normalised sha256 is668033198231cb9bda8545cd23975b0ce61c92a81952ef2dc84f8f692e694852≠a4372dd0…, its declared-surface digesta2448d3c517a96ad…≠71a464127e0b90b1…(thedeclare class ObjectQLstatement named as the one changed), and the rawcore.d.ts(d1b150bdbefd…) andindex.d.ts(ac50bb3fc445…) change with the chunk name.index.d.tsnormalises EQUAL under the control (an entry only re-exports), which is why every declaration file is read. The restore leg put the blob back tof9aa217bc55d(git diff HEADempty), and@objectstack/objectqlwas rebuilt and its chunk compared equal to the head build before anything else readdist/.AST compare (move-only)
astcmp.mjs(TypeScript compiler API, comments and whitespace ignored, tokens compared) on baseengine.tsagainst headengine.tsplus the module:e1bfde3601(parameters, return type,async, body tokens, and every body line equal after one level of indent):convertPackageBodyForward309 tokens / 28 lines,resolveNavObjectNames122 / 15,registerPlugin367 / 55.class ObjectQL: 324 of 324 members kept, in the same order; 321 byte-identical, and the 3 stubs keep docblock, modifiers and signature identical.exportcmp.mjs): the@objectstack/metadata-coreimport, moved verbatim to the module; the./registry.jsimport, which losescomputeFQN;stampPackageandstampObjectPackage, exported in place with statement and leading docblock otherwise identical; and the class. The head adds one statement: the module import.Load order (base and head bundles)
bundlecmp.pyon the four built bundles.// src/engine.tsmarkers set aside (9 at base, 10 at head: the new region splits one), the region order at head is the base's plus// src/engine-package-registration.ts, everything else in order (index.mjs98 to 99 regions,core.mjs87 to 88,index.js99 to 100,core.js88 to 89). The external module statements are identical and in the same order: 113importstatements inindex.mjsand 96 incore.mjs, 148require(calls inindex.jsand 130 incore.js. The first build of this cut, with the module imported after./engine-validate.js, kept the region order but printedengine.ts's@objectstack/metadata-coreimport (now the module's) 41 statements later in the ESM bundles, after@objectstack/metadata/view-container,ajvandajv-formats; the second commit moves the import to the line whereengine.tsimported@objectstack/metadata-core, which closes that.Late-binding probe (base and head
dist)zz-probe-cut17.mjs(a one-off, not committed; in the project files) loads the builtObjectQLand drives the three moved bodies with doubles set on the instance after construction. Cases:convertPackageBodyForwardon a non-object, a number and an array (returned as is); on a body with no declared range (the same reference back); on HotCRM 4.0.1's published body fromsrc/__fixtures__/hotcrm-4.0.1-published-pages.artifact.json(pages converted, fourwarnlines, the second call warns nothing and returns a new body); withloggerreplaced after construction (the replacement warns); withregistrationConversionWarnedreplaced after construction by a set that already holds one pair (that pair is not warned again, and the replacement set is the one filled).resolveNavObjectNameson nested navigation and on an app with none (the same reference).registerPluginwith array objects, navigation and anactionscollection (objects stamped with the parent's id and version, the plugin-as-app registered,resolveNavObjectNamesandregisterMetadataCollectionsreached through spies set on the instance); with map objects and no version; with a registry that throws on objects and on the app (bothwarnlines); with_registryandloggerreplaced after construction; with both host methods replaced by doubles; andregisterAppreaching a nested plugin through the real registry. The 42 output lines are identical on basee1bfde3601and head (the 15 construction log lines, which carry timestamps, set aside); stderr is identical too.Suites
Under
scripts/pm/os-verify-lock.shon head1e7a0e96f:turbo run build(the rootbuildfilters): 116 of 116 tasks, exit 0.typecheckof@objectstack/objectqland@objectstack/core: exit 0 each.@objectstack/objectqlvitest--project local: 475 files, 8,843 tests passed, exit 0 (engine-nested-plugin-collections.test.ts,engine-capability-provenance.test.tsandregistry-installed-package-retired-page-declarations.test.ts, which drive these bodies, among them).packages/*/vitest.repo-tests.jsonproject: core 6 files / 83 tests, objectql 1 / 5, rest 5 / 280 passed and 18 skipped, runtime 3 / 947, spec 80 / 1,295, types 1 / 11. Exit 0 each.Verification
Head
1e7a0e96fe6b004796be314008b5972bd2292c6f. The gate list isnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon this diff at that head (48 commands, merge basee1bfde3601), each run with its exit code captured before any pipe, then reconciled with--ran.--ran: 48 run, 0 NOT-MEASURED, 0 UNRUN.check:dual-build-cjs-loadsandcheck:dts-closureran after the full build;check-plugin-teardown-shape --self-testafter fetching621a4876and deepening the clone. The exit codes are inpm-orders/server/evidence/25522/cut17-ran-final.txt.node scripts/check-adr-anchors.mjs(counts above),node scripts/check-tenant-audit-census.mjs,node scripts/check-adr-symbol-anchors.mjs,node scripts/check-platform-checklist.mjs --changed-from origin/main,node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD,node scripts/check-system-context-census.mjs,node scripts/check-nul-bytes.mjs,node scripts/check-durability-degradation-log-level.mjs --list(base and head identical, masked), and eslint aspnpm lintruns it (--no-inline-config) onpackages/objectql.Acceptance notes
6450667239named this branch. The branch isorigin/mainate1bfde3601plus two commits.packages/objectql/**,scripts/check-stack-collection-maps.mjsor the two liveness files, listed at start (each head fetched,git diff --name-only origin/main...pr/N) and again just before opening this. At start: none touchedengine.ts. Before opening: fix(objectql)!: a restrict reference refuses the delete of the record it protects even when the referencing row also cascades from it (#26718) #26864 now editsengine.tsin the delete-cascade section (hunks at lines 4518 and 18680 to 19416) and feat(spec): a hook declares its refusal catalogue, and its body refuses by code, answered in the caller's language #26831 editsengine-execution-plumbing.ts; neither touches this area, the two helpers or the import lines, andgit merge-treeof this head with fix(objectql)!: a restrict reference refuses the delete of the record it protects even when the referencing row also cascades from it (#26718) #26864's head and withorigin/main20457f6f9exits 0. Whichever lands second mergesmain.registerMetadataCollectionsa named producer inpackages/spec/liveness/queue.jsonandassignment_rule.json(engine.ts#registerMetadataCollections, 18 rows). Moving it would mean re-keying those rows, apackages/specedit this claim forbids, so it stays. Should a later card re-key them,registerMetadataCollections(about -150) and its three helpers can follow this module as their own cut../engine-validate.js). Measured, that moved the first@objectstack/metadata-coreimport in the ESM bundles three externals later; the second commit moves the import line so the external order is identical (Load order, above). Both commits are in the PR so the measurement can be re-run on either.registrationConversionWarned,loggerand_registryas getters, so a body reads whatever the instance holds when it reads it: the probe replaces each after construction and sees the moved bodies use the replacements. No body assigns a field, so there is no setter.PackageRegistrationHostis the series' shared paragraph, word for word as onValidateHost. The movedregisterPluginbody's comment "the manifest map branch above" now points across files; it is moved verbatim, not edited. ADR-0029 line 559 sayscomputeFQNlives inengine.ts; it has lived inregistry.tssince before this cut, anddocs/adr/**is outside this claim.Human Minimum
packages/specholds no runtime logic. (Not touched.)PackageRegistrationHost,engine-package-registration.ts).pnpm lintpasses on the touched package.main, one pull request.skip-changeset; both declaration lines are filled in above.packages/specnot touched.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.skip-changeset: move-only inside@objectstack/objectql, with every published declaration file byte-identical and no behaviour change, so there is nothing for a release note to say.🤖 Generated with Claude Code
https://claude.ai/code/session_01FEkQ5psvNaMgx2AgmL3NgA