Skip to content

[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

Open

Description

@objectstack-fleet

Filing gate ③: a task the maintainer dispatched, quoted below. Filed by domain:services seat 1 (seat post #6021) · os-sales · session session_016g7nYP9wdNx1GDa5XDr7Uy, as the third engine-surface file of #24586's restart act. #25467 (protocol.ts) went first as the ruling orders, and its cut 1 landed in PR #25494. ⛔ Not a claim.

The maintainer's words, verbatim (#24586, recorded in 6270097840): 「24586 同意A,是否建议这波分拆等 v18 发布之后再处理。」 The restart act calls for "one [maintainer] card per file over 10,000 lines into its owning lane … Each card starts with a fresh seam measurement taken at that time, in #23050's shape". Triage read the restart condition as true in 6291735609.

Reader who acts: the domain:server lane, engine surface. One dispatch per slice. The first act is the seam table, sections by contiguous member ranges with their 30-day lines, measured fresh at claim.

Measured (on origin/main 842a0aef9d, 2026-10-23)

  • Size and churn:
    • 23,903 lines, up from 16,402 thirty days ago (dabf8d795e), a gain of +7,501 (+45.7%).
    • 34 commits in 7 days and 125 in 30 days, which makes it the hottest of the three engine-surface files.
    • git blame --since=2026-09-23T15:00Z attributes 8,337 lines (34.9%) to the last 30 days.
  • Structure:
    • One ObjectQL class of 18,214 lines with 254 methods: 147 private or protected, 107 public.
    • 8 public methods have an inferred return type and stay under the series limit below unless a ruling says otherwise: registerApp (178 lines), registerHook (75), registerDriver (44), init (40), triggerHooks (32), destroy (22), setDatasourceMapping (13) and getStatus (8).
    • The rest is the module preamble and the helpers.
  • What reads it by path:
    • the ADR anchor file scripts/adr-anchors/packages__objectql__src__engine.ts.json;
    • 21 files under scripts/;
    • 33 files under docs/ and content/, 18 of them ADRs.
  • In flight: none of the 13 open PRs touch the file today. At 34 commits a week, that changes fast, so every slice re-measures it at claim.

The ask (from #24586's ruling and #23050's shape, as on #25467)

  1. Split along the existing seams, one area per PR. Each slice is move-only: no logic changes.
  2. Shared state stays explicit. Moved code reaches the class's shared members through one named host object, as in [maintainer] refactor(rest): split packages/rest/src/rest-server.ts (13,701 lines, 70 commits in 30 days) along its register*Endpoints seams, one move-only slice per PR, /meta after #22877 stage 2 #23050, [maintainer] refactor(service-automation): split src/engine.ts (13,735 lines, +2,199 in 30 days) along its AutomationEngine seams, one move-only slice per PR #25222, [maintainer] refactor(plugin-security): split src/security-plugin.ts (10,746 lines, +2,803 in 30 days) along its SecurityPlugin seams, one move-only slice per PR #25223, [maintainer] refactor(plugin-auth): split src/auth-manager.ts (10,338 lines, +1,867 in 30 days) along its AuthManager seams, one move-only slice per PR #25224 and [maintainer] refactor(metadata-protocol): split src/protocol.ts (33,065 lines, +10,169 in 30 days) along its ObjectStackProtocolImplementation seams, one move-only slice per PR #25467.
    • ⛔ Not a second copy of a helper.
    • ⛔ Not a re-derivation.
  3. Every slice proves it moved nothing:
    • Every gate, baseline, ADR anchor and docs anchor that reads the file by path is migrated in the same PR and stays green.
    • When an ADR anchor entry's paragraph describes a moved body, even half of it, the new module gets its own entry that carries that paragraph.
    • The package's public .d.ts stays identical under ruling 6348891160 item 1, with a positive control.
    • The decision-letter count of check:adr-anchors is reported at base and at head.
    • ⛔ A gate whose target moved must not go silently empty.
  4. Serial with the file's in-flight PRs. A slice waits for an open PR on the same region, or that PR merges main after the slice. Every slice measures the file's open PRs again at claim.
  5. ⛔ No new gate.

Series limits already measured (carry them forward)

Order and pace

Not in this card

  • Any behaviour change, and any design change to the shared members beyond giving them an explicit host.
  • driver-sql/src/sql-driver.ts, filed beside this one as its own card.

Dedupe

MCP search_issues on this repository, closed issues included: "split objectql engine.ts or sql-driver.ts move-only cut ruling 24586". There were 113 hits. None is a split card for objectql/src/engine.ts. The related ones are #24586 (the ruling), #25467 (protocol.ts), and #25222, #25223 and #25224 (the services files). New.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01JVTd3PprStGa26aez5omLB
    Account: sunhaolin (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-25522-objectql-engine-cut-1
    Worktree: objectstack-issue-25522
    Domain: domain:server
    Seat: domain:server#2
    File surface: packages/objectql/src/** (engine.ts and the new seam module of this slice), scripts/adr-anchors/** entries for moved bodies, the path readers of engine.ts under scripts/ and content/ that the slice must migrate, one changeset. ⛔ No docs/adr/** (governed) (stop on breach; explain in the report)
    Container & model: M (one move-only slice plus the seam table), mode:subagent, model: TIER_DEFAULT (dispatch-gates --tier at 8801f2bb3: "no path-derived mandate … the tier stays the PM's per-card judgment call"), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: none
    Serial constraints cleared: none. No open PR touches packages/objectql/src/engine.ts (13 open PRs read this fire); last touch on main is 77a77e4 (#25396).
    Premise: re-read on origin/main 8801f2bb3: engine.ts is 23,903 lines, as the card measured; no split has started.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 25522,
    "status": "done",
    "branch": "claude/issue-25522-objectql-engine-cut-1",
    "pr": "#25615",
    "session": "session_01JVTd3PprStGa26aez5omLB — the dispatching seat's session (mode:subagent), on the Claude-Session: trailer of commit 328b5b1",
    "premise_still_valid": true,
    "summary": "Seam table measured fresh at origin/main e649c2d (engine.ts 23,903 lines; 8,253 from the last 30 days; 124 commits in 30 days, 33 in 7; class ObjectQL 317 members, 255 methods, 147 private / 108 public; the same 8 inferred-return public methods the card lists). It is in the PR body as 41 contiguous sections, each with its 30-day lines. Cut 1 is the coldest area that meets every series limit and has no path reader outside objectql: the validation-message i18n block (122 lines, 0 from the last 30 days). The private bodies of ObjectQL#validationMessageContext, #negotiatedMessageLocale and #objectDisplayLabel moved unedited to packages/objectql/src/engine-validation-messages.ts through ValidationMessageHost: the i18nService getter plus a late-bound negotiatedMessageLocale closure; objectDisplayLabel reads no member and is called directly. setI18nService stays: it is a two-line field setter. The new module imports ObjectQL as a type only, so there is no runtime cycle. Two spec/system imports with no other reader in engine.ts (objectLabelKey, resolveBundleLocale) left engine.ts. All six published declaration files are byte-identical, the export lists are identical, and the draft PR is Part of #25522 with skip-changeset. Roll-up summaries (0 lines in 30 days) was set aside for cut 1: buildSummaryIndex is the liveness ledger's evidence by path (packages/spec/liveness/field.json, summaryOperations), and recomputeSummaries has a this.update( write and passes this to aggregateSummaryValue. Proposed cut 2: Datasource routing (isSystemLedgerObject, getDriver, resolveDatasourceBinding, resolveEffectiveDatasource, resolveMappedDatasource, resolveDatasourceFromMapping, matchPattern; 343 lines, 1 from the last 30 days; setDatasourceMapping and the two public statics stay; the new module gets its own anchor entry for the ADR-0057 routing sentence). Measure getDriver's spies and doubles before choosing it. Draft only, per the release terms: no ready flip, no auto-merge, no queue, no merge.",
    "tests": "At head 328b5b1. (1) pnpm --filter @objectstack/objectql exec vitest run --project local --maxWorkers=2 under os-verify-lock: VERDICT command-exit 0; JSON report: 466 files, 1,899 suites, 8,700 tests, 8,700 passed, 0 failed, 0 skipped. That includes engine-validation-locale.test.ts, engine-validation-locale-negotiation.test.ts and engine-delete-restricted-locale.test.ts, which pin these helpers. (2) pnpm --filter @objectstack/objectql typecheck (tsc --noEmit plus check:test-typecheck) under the lock: VERDICT command-exit 0, 'check:test-typecheck: OK — ... 39 file(s) / 233 error(s) / 64 pinned signature(s) held in test-typecheck-debt.json'. (3) Move proof by AST token (recursive getChildren leaves): validationMessageContext 104, negotiatedMessageLocale 134, objectDisplayLabel 133 tokens, all SAME, every body line the base line less 2 leading spaces. Negative control: one changed token in negotiatedMessageLocale reports DIFFER. Class side: 317 members at base and head, the 314 that did not move byte-identical, the 3 stubs keep docblock and signature byte-identical. Top level: 232 of 233 statements byte-identical (the other is the spec/system import less two names) plus one new import. (4) .d.ts bar, ruling 6348891160: index.d.ts 9ca22071717e3f761198115fa54a143df4151a52950d826a10677420dcad16ae, index.d.mts 69dd1cfe3875024f434b2d7defce771ebc8c7e48a05be7c946fa6ecdbd912b40, core.d.ts d27b72bde2eec9a47c7dd3c104976321533cf397452ca9f84491a455ec28e73b, core.d.mts 5a0cca505296b678b31c742c285e028fe434f5467bb8d27e052e470ce0e09652, util-ByiLm3B6.d.ts = .d.mts 1742a9cb029654d1ca4e8e392e98001eec85963987f516b1b76f672ecd08e5a9. Each is raw = normalised and base = head, raw diff 0 lines, using the ruling's normaliser verbatim. Note: this package prints single-quoted literals (23 single-quoted literal unions, 0 double-quoted), so that normaliser is a no-op here. Positive control: line 7261 private objectDisplayLabel; made public gives raw = normalised 270f913f734273e380af6ab964e8b15206aa7c511892dea58cc8f6fd9adf5ef7, not equal to 1742a9cb. Export lists from the built bundles: '.' 182 ESM = 182 CJS, './core' 54 = 54, identical at base and head (sorted-list sha256 881616cc... and 393e8069...). (5) One-off mutation, not a kept test (move-only, so no ablation is owed): scripts/ablation-replace.mjs replaced the moved 'return resolveBundleLocale(offered, requested) ?? requested;' with 'return requested;' (anchor 1 -> 0, blob 5d9194fa75bb -> 88406d6408d5). engine-validation-locale-negotiation.test.ts went to 3 failed / 3 passed. Restore: blob == HEAD 5d9194fa75bb and git diff HEAD empty. vitest resolves the relative import from src/, so there is no dist/ leg. test:repo was not run locally (CI's Test Core runs it).",
    "gates": "Local, on the real diff (2 files, +135/-39): node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 56 families at 328b5b1 (stderr first line names the repo and the commit). All 56 were run at head, each exit code captured before any pipe. 53 exit 0. Three are NOT MEASURED: node scripts/check-engine-split-ratio.mjs --days 90 exit 2 (CANNOT COMPUTE: the shallow clone's history starts 2026-09-15, inside the 90-day window); node scripts/check-plugin-teardown-shape.mjs --self-test exit 3 (cannot read pinned positive-control commit 621a487 in this shallow clone); pnpm check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET: no dist/ for 70 packages; the export lists in tests (4) answer its question for objectql). Reconciliation: dispatch-gates --ran with ':: exit N' lines prints '56 derived famil(ies) accounted for — 54 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)'. It counts the exit-2 refusal as run; by that script's own header it is CANNOT COMPUTE, so this report counts it NOT MEASURED. Outside the derivation, all exit 0: eslint --no-inline-config packages/objectql; eslint on both files; node scripts/check-adr-anchors.mjs (base and head: 84 anchored files, 1,883 decision-letter citations, 52,465 citations across 6,583 files, the same at both ends); node scripts/check-adr-symbol-anchors.mjs (2,384 anchors resolve); node scripts/check-nul-bytes.mjs; node scripts/check-platform-checklist.mjs --changed-from origin/main ('1 anchored file(s) in the change set, 14 anchor(s) judged, 0 lost'). CI on PR #25615 head 328b5b1 at report time: Check Changeset success; No other open PR may claim the same issue success; Type Check (workspace, debt ledger, source gates, consumer gates), the Lint lanes (PM dispatch-gates, CI release & engine gates, ESLint, repo & tooling gates, docs & code guards, the scoped lanes), Governed Surface Queue Guard, Part-of PR must not also close its card, Check PR Size and the rest: in_progress. Opt-in lanes skipped. Not waited on, per the contract.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm (Clause-②: no)",
    "mcp_calls": "0 — no GitHub MCP tool called",
    "api_writes": "2 relay strokes, both through scripts/pm/fleet-write/dispatch.mjs as POST /repos/objectstack-ai/objectstack/dispatches, executed by the relay as objectstack-fleet[bot]. (1) pr_create: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /issues/25615/assignees [sunhaolin] + POST /issues/25615/labels [skip-changeset]; run 40082586078 success; read-back 18,999 bytes sent = stored, identical; assignee and label listed. (2) This report: POST /repos//issues/25522/comments via scripts/pm/post-stamped.mjs. Not REST: git push to the branch, twice (the empty-branch probe, then commit 328b5b1).",
    "open_questions": [
    {
    "question": "Later cuts of this file: @objectstack/objectql's .d.ts prints string literals in SINGLE quotes, so ruling 6348891160's verbatim normaliser (double quotes only) cannot absorb a union-member-order swap here. This cut is raw byte-identical, so nothing depended on it. A later cut that moves a body the DTS program checks before the rest of engine.ts could reorder a union. That shows as a raw diff the normaliser leaves in place, which under the ruling's item 1 is a stop. Does the ruling seat want to decide this before cut 2 is dispatched?",
    "options": [
    "A — The ruling seat states that item 1(b)'s normalisation covers single-quoted literal unions too: the same single class (member order within one literal union), spelled with the quote this printer uses, nothing else normalised. Real business need: the maintainer's split order for a file with 124 commits in 30 days. Long-term: the bar stays on the contract (declarations, visibility, exports), not on printer quote style. AI-error prevention: unchanged, because 1(a), 1(d) and the positive control still catch every change of kind. No sprawl: a ruling sentence, no script, no gate. Effort: one ruling comment.",
    "B — Keep the normaliser verbatim. Any later cut whose raw diff carries a union-order swap stops and returns needs_decision, and the ruling seat decides then. Real business need: the same. Long-term: an equivalent outcome, one round later. AI-error prevention: the same. No sprawl: none added. Cost: one stopped cut and a ruling lap mid-series, at a cut whose timing nobody chooses."
    ],
    "recommendation": "A, decided by the ruling seat, not by a dev: it is the class ruling A already judged meaningless to every consumer (the quote character is a printer setting), and deciding it before cut 2 costs one sentence instead of a stopped cut. ⛔ Not acted on here: this dev did not widen the normaliser and adds no script (ruling item 3, card ask 5)."
    }
    ],
    "out_of_scope_findings": [
    "carrier: the ruling seat, through open_questions[0] above · the single-quote blind spot of the ruling's normaliser on @objectstack/objectql · noted, not filed (not a defect, contract violation or authoring trap)",
    "carrier: none (承接者:无) · cut-2 pricing note: Roll-up summaries is cold (0 lines in 30 days), but buildSummaryIndex is the liveness evidence pointer for field.summaryOperations (packages/spec/liveness/field.json: evidence packages/objectql/src/engine.ts, key-mention), so that cut owes a packages/spec ledger edit, and recomputeSummaries stays (a this.update( write, and this passed to aggregateSummaryValue) · noted in the PR body, not filed"
    ],
    "line_budget": "174 changed lines (+135 / -39) over 2 files, under the 3,000 human-merge line; engine.ts 23,903 -> 23,881; engine-validation-messages.ts 118",
    "files_changed": [
    "packages/objectql/src/engine-validation-messages.ts (added)",
    "packages/objectql/src/engine.ts (modified)"
    ],
    "deviations": [
    "Commit trailers: the model-free pair (Claude-Session + Co-authored-by: Claude) per AGENTS.md and os-dev.md, in place of the harness reminder's model-named Co-Authored-By line (the pre-push hook refuses a model identifier). PR body footer: AGENTS.md's session-URL form, in place of the harness's line.",
    "A2: no scripts/adr-anchors entry added for the new module. The engine.ts entry's one paragraph is the transaction seam and describes no moved body, and the moved bodies cite no ADR (the ADR-0053 Phase 2 cite is in a docblock that stays on the stub). Card ask 3 owes an entry only when a paragraph describes a moved body.",
    "A3, narrowed and declared: no direct dependant was type-checked locally. Every moved member is private (reachable from no dependant), and all six published declaration files are byte-identical, so the dependants' input bytes are unchanged. CI's TypeScript Type Check lanes cover them.",
    "No baseline objectql test run (head only). The base-vs-head per-test comparison PR #25494 carried is not repeated; the head suite is 8,700/8,700.",
    "History: a sibling agent's git fetch --shallow-since=2026-09-15 held .git/shallow.lock, so this run waited on that PID (tail --pid) and read 30-day blame from the deepened history. It did not remove the lock or deepen further, so the 90-day split-ratio gate stays NOT MEASURED.",
    "Created a fetch ref refs/issue-25522/main in the shared ref namespace to re-read main without moving origin/main; deleted at cleanup."
    ]
    }


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #25615 comment 6382672482 (cut 1, head 328b5b194e; lands once CI is green on that head) · domain:server seat 2 · session_01JVTd3PprStGa26aez5omLB


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Release: domain:server seat 2 · sunhaolin · session session_01JVTd3PprStGa26aez5omLB · 2026-10-24T10:42Z · cause: cut 1 landed (Part of #25522) · destination: pm:queue, unassigned, for cut 2

    Landed: PR #25615 → 481ac6211 (#25522 cut 1)

    reading result
    PR #25615 object merged: true, merge commit 481ac6211641ccb7292508ed423f02e432322e4a, merged 2026-10-24T10:42:01Z through the merge queue
    origin/main 481ac6211 is an ancestor of origin/main (481ac62116), single parent (squash)
    queue branch no gh-readonly-queue/main/* head for PR 25615 remains
    • Landed: the validation-message i18n block (validationMessageContext, negotiatedMessageLocale, objectDisplayLabel) lives in packages/objectql/src/engine-validation-messages.ts. engine.ts is 23,881 lines.
    • Remains: every other area of the 41-section seam table in PR refactor(objectql): move the validation-message i18n helpers out of engine.ts into engine-validation-messages.ts (#25522 cut 1) #25615's body. The dev proposes Datasource routing for cut 2 (measure getDriver's spies and doubles first; the new module owes its own anchor entry for the ADR-0057 routing sentence). Roll-up summaries waits: buildSummaryIndex is the liveness evidence path in packages/spec/liveness/field.json, so that cut is spec-lane-coupled.
    • State: pm:dispatched → pm:queue, assignee cleared, in this act. The series card stays open. This seat re-claims cut 2 when a dispatch slot frees.

    Generated by Claude Code

  5. 36 remaining items

  6. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #26028 comment 6412883896 (cut 5, head bd40de2733) · domain:server seat 2 · session_0186vfjHHMsRXC9EUT9hTFMo · 2026-10-26T09:40Z. Landing waits for a green head.

  7. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Release: domain:server seat 2 · os-project-manager · session session_0186vfjHHMsRXC9EUT9hTFMo · 2026-10-26T11:05Z · cause: cut 5 has landed (Part of #25522) and the cut-5 card thread is done · destination: pm:queue, unassigned, for cut 6

    Landed (cut 5)

    PR #26028 merged at 2026-10-26T11:05Z by the merge queue as 4bea75589f on main (Part of #25522; ACCEPT 6412883896; Clause-②: no, so no contract review was owed).

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-26028-*' 0 refs (left the queue)
    origin/main by content git ls-tree --name-only origin/main packages/objectql/src/ engine-secret-internal-fields.ts present
    Ancestry git merge-base --is-ancestor 4bea75589f origin/main holds
    • Landed: the secret and internal-field handling bodies moved out of engine.ts into engine-secret-internal-fields.ts, with thin delegates left on the engine (claim amendment 6412019236).
    • Remains: the next cut of engine.ts, which starts from this main.
    • State: pm:dispatched → pm:queue, assignee cleared, in this act.

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2 · card thread · cut 6
    Session: session_0186vfjHHMsRXC9EUT9hTFMo (the seat); the card thread is session_01VbCrrAuovPD2joHGR1XXRZ
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-2f5vpq (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#2
    Ruling-ref: the card's ask (move-only, one area per PR, one named host, identical public .d.ts under ruling 6348891160 item 1) and its series limits; Part of #25522, cut 6
    File surface: packages/objectql/src/engine.ts (one area, chosen by a seam table re-measured on origin/main after cut 5 and posted in the PR body), one new engine-*.ts seam module, its path readers (docs, docs/qa/**, test keys, any scripts/adr-anchors/** or scripts/** baseline that reads a moved body), their tests. skip-changeset. ⛔ No packages/spec/**, ⛔ no docs/adr/** (stop on breach; explain in the report)
    Container & model: M, mode:thread, default model and effort (set at thread open)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6414491600
    Premise: holds (read 2026-10-26T11:09Z: cut 5 landed as 4bea75589f, Release 6414491600, card open, unassigned, pm:queue); if the re-measured table shows no area pays, a premise_still_valid: false hand-back with the table is legal
    Resume-from: none — cut 5 landed (4bea75589f); cut 6 starts from origin/main
    Serial constraints cleared: no open PR names #25522; the dev reads every open PR on packages/objectql/** at start and picks an area none touches


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 25522,
    "status": "done",
    "branch": "claude/project-thread-2f5vpq",
    "pr": "#26102",
    "session": "session_01VbCrrAuovPD2joHGR1XXRZ (the cut 6 card thread, mode:thread), on the Claude-Session: trailer of commit 50dae82; claim 6414562831 written by domain:server seat 2 session_0186vfjHHMsRXC9EUT9hTFMo",
    "premise_still_valid": true,
    "summary": "Cut 6 re-measured the seam table on origin/main 712770b (engine.ts 23,351 lines, 7,317 from the last 30 days, 123 commits in 30 days and 31 in 7; engine.ts byte-identical at the merged base aa2f8e3) and picked Hook dispatch internals: the coldest section with more than 100 movable body lines (53 of 477 recent), no field writes, no packages/spec or docs/adr pointer, and no overlap with #26026, the only open PR on engine.ts. Four bodies move unedited into packages/objectql/src/engine-hook-dispatch.ts through HookDispatchHost (_registry as a getter; triggerHooks and transaction as late-bound closures): buildPerRowAfterContexts, dispatchPerRowBeforeHooks, inAfterAbortUnit (generic, stub calls the T-instantiated function) and assertBulkPerRowHookBudget (reads no member, called directly). hasHooksFor, opensAfterAbortUnit and dispatchUnscopedMultiWriteHooks stay because each calls the module-level hookMatchesObject, which would need a value import of engine.ts (a run-time cycle). engine.ts 23,351 -> 23,234 (net -117), module 240 lines; six published .d.ts byte-identical with a positive control; Part of #25522, skip-changeset. The three areas cut 5 named still do not pay (table in the PR body and pm-orders/server/25522-cut6-seam-table.md).",
    "tests": "At 1b00a88 (same package sources as final head 69d8f91; the second merge touched only .github/, scripts/ and ui/). (1) pnpm --filter @objectstack/objectql exec vitest run --project local --maxWorkers=2 under os-verify-lock: VERDICT command-exit 0; Test Files 470 passed (470), Tests 8748 passed (8748); JSON report 1,911 suites, 0 failed, 0 skipped. Also green before the first merge at 50dae82 (470 / 8,742). (2) pnpm --filter @objectstack/objectql typecheck under the lock: VERDICT command-exit 0, check:test-typecheck OK, 39 files / 233 errors / 64 pinned signatures held. (3) pnpm exec eslint --no-inline-config packages/objectql: exit 0. (4) packages/core row-serving-door-exposure.pin.test.ts + second-object-read-exposure.pin.test.ts: 2 files, 7 tests passed. (5) Move proof, TypeScript-AST leaf tokens (recursive getChildren, JSDoc skipped): all four SAME on parameters less this + return type + type parameters + body tokens, async the same, every body line = base line less 2 spaces (dispatchPerRowBeforeHooks 454 tokens / 103 lines, buildPerRowAfterContexts 165 / 17, inAfterAbortUnit 73 / 12, assertBulkPerRowHookBudget 73 / 9). Negative controls: === flipped to !== in the moved assertBulkPerRowHookBudget reports DIFFER; a comment-only edit in the moved dispatchPerRowBeforeHooks fails the line rule; both exit 1. Class 318 = 318 members, same order, 314 byte-identical, 4 stubs keep docblock + modifiers + signature byte-identical; top level 226 of 229 base statements byte-identical (the class, the narrowed spec/data import, the removed multi-update-hook-key-divergence import). (6) .d.ts bar, ruling 6348891160: base = objectql built with engine.ts restored from be78977 and the module removed (tree only, git status clean afterwards); head built at 1b00a88; head dist/index.mjs carries inAfterAbortUnit.call(host x1, base x0. Raw sha256 base = head on all six: index.d.ts 0454d5e70b156d8effbf27b8915587c7cbee241dcd7d698013c0a4c369a02aa5, index.d.mts ccf900240aa137abe72f82b8abfc872d42c5645467400134c580285f2a3b3090, core.d.ts 1d20303a455a909e4b55fd0802fb0b0bcb59ec51784daf27d5ef4c0659410953, core.d.mts ef178bf0725eccc2f358f082ce13dc5122a6d5a53c19ef630017256f67de03b4, util-CVzOGxAn.d.ts = .d.mts 85ef1cbec2b016d5f7afabaa21689c86c6dffc573076fdfdeb8ea0f1a1b1ad53. Positive controls: dispatchPerRowBeforeHooks made public in source and rebuilt (at 712770b) changed all six hashes; private removed from util-CVzOGxAn.d.ts line 5063 gives 47f9b025059291111682c59ff64f77688fd34cb0077bf8a753443bb6ce3a18d0. Export lists ESM = CJS: '.' 182 (sorted sha256 881616cc...0adaa), './core' 54 (393e8069...90f49) at both ends; no moved name exported. The same comparison at 712770b was also six-of-six identical. No ablation: no tested behaviour changed. test:repo not run locally (CI Test Core runs it).",
    "gates": "Local, on the real diff (2 files, +269/-146), at final head 69d8f91: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 56 families (stderr first line names the repo and the commit; main was merged a second time because the derivation printed STALE TREE for check-closing-keyword-parity and ci.yml). All 56 run, each exit code recorded before any pipe: 55 exit 0. NOT MEASURED, CI runs it: pnpm check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET, other packages have no dist/; the export lists in tests (6) answer it for objectql). Reconciliation: dispatch-gates --ran exit 0, '56 derived famil(ies) accounted for, 55 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. Named readings: check-system-context-census OK (151 read sites, 22 packages, 79 files, 144 of 144 symbols cited); check:logger-receiver-detach OK; check:durability-log-level OK; check-engine-split-ratio --days 90 97.6%. Outside the derivation, all exit 0 at 69d8f91: node scripts/check-adr-anchors.mjs at base (detached worktree at aa2f8e3) 88 anchored files, 1,878 letter citations, and at head 88 / 1,878 (also 1,864 = 1,864 at 712770b, 1,878 = 1,878 at be78977); node scripts/check-adr-symbol-anchors.mjs (2,658 anchors resolve); node scripts/check-tenant-audit-census.mjs (243 write call sites); node scripts/check-nul-bytes.mjs; node scripts/check-platform-checklist.mjs --changed-from origin/main (13 anchors judged, 0 lost); node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD (3 commits). CI on PR #26102 head 69d8f91 at report time: No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Part-of PR must not also close its card, The card this PR closes must claim this branch, Check Changeset, Check PR Size, Check Documentation Links, Dogfood Regression Gate, Flag docs affected by code changes, Auto Label: success; Build Core, Test Core (1-8/8), the Lint lanes, the Type Check lanes, Governed Surface Queue Guard: in_progress; opt-in and UI lanes skipped. Not waited on, per the contract.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm (Clause-②: no)",
    "mcp_calls": "0 — no MCP GitHub call this run. Every GitHub read went through gh api REST: the card and its comments, the claim 6414562831, the Release 6414491600, PR #26028's body, the open-PR list with each PR's files (twice, #25640 paged), PR #26102 read-back, requested reviewers and check-runs.",
    "api_writes": "3 relay strokes through scripts/pm/fleet-write/dispatch.mjs (POST /repos/objectstack-ai/objectstack/dispatches), executed as objectstack-fleet[bot]: (1) pr_create, run 40320344735 success: POST /pulls (draft) + POST /issues/26102/assignees [os-project-manager] + POST /issues/26102/labels [skip-changeset]; read-back 19,315 bytes sent = stored, identical; draft true, label skip-changeset and assignee os-project-manager confirmed by a later REST read; (2) pr_request_reviewers pull 26102 reviewers [os-project-manager], run 40320468530 success, read back (requested_reviewers lists os-project-manager); (3) this report: POST /issues/25522/comments via scripts/pm/post-stamped.mjs. Not REST: three git pushes of the branch (50dae82, 1b00a88, 69d8f91).",
    "open_questions": [],
    "out_of_scope_findings": [],
    "line_budget": "415 changed lines (+269 / -146) over 2 files, under the 3,000 human-merge line; engine.ts 23,351 -> 23,234 (net -117); engine-hook-dispatch.ts 240",
    "files_changed": [
    "packages/objectql/src/engine-hook-dispatch.ts (added)",
    "packages/objectql/src/engine.ts (modified)"
    ],
    "seam_table": "In the PR body (41 sections in cut 1's shape on 712770b) and the project file pm-orders/server/25522-cut6-seam-table.md (21,886 bytes, with the per-method screen and the pick).",
    "proposed_next_cut": "From the cut 6 screen: execute and transactions (21880-22267, 63 of 388 lines in 30 days) screens 7/8 bodies movable, 122 body lines (execute 55, warnTransactionUnsupported 26, enforceTransactionOrigin 25, newTransactionScope 5, datasourceNameOf 4, runOpenedUnit 4, isClosedUnitHandle 3); transaction stays (docs/adr/0119 pointer), and enforceTransactionOrigin is named in the engine.ts ADR anchor paragraph, so that cut owes an anchor entry for its module. Not yet priced against the host or screened for field writes. Migration flags and attestations pays more (176) but needs setters for five fields, a host shape no cut has used; that wants a seat ruling first.",
    "deviations": [
    "Moved 4 of the section's 7 bodies: hasHooksFor, opensAfterAbortUnit and dispatchUnscopedMultiWriteHooks call the module-level hookMatchesObject exported from engine.ts, and reaching it from the module would be a value import of the engine (the series' first run-time module cycle). They stay; the PR body and the module header say so.",
    "Branch claude/project-thread-2f5vpq is the harness-pinned card-thread branch, as the claim records; it is not claude/issue-N-slug.",
    "Commit trailers and PR footer: the model-free pair and AGENTS.md's session-URL footer, in place of the harness reminder's model-named Co-Authored-By line and its PR footer.",
    "Merged origin/main twice before pr_create (be78977, then aa2f8e3 because dispatch-gates printed STALE TREE for its own families); neither touched engine.ts. Tests ran at 1b00a88; the second merge brought no package change, so they were not re-run, and the gate sweep was re-run at 69d8f91.",
    "MultiUpdateHookKeyDivergenceError's import was removed from engine.ts with its last code reader; the dispatchPerRowBeforeHooks docblock that stays still names it in a {@link}. That docblock is on a private member and goes to no published .d.ts.",
    "A3 narrowed and declared: no dependant type-checked locally; the four members keep their declarations and the six .d.ts are byte-identical.",
    "Shared .git state: history deepened with git fetch --shallow-since=2026-07-19 origin main; origin/claude/project-thread-otcr21 fetched to read #26026's hunks. The primary checkout at /home/claude/objectstack was detached so a worktree could take the harness branch. The head worktree /home/claude/objectstack-issue-25522 keeps its node_modules for a patch round; the base worktree is being removed.",
    "No PR activity subscription, per the order: the seat holds #26102's events."
    ]
    }


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #26102 comment 6416200246 (head 69d8f91a60, cut 6, move-only) · domain:server seat 2 · session_0186vfjHHMsRXC9EUT9hTFMo · 2026-10-26T12:39Z. The head is green; landing through the queue now. The card stays open for cut 7.


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Release: domain:server seat 2 · os-project-manager · session session_0186vfjHHMsRXC9EUT9hTFMo · 2026-10-26T13:03Z · cause: cut 6 has landed (Part of #25522) and the cut-6 card thread is done · destination: pm:queue, unassigned, for cut 7

    Landed (cut 6)

    PR #26102 merged at 2026-10-26T13:02Z by the merge queue as 3380671aef on main (Part of #25522; ACCEPT 6416200246; Clause-②: no, so no contract review was owed).

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-26102-*' 0 refs (left the queue)
    origin/main by content git ls-tree --name-only origin/main packages/objectql/src/ engine-hook-dispatch.ts present
    Ancestry git merge-base --is-ancestor 3380671aef origin/main holds
    • Landed: the hook-dispatch internals (buildPerRowAfterContexts, dispatchPerRowBeforeHooks, inAfterAbortUnit, assertBulkPerRowHookBudget) moved out of engine.ts into engine-hook-dispatch.ts, with thin delegates left on the engine.
    • Remains: the next cut of engine.ts, which starts from this main. Cut 6's dev proposed "execute and transactions", which owes an anchor entry.
    • State: pm:dispatched → pm:queue, assignee cleared, in this act.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:serverDomain lane — seat card indexed by label:pm:seatpm:queuepriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions