Skip to content

refactor(objectql): move the predicate-write hook dispatch bodies out of engine.ts into engine-hook-dispatch.ts (#25522 cut 6) - #26102

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-2f5vpq
Oct 26, 2026
Merged

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

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 6 of the packages/objectql/src/engine.ts split (#24586 ruling A, recorded in 6270097840). The claim is 6414562831. Four bodies of the "Hook dispatch internals" section move unedited into a new module, packages/objectql/src/engine-hook-dispatch.ts: buildPerRowAfterContexts, dispatchPerRowBeforeHooks, assertBulkPerRowHookBudget and inAfterAbortUnit. No hook behaviour changes. #25522 stays open for the later cuts.

Branch claude/project-thread-2f5vpq (the card thread's harness-pinned branch), cut from origin/main at 712770bee (after cut 5, 4bea75589f), with main merged in twice (be7897799, then aa2f8e31f, because dispatch-gates reported a stale gate script). Neither merge touched engine.ts.

Why this area (the fresh seam table)

Measured on origin/main 712770bee; engine.ts is byte-identical at aa2f8e31f. engine.ts is 23,351 lines, 7,317 of them (31.3%) from the last 30 days (git blame -s --since=2026-09-26T11:15Z). scripts/pm/git-history.mjs count (window covered, exit 0): 123 commits in 30 days, 31 in 7. class ObjectQL holds 318 members, 256 methods, 148 private or protected. Sections are cut 1's contiguous member ranges, re-located by first member name, docblocks included. "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
4750-4975 Instance state and constructor txStore … constructor 226 50 1 (1 public) - 0 -
4976-4998 Status and registry accessor getStatus … registry 23 0 2 (2 public) getStatus 0 -
4999-5342 Hook and function registry registerHook … triggerHooks 344 6 16 (16 public) registerHook, triggerHooks 1 -
5343-5819 Hook dispatch internals hasHooksFor … assertBulkPerRowHookBudget 477 53 7 (0 public) - 0 -
5820-5980 Action registry and activation registerAction … setActionActive 161 19 10 (10 public) - 1 -
5981-6262 Registered resolvers and write-gate probes _heldFileResolver … registerInsertRecomputeListener 282 116 6 (6 public) - 0 -
6263-7016 Readable-ids security and permission/formula resolution readableIdsSecurityReported … resolveDefaultPermissions 754 546 15 (2 public) - 0 -
7017-7123 Authz invalidation and middleware registration writeEpoch … hasObjectMiddleware 107 18 4 (4 public) - 0 -
7124-7359 Execution plumbing (middleware, session, provenance, users) executeWithMiddleware … buildUser 236 37 7 (0 public) - 0 -
7360-7690 Driver options and engine posture buildDriverOptions … resolveEnginePosture 331 209 6 (0 public) - 0 -
7691-7900 Organization probe and system-insert organization probeInstallOrganizations … transactionCoversDriverFor 210 45 4 (0 public) - 0 -
7901-8266 Field defaults resolveNowDefault … defaultFieldEntries 366 4 6 (0 public) - 0 -
8267-8877 Autonumber applyAutonumbers … seedAutonumber 611 78 6 (0 public) - 1 -
8878-9542 Package, app, plugin and driver registration registrationConversionWarned … registerDriver 665 170 6 (3 public) registerApp, registerDriver 0 -
9543-9751 Datasource registry supplyFileColumnsMovedResolver … listUnavailableDatasources 209 1 8 (7 public) - 3 -
9752-9903 Write guard and realtime publish assertWriteAllowed … publishBulkDataEvent 152 18 4 (1 public) - 0 -
9904-10002 Validation-message i18n setI18nService … objectDisplayLabel 99 14 4 (1 public) - 0 -
10003-11095 Referential integrity and master-detail resolution assertReferencesResolve … masterDeclaredFields 1093 429 12 (0 public) - 0 -
11096-11211 Dangling-reference and cascade inspection inspectDanglingReferences … inspectCascadeDelete 116 48 2 (2 public) - 0 -
11212-11306 Crypto and tenancy providers setCryptoProvider … setTenancyPostureProvider 95 20 4 (4 public) - 1 -
11307-11726 Secret and internal-field handling encryptSecretFields … resolveInternalField 420 61 9 (3 public) - 0 -
11727-11795 Schema lookup and filter judging getSchema … judgeFilter 69 48 3 (2 public) - 0 -
11796-12061 Datasource routing LIFECYCLE_DATASOURCE … setDatasourceMapping 266 20 8 (3 public) setDatasourceMapping 0 -
12062-12229 Lifecycle init and health init … resolvePrimaryDatasource 168 16 3 (3 public) init 0 -
12230-12303 Media and value-shape presence objectHasMediaField … valueShapeStrictFor 74 13 4 (0 public) - 0 mediaFieldPresence, coveredValueFieldPresence
12304-12986 Migration flags and attestations isFileReferencesMigrationVerified … wasDatastoreCreatedFromEmpty 683 81 17 (8 public) - 0 -
12987-13009 destroy destroy … destroy 23 0 1 (1 public) destroy 0 -
13010-13028 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
13029-13479 Roll-up summaries autonumberCounters … recomputeSummaries 451 0 7 (1 public) - 0 -
13480-13733 Related-record expansion expandRelatedRecords … expandRelatedRecords 254 10 1 (0 public) - 0 -
13734-14177 File-reference hydration resolveFileReferences … readParentDerivedFiles 444 310 5 (0 public) - 0 -
14178-14656 Query lowering resolveWhereTokens … requireFindOnePredicate 479 272 9 (0 public) - 0 -
14657-15213 find / findOne find … staticReadonlyCreateStrip 557 142 4 (2 public) - 0 -
15214-15871 validate validate … validate 658 447 1 (1 public) - 0 -
15872-17216 insert / insertMany readUpdatePriorRow … insertMany 1345 436 3 (2 public) - 1 -
17217-19148 update update … update 1932 272 1 (1 public) - 0 -
19149-20689 Delete cascade and reference walking planCascadeAtomicity … organizationOwnedRowCounts 1541 733 22 (1 public) - 0 storedReferenceIncludes, remainderAfterMemberRemoval, referenceCheckContext, outlivesOrganization, keepsOrganizationReference, organizationCountContext
20690-21259 delete delete … delete 570 47 1 (1 public) - 0 -
21260-21879 count / aggregate count … aggregate 620 236 3 (2 public) - 0 -
21880-22267 execute and transactions execute … enforceTransactionOrigin 388 63 8 (2 public) - 0 -
22268-22633 Compatibility API registerObject … create 366 41 16 (16 public) - 0 -

The per-method move screen for every section is in the project file pm-orders/server/25522-cut6-seam-table.md. A body stays if any of these holds: an inferred-return public method, a U site, a private-static read, an engine.ts#NAME pointer under packages/spec/** or docs/adr/**, or a this.update( / this.insert( / this.delete( self-call. The pick:

area 30-day lines movable why not / why
Roll-up summaries 0 of 451 46 body lines buildSummaryIndex is cited from packages/spec (functional-completeness.ts); recomputeSummaries self-calls this.update(; ensureSummaryIndexes writes three fields. Does not pay
Datasource registry 1 of 209 27 body lines unregisterDriver and clearDatasourceUnavailable are U sites (U = 3); registerDatasourceDef is cited from liveness/datasource.json. Does not pay
Related-record expansion 10 of 254 0 expandRelatedRecords reads the private static MAX_EXPAND_DEPTH and is cited from liveness/query.json and liveness/field.json
Migration flags and attestations 81 of 683 176 body lines recordObservedDeviation and retractCreationAttestation self-call this.update(; the rest write five fields, so the host needs setters, a shape no cut has used
Driver options, File-reference hydration, Referential integrity, Readable-ids 209 to 546 recent 161 to 438 the hottest sections; the card says take the coldest
Hook dispatch internals (this PR) 53 of 477 4 of 7 bodies, 141 body lines the coldest section with more than 100 movable lines; reads one field and no setter; no packages/spec or docs/adr pointer

Three bodies of the section stay in the class: hasHooksFor, opensAfterAbortUnit and dispatchUnscopedMultiWriteHooks. Each calls hookMatchesObject, a function engine.ts declares and exports at module level. Reaching it from the new module would be a value import of engine.ts, which would be the series' first run-time module cycle (every engine-*.ts module imports the engine as a type only).

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

  • The class keeps all four methods with name, modifiers, signature, docblock and position. Each body is now one host literal plus fn.call(host, …), marked [#25522 cut 6].
  • HookDispatchHost is new: _registry, triggerHooks, transaction, each typed as the class member (ObjectQL['triggerHooks']). 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.
  • _registry goes as a GETTER. triggerHooks and transaction go as late-bound closures over the instance, so a double or spy set on the engine still intercepts.
  • inAfterAbortUnit is generic, so its stub instantiates the function with the method's own type parameter T before .call(host, write). A bare .call would erase T to unknown. The emitted JS is a plain .call.
  • assertBulkPerRowHookBudget reads no member and is called directly.
  • Imports. The module imports ObjectQL as a TYPE only and nothing re-exports it. engine.ts drops the names whose last code reader moved: resolveBulkPerRowHookBudget, divergingHookPayloadKeys and MultiUpdateHookKeyDivergenceError. The last one is still named by a {@link} in the dispatchPerRowBeforeHooks docblock that stays, and that docblock goes to no published .d.ts, because private members print without JSDoc. SummaryRecomputeError, HookTargetRebindError, coerceBooleanFields, recordHookPayloadWrites and MAX_BULK_PER_ROW_HOOK_ROWS still have readers in engine.ts and stay.

Net lines (the seat's rule)

engine.ts goes from 23,351 to 23,234 lines, net -117. The module is 240 lines: the header and host interface (about 66), four one-line docblocks, and the 141 moved body lines with their signatures. The diff is 415 changed lines over 2 files (+269 / -146), 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 be7897799 and the new module removed (tree only; restored with git checkout HEAD --, then git status was clean). Head: built at 1b00a88a9. The second merge brought no package change. The head dist/index.mjs carries inAfterAbortUnit.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:

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 controls: (1) making dispatchPerRowBeforeHooks public in the source and rebuilding (an earlier base, 712770bee) changed all six hashes, and the method printed with its full signature at util-35eaTeZh.d.ts:5034. (2) Removing private from line 5063 of the head util-CVzOGxAn.d.ts (private dispatchPerRowBeforeHooks;) gives 47f9b025059291111682c59ff64f77688fd34cb0077bf8a753443bb6ce3a18d0. Export lists are the same for ESM and CJS at both ends: . 182 names (sorted sha256 881616cc…0adaa) and ./core 54 (393e8069…90f49). No moved name is exported. The same six-file comparison at 712770bee was also byte-identical.

Proof of move-only

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

  • For each of the four, the parameters (less this), 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: dispatchPerRowBeforeHooks 454 tokens / 103 lines, buildPerRowAfterContexts 165 / 17, inAfterAbortUnit 73 / 12 (type parameter T on both), assertBulkPerRowHookBudget 73 / 9.
  • Negative controls: flipping === to !== in the moved assertBulkPerRowHookBudget reports DIFFER. Editing only the // D4. comment in the moved dispatchPerRowBeforeHooks fails the line rule. Both exit 1.
  • Class: 318 members at both ends, in the same order. 314 are byte-identical (full text, docblocks included), and the 4 stubs keep docblock, modifiers and signature byte-identical up to the body.
  • Top level: 226 of 229 base statements are byte-identical in head. The other three are the class, the narrowed @objectstack/spec/data import and the removed multi-update-hook-key-divergence.js import. Head adds the new module import with its comment.

Readers of the moved lines

  • No path reader names the four. No engine.ts#NAME pointer anywhere in the repository names one. No scripts/adr-anchors/** paragraph describes them: the engine entry's paragraph is the transaction seam. No gate or source-reading test matches their text (screened: every scripts/ gate, docs/qa, content/docs, and the 14 test files that read engine.ts from disk).
  • packages/spec/liveness: 40 entries cite engine.ts, and every one of their keys is still mentioned in engine.ts outside the moved range, so the key-mention check loses nothing.
  • ADR anchors. The moved bodies carry no ADR-NNNN citation (the ADR-0058 and ADR-0119 D1 citations sit in the docblocks, which stay). check-adr-anchors counts the same at base and head: 88 anchored files and 1,864 decision-letter citations at 712770bee, and 88 and 1,878 at be7897799 against head 1b00a88a9. No anchor entry is needed.
  • Census and receivers. check-tenant-audit-census is green: 243 write call sites, and the moved bodies hold no this.FIELD.delete/insert/update( site. check:logger-receiver-detach is green (the moved bodies read no logger), and so is check-system-context-census.

Acceptance notes

Verification

Tests at 1b00a88a9, which has the same package sources as the final head 69d8f91a6 (the second merge touched only .github/, scripts/ and ui/):

  • pnpm --filter @objectstack/objectql typecheck (tsc --noEmit + check:test-typecheck, 39 files / 233 errors / 64 pinned signatures held): exit 0. eslint --no-inline-config packages/objectql: exit 0.
  • pnpm --filter @objectstack/objectql exec vitest run --project local --maxWorkers=2: 470 files, 8,748 tests, 8,748 passed, 0 failed, 0 skipped. The same suite was also green before the first merge (50dae828a: 470 files, 8,742 tests). The run includes bulk-write-per-row-hooks.test.ts, multi-update-hook-key-divergence.test.ts, engine-after-hook-abort-unit.test.ts and hook-exclude-objects.test.ts.
  • packages/core row-serving-door-exposure.pin.test.ts and second-object-read-exposure.pin.test.ts (both scan the repository for read doors): 2 files, 7 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 the final head 69d8f91a6: dispatch-gates --commands derived 56 families on the real diff. Every one was run, each exit code captured before any pipe, then reconciled with --ran: 56 accounted for, 55 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. Named readings: check-system-context-census OK (151 read sites, 144 of 144 symbols cited), check:logger-receiver-detach OK, check:durability-log-level OK, check-engine-split-ratio --days 90 97.6%.
  • Hand gates outside the derivation, all exit 0 at 69d8f91a6: check-adr-anchors at base aa2f8e31f and at head (88 files and 1,878 letters at both ends), check-adr-symbol-anchors (2,658 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

… of engine.ts into engine-hook-dispatch.ts

Move-only: buildPerRowAfterContexts, dispatchPerRowBeforeHooks,
assertBulkPerRowHookBudget and inAfterAbortUnit keep their methods,
signatures and docblocks on ObjectQL; each body now lives unedited in
engine-hook-dispatch.ts and is reached through HookDispatchHost
(_registry as a getter, triggerHooks and transaction as late-bound
closures). Imports whose last reader moved are narrowed.

Claude-Session: https://claude.ai/code/session_01VbCrrAuovPD2joHGR1XXRZ
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).

22 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: node scripts/docs-audit/affected-docs.mjs --json 0a6948210cc96a95cc568b30193895e157968c01.

⛔ 6 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails.

What this run could not see
  • 1 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 0a6948210cc96a95cc568b30193895e157968c01 → packageMentionDocs.

Which tree this was computed on

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

node scripts/docs-audit/affected-docs.mjs --json 0a6948210cc96a95cc568b30193895e157968c01

⚠️ 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 0a6948210cc96a95cc568b30193895e157968c01 → 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-26T12:38Z · head 69d8f91a606f91e09c252e40861a91da9b205000 · #25522 cut 6

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 26102: NOT governed, 415 changed lines.
  2. Premise measured: the claim 6414562831 asked for a seam table re-measured after cut 5. The dev posted it, and it is also at pm-orders/server/25522-cut6-seam-table.md. It picks "Hook dispatch internals", the coldest paying section (53 of 477 lines recent). The seat diffed the four removed bodies (buildPerRowAfterContexts, dispatchPerRowBeforeHooks, inAfterAbortUnit, assertBulkPerRowHookBudget) against engine-hook-dispatch.ts with comments and indentation stripped. Only the imports, the HookDispatchHost interface and the function signatures differ. The delegates build a ThisParameterType<…> host: a getter for _registry, and late-bound closures for triggerHooks and transaction. assertBulkPerRowHookBudget reads no member and is called directly. hasHooksFor, opensAfterAbortUnit and dispatchUnscopedMultiWriteHooks stay, since each would need a value import of hookMatchesObject back from engine.ts. The dev reports six .d.ts byte-identical with a positive control, ADR decision-letter counts equal at base and head, the objectql suite at 470 files / 8,748 tests green, and engine.ts net −117 lines.
  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.
  4. Accepted deviations: none beyond the series shape. The proposed next cut, "execute and transactions" (which owes an anchor entry), is noted for cut 7.
  5. Out of scope: none filed.
  6. Landing: once every check is green, 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 7.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 26, 2026 12:40
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 26, 2026
Merged via the queue into main with commit 3380671 Oct 26, 2026
53 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-2f5vpq branch October 26, 2026 13:02
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