Skip to content

Codemod split: generate the objectql engine.ts split with a deterministic script, verified byte-identical #29986

Open

Description

@objectstack-fleet

domain:devx#1 · os-support-ai · session_01WGufzgBDcBNVmSmo7VFHpj

Filing gate: ruling 6583399215 on #29465 (letter A, maintainer 「同意」 2026-11-02T17:11Z), whose exit stroke 6583664223 names one card per remaining file, filed into its lane by the domain:devx seat once the pilot #29520 merged. It merged as PR #29598 (d46b1ff23f, 2026-11-03T16:26Z). The maintainer asked for this programme first while the fleet is quiet: 「现在车队不忙,大文件分拆的问题是否可以优先」 (2026-11-03T22:37Z). ⛔ Not a claim. No grade: triage sets it and routes it.

Ruling-ref: 6583399215
Governs: the pilot rulings 6591753301 (A: value imports from the host file allowed, out-of-class top-level helpers move whole into leaf modules, a gate that scans the file by path widens in the same PR) and 6597555122 (A: a test or gate that reads the file by path gains the new modules in its reading list in the same PR; a .d.ts order-only difference is judged by ruling 6441032442 B's second normalisation), which the pilot carried to this card; the declaration-file bar of ruling 6348891160 on #25222; #24586 ruling A (6270097840); the landing plan 6582376616 on #29465.

Reader who acts: a domain:server seat (the file is packages/objectql), dispatching one dev.

What to build

  1. A deterministic codemod for packages/objectql/src/engine.ts (23,245 lines on main c92b8872; classes ObjectQL from line 5384, ObjectRepository from 22550, ScopedContext from 22749; 25 engine-*.ts modules exist from the hand series), modelled on the pilot's scripts/codemod-split-sql-driver.mjs: whole sections' method bodies move to section modules, the class keeps one-line stubs, shared members are reached through the host pattern, and the out-of-class top-level helpers (about 5,380 lines ahead of ObjectQL) move whole into leaf modules that never import back from engine.ts.
  2. The script's own proofs, as the pilot ran them: byte-identity, the declaration bar of ruling 6348891160 judged by 6441032442's second normalisation, determinism, and every census, gate or test that reads engine.ts by path widened to the new modules in the same PR. The hand series stopped on exactly this: cut 21's report 6556726794 names federated-injected-column-readers.test.ts, which resolves a via in the same file as the calling site.
  3. Type-check and the objectql suite plus its direct consumers at the base counts.

Order with #25522

#25522 (hand series, pm:blocked with the series spent) is released into this card (ruling 6583399215). The claiming seat closes #25522 not_planned pointing here, in the same stroke. Confidence gap named by #29465: whether the host pattern covers ObjectQL's private members without changing the declaration files. The pilot proved it for SqlDriver.

How it lands (landing plan 6582376616)

  • Phase 0, no pause: build and prove the codemod and its generated split in a draft PR. Nothing else on the file stops.
  • Phase 1, a window the maintainer orders (「车队什么时候空闲是有我安排的」): seats land or park their open PRs on the file, the dev re-runs the script on the latest main (regenerated, ⛔ never rebased), CI runs once, the maintainer approves, and the PR enters the merge queue. The diff is over 3,000 lines, so it takes contract review, the final four-piece set and the maintainer's approval.
  • ⛔ The generated split is never hand-edited to pass. A proof that fails is reported as a fork on [Decision] Large source files: replace the hand-cut split with a script-generated split per file, so the remaining monoliths split in days, not months #29465 for a design ruling.

Done when

The draft PR holds the script and the generated split with every proof passing, and it has landed in the maintainer's window; or the fork is reported on #29465.

Re-measure: git show origin/main:packages/objectql/src/engine.ts | wc -l; git log --since='7 days ago' --oneline origin/main -- packages/objectql/src/engine.ts | wc -l.

Dedupe (open and closed): codemod, split in:title, 拆分, large file, 29465. Hits: #29465, #29520, #24586, #25467, #25522, #25521. None is a per-file codemod card for this file. New.

Activity

  1. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:server · pm:queue · pm:blocking · 2026-11-03T23:49Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#6 · os-support-ai · session_01WGufzibcN9oHa8kDbTTnL5

    Claim: PM loop round 6
    Session: session_01WGufzhfKpcY1cmybduYBcp (dev: os-dev card thread; seat session_01WGufzibcN9oHa8kDbTTnL5)
    Account: os-support-ai
    Branch: claude/project-thread-xwdm5r (harness-pinned thread branch; platform exception to claude/issue-<n>-<slug>)
    Worktree: the dev thread's own container checkout
    Domain: domain:server
    Seat: domain:server#6
    File surface: scripts/codemod-split-engine.mjs (new, modelled on the pilot's scripts/codemod-split-sql-driver.mjs), the generated split of packages/objectql/src/engine.ts into section and leaf modules, every by-path reader of engine.ts widened (stop on breach; explain in the report)
    Container & model: L, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the platform's own second-largest source file (objectql engine.ts, 23k lines) | the #25522 hand series, released into this card by ruling 6583399215 | every contributor and agent editing objectql
    Thread-read: 6618471428
    Premise: holds (programme #29465 ruling A; pilot PR #29598 merged d46b1ff23f; triage 6618471428)
    Serial constraints cleared: none for Phase 0 (ruling: nothing else on the file stops; Phase 1 waits for the maintainer's window)
    Stamp: 2026-11-04T02:22Z

  3. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#6 · os-support-ai · session_01WGufzhfKpcY1cmybduYBcp
    os-dev-report
    Stamp: 2026-11-04T05:16Z

    {
      "issue": 29986,
      "status": "needs_decision",
      "branch": "claude/project-thread-xwdm5r",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30012",
      "session": "session_01WGufzhfKpcY1cmybduYBcp",
      "premise_still_valid": true,
      "summary": "Phase 0 draft #30012 (head 90b69953, base 0b99c2b1): scripts/codemod-split-engine.mjs generates the engine.ts split, unedited: 37/278 ObjectQL methods into 13 section modules (host pattern) and 146/146 top-level declarations into the leaf engine-top-level.ts (lever b). Every proof holds (byte-identity, determinism, .d.ts second normalisation, by-path readers widened). The line bar is MISSED: engine.ts 23,245 -> 16,933 against < 13,000, the same question as #29985's fork 6620288066; reported as a fork with no hand edit and no new lever. The first generation moved two grandfathered query-options erasure sites; PATH_READER_PINS keeps seedAutonumber and inspectDanglingReferences on the class and the split was regenerated from base.",
      "tests": "objectql test local base 547 files/10,829 passed = head 547/10,829; test:repo 5 = 5. objectql typecheck (tsc + check:test-typecheck) exit 0 at head, base tsc exit 0. core test:repo 94 passed (1 red before the two CALLERS rows). types callers 11, rest door parity 66, cli lowered-body 4 passed. --verify --base 0b99c2b1 exit 0: 37/37 bodies + 146/146 declarations identical, 82 pruned bindings re-derived. Two plans identical, output tree sha256 e6a99d51f5a6f3bac605faf2c61e7ad918431a8bc264086ff59fabdcc24238ff. .d.ts (dtsnorm, base1=base2, head1=head2): 6/6 files normalised EQUAL, surface EQUAL, statements 16/16, 168/168, 190/190, control caught. Ablations at head, each red: 'purge' in OperationContext reds both weld tests; renamed isFederatedUnprovisionedInjectedColumn call reds stale-row + asks; via widening reverted reds organizationOwnedRowCounts; 'ablatedCollection' in METADATA_ARRAY_KEYS reds check-stack-collection-maps; the core pin without its rows names both files.",
      "gates": "pnpm build exit 0; pnpm lint exit 0; check-nul-bytes exit 0; dispatch-gates --commands at 90b69953: 75 derived, 75 run, all exit 0; --ran 0 NOT-MEASURED, 0 UNRUN. CI check-runs on #30012 not yet read (just opened).",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — MCP GitHub calls (reads via gh api; subscribe_pr_activity is the session's PR watch, not a GitHub write)",
      "api_writes": "2 — relay pr_create #30012 (draft, labels skip-changeset, no assignee, no reviewer); this os-dev-report comment via post-stamped",
      "open_questions": [
        {
          "question": "engine.ts ends at 16,933 lines against the < 13,000 bar. Which lever, if any?",
          "options": [
            "A: the ruling on #29985's fork 6620288066 applies here too (docblock ownership: ~13,730 by arithmetic, still over; plus private-static-through-host: ~12,130)",
            "B: class decomposition",
            "C: accept the measured count for this file"
          ],
          "recommendation": "A, decided once on #29465 for both files, because the remaining lines are the same kind (docblocks and signatures the .d.ts prints, hand-series stubs)."
        }
      ],
      "security_findings": "none",
      "out_of_scope_findings": []
    }

    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions