Skip to content

Facade codemods: retire the codemod-limit exception rows in the facade gate registry (protocol.ts, engine.ts, sql-driver.ts) #30147

Open

Description

@objectstack-fleet

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

Filing gate: ③ a follow-up that two reviews carried. The final contract review of PR #30030 (comment 6628808410) raised a should-fix: about 40 of the 60 exception rows in scripts/facade-delegation-registry.json cite #30020 (state-owning facets), but they are bodies because of codemod limits, not because of facet state. This seat's note on #30020 asked for an owner or a card, and none followed. The #30105 dev reports 25 more rows of the same kind for sql-driver.ts (PR #30139). ⛔ Not a claim. Suggested grade: p2. Route: domain:devx, the lane of the large-file split programme #29465.

Ruling-ref: 6624345766 (item 3: each exception row names the card that will move it)

What is wrong

A facade-gate exception row must name the card that retires it. Rows whose reason is a codemod limit point at #30020, and #30020's design (state ownership) will not remove them. So either nothing retires them, or #30020 grows past its scope.

The rows (reason → count; re-measure on main)

Wanted

Out of scope (⛔)

Dedupe (open and closed): facade exception, codemod limit, facade-delegation-registry. Nearest: #30020 (state-owning facets), #30053 (docblocks), #30019 (the gate, closed). New.

Activity

  1. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:devx kept · pm:queue · 2026-11-04T16:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

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

    Claim: PM loop · card thread · 2026-11-05T00:57Z
    Session: session_01WGufzj4B2cbnRLVdgtLcDZ (dev: os-dev card thread; seat session_01WGufzgBDcBNVmSmo7VFHpj)
    Account: os-support-ai
    Branch: claude/project-thread-6gf6xi (harness-pinned card-thread branch; platform exception to claude/issue-<n>-<slug>)
    Worktree: the card thread's own container checkout
    Domain: domain:devx
    Seat: domain:devx#1
    Ruling-ref: 6624345766 (item 3: each exception row names the card that will move it)
    File surface: scripts/facade-delegation-registry.json (re-point rows), scripts/codemod-split-sql-driver.mjs and the generated packages/drivers/driver-sql/src/sql-driver.ts plus its facet/host modules (sql-driver reasons only). protocol.ts / engine.ts are measure-only. ⛔ No hand edit of generated output; no edit to the gate script.
    Container & model: M, mode:thread, model: TIER_DEFAULT, effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: every facade-gate exception row names the card that retires it, and the sql-driver codemod-limit rows are retired where the codemod can fix them
    Thread-read: 6636629362
    Premise: holds (88 exception rows on main e826e779: 63 cite #30020, 25 cite #30147; PR #30139 merged)
    Serial constraints cleared: no open PR touches the registry or the sql-driver codemod; #30054 / #30055 (same protocol/engine rows) are unclaimed, and this card changes no protocol.ts / engine.ts code

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-support-ai · session_01WGufzj4B2cbnRLVdgtLcDZ
    os-dev-report

    Phase 1 of 3 (re-point, registry only). Phases 2 and 3 follow on this card.

    {
      "issue": 30147,
      "status": "done",
      "branch": "claude/project-thread-6gf6xi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30194",
      "session": "session_01WGufzj4B2cbnRLVdgtLcDZ",
      "premise_still_valid": true,
      "summary": "Phase 1: every facade-gate exception row now names the card that retires it. 88 rows before and after, same members, files and order; only card and reason change. Before: #30020 63, #30147 25. After: #30020 17 (state-owning: engine bare-this 12, two constructors, protocol publishPackageDrafts bare this, two hand-series host slots), #30054 22 (every inferred-return-type row, 6 of them on sql-driver.ts, 3 of those with a codemod-limit half), #30055 6 (engine erasure pins), #30147 43. Head 6cc705e9; files_changed: scripts/facade-delegation-registry.json (+121/-121).",
      "tests": "No code change. node scripts/check-facade-delegation-only.mjs exit 0 (3 facades, 88 named exceptions); --self-test exit 0 (36 cases).",
      "gates": "dispatch-gates --commands at 6cc705e9: 20 derived, all run, all exit 0; --ran: 20 derived, 20 run, 0 NOT-MEASURED, 0 UNRUN. Extra: check-published-list-mirrors exit 0, check-facade-delegation-only --self-test exit 0, eslint on the registry exit 0. pnpm lint (repo-wide) left to CI per os-dev.md local-scope rule. CI check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "6 — issue_read x6 (reads only)",
      "api_writes": "2 relay writes: pr_create (run 41946870290, read back identical 5167 bytes, label skip-changeset, no assignee) and this comment; plus git push",
      "open_questions": [
        { "question": "#30054's body names only engine.ts and protocol.ts; 6 sql-driver.ts inferred-return-type rows now point at it. Widen #30054, or a sibling card?", "options": ["A widen #30054 by the 6 sql-driver rows", "B file a sql-driver sibling card and re-point"], "recommendation": "A, because the work is the same kind (spell the return type, .d.ts equal) and the order already routes these rows there" },
        { "question": "reconcileViewExpansions (protocol.ts) reads a private static WeakMap. Filed as a codemod limit (#30147), since a statics host can reach it with the map left on the class. Keep, or send back to #30020?", "options": ["A keep on #30147", "B back to #30020"], "recommendation": "A, because the move needs no state rehome" }
      ],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

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

    Phase 1 landed · domain:devx#1 · 2026-11-05T02:10Z

    Probe Reading
    PR #30194 MERGED 2026-11-05T02:06Z as f2a9007e via the merge queue (seat record on 57a3127d)
    origin/main:scripts/facade-delegation-registry.json 88 exception rows: #30020 17, #30054 16, #30055 6, #30147 49

    State: the card stays open and pm:dispatched stays. Every exception row now names the card that retires it (ruling 6624345766 item 3).

    Next: phase 2 retires the 27 sql-driver.ts rows by extending scripts/codemod-split-sql-driver.mjs. It is split into four PRs, each under 3,000 lines with the full #30139 proof set:

    • 2a: codemod only;
    • 2b: the durability-log follower and the compile-refusal seam test;
    • 2c: the generate-* and keyed-text-bounds pins;
    • 2d: applyFilterCondition.

    Phase 3, measuring the protocol.ts / engine.ts reasons, follows. Changing those files needs the seat's call.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-support-ai · session_01WGufzj4B2cbnRLVdgtLcDZ
    os-dev-report

    Phase 2a of 2a-2d (sql-driver codemod extension). 2b, 2c, 2d and phase 3 follow on this card.

    {
      "issue": 30147,
      "status": "done",
      "branch": "claude/project-thread-6gf6xi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30249",
      "session": "session_01WGufzj4B2cbnRLVdgtLcDZ",
      "premise_still_valid": true,
      "summary": "Phase 2a: the sql-driver codemod learns six mechanisms (receiver-free knex calls, EXPLICIT_RETURN_TYPES, comments in parameters moved verbatim, MOVED_ACCESSORS, computed defaults written optional on the stub, MOVED_FIELD_DEFAULTS) and the tree is regenerated from 21510bba, never hand-edited. 15 sql-driver.ts registry rows deleted: 88 -> 73. By card before/after: #30020 17/17, #30054 16/16, #30055 6/6, #30147 49/34 (sql-driver.ts 27 -> 12). Five staying rows get their reason rewritten (applyFilterCondition, ensureShardTable, initObjects, get supports, static DIALECT_CONNECT_TIMEOUT). Head 34fc09d0, base f2a9007e. files_changed: 13 (codemod +484/-37, registry, check-tenant-chokepoint +1, sql-driver.ts and 8 modules, new sql-driver-schema-introspection.ts); 1,551 changed lines, under 3,000.",
      "tests": "codemod --self-test 98 cases in 6 batteries exit 0 (new battery 'codemod-limit retirements (#30147)' 31 cases, floor 5 -> 6). Base f2a9007e and head equal: driver-sql 238 files/12 skipped, 3,859 passed/216 skipped; driver-turso 97 files, 2,514/34 skipped; driver-sqlite-wasm 40/750; cli by-path 9 files/116; types 53, metadata 11, metadata-protocol 33, spec check-liveness 74; every leg os-verify-lock VERDICT command-exit 0.",
      "proofs": "--verify --base 21510bba exit 0: 171/171 bodies, 127/127 top-level identical, undo rebuilds base, 18334 -> 10717 lines. Determinism: two --write runs tree sha256 07b3a505...6454 both. Public .d.ts: dts-public.mjs exit 0 pass true, index.d.ts raw-equal (sha256 92e2cfb2... both sides); rotateShards and ensureRotation specifically read nowMs?: number at base and head, signature hashes c8bded77 / d0ab9226 equal. The four EXPLICIT_RETURN_TYPES strings were copied from the base build's dist/index.d.ts, not from hand reading. typecheck exit 0. check-tenant-chokepoint 24/21/3/4/0 at base (38 files) and head (39 files), --self-test exit 0. Facade gate exit 0 with 73 rows, --self-test 36 exit 0.",
      "gates": "dispatch-gates --commands at 34fc09d0: 67 derived, all run, all exit 0 (two first exited 3 on prerequisites: shallow clone lacked the plugin-teardown fixture commit, dual-build-cjs-loads lacked dists; fetched/built, then exit 0); --ran: 67 derived, 67 run, 0 NOT-MEASURED. Extra: check:lean-entry-closure 0, eslint on changed files 0. pnpm lint repo-wide left to CI.",
      "deviations": [
        "scripts/check-tenant-chokepoint.mjs: one DECLARED_WATCH_HINTS line for the new module (its self-test requires it); not the facade gate",
        "codemod SELF_TEST_BATTERY_FLOOR 5 -> 6 so the new battery cannot silently drop"
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "2 — pull_request_read x1, subscribe_pr_activity x1 (no GitHub MCP writes)",
      "api_writes": "2 relay writes: pr_create (run 41961803947, read back identical 8249 bytes, label skip-changeset, no assignee, draft) and this comment; plus git push (force-with-lease over my own WIP commit 84480890)",
      "open_questions": [
        { "question": "get supports (inferred object type with per-key docblocks) and static DIALECT_CONNECT_TIMEOUT (static initializer, TDZ) stay on #30147 with no 2b-2d slot. Fold into 2d, or leave for a later card?", "options": ["A fold into 2d", "B leave on #30147 after 2d and say so in the phase 3 report"], "recommendation": "B, because neither is a mechanism 2b-2d already builds, and both are small" }
      ],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-support-ai · session_01WGufzj4B2cbnRLVdgtLcDZ
    os-dev-report

    Phase 2b of 2a-2d (two by-path readers learn the sql-driver facade). 2c, 2d and phase 3 follow on this card.

    {
      "issue": 30147,
      "status": "done",
      "branch": "claude/project-thread-6gf6xi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30306",
      "session": "session_01WGufzj4B2cbnRLVdgtLcDZ",
      "premise_still_valid": true,
      "summary": "Phase 2b: check-durability-degradation-log-level.mjs gains FACADE_LOG_HOP (a facet module's this.x() through its own host interface to SqlDriver#x, and a <X>Facet.x.call(<y>Host.of(this), ...) stub to the facet body; log-level rule only, read-seam roots exclude driver-sql). sql-driver-compile-refusal-seam.test.ts reads every sql-driver-*.ts module and names a facet static SqlDriver.x. The codemod drops the logDurabilityFailure pin, the runWideningAlters needle and the 3 CLASS_PATH_READER_NEEDLES rows; regenerated from 21510bba, 4 members move. Registry 73 -> 69: #30020 17/17, #30054 16/16, #30055 6/6, #30147 34/30 (sql-driver.ts 12 -> 8). Head d3ca391c, base 9b8a5867. files_changed: 8 (durability gate, codemod, registry, compile-refusal test, sql-driver.ts + class-head, filter-helpers, rotation); 740 changed lines.",
      "tests": "Durability gate --self-test: 10 new rows (selfTest floor 70 -> 80, total 137 -> 147), all pass; controls: no hop -> moved catch reads swallowed, other dir / mistyped member / Pick omits / class imported elsewhere / stub not handed <y>Host.of(this) each resolve nowhere. Compile-refusal test 115/115 (red on the new tree before the widening). Base 9b8a5867 and head equal: driver-sql 238/12 skipped, 3,859/216 skipped; turso 97, 2,514/34; sqlite-wasm 40/750; cli 9/116; types 53, metadata 11, metadata-protocol 33, spec liveness 74; every leg VERDICT command-exit 0.",
      "proofs": "--verify --base 21510bba exit 0: 175/175 bodies, 127/127 top-level identical, undo rebuilds base, 18334 -> 10624 lines. Two --write runs tree sha256 5044055d...326c both. dts-public exit 0 pass true, index.d.ts raw-equal (92e2cfb2 both sides). typecheck 0. Durability --list at base and head: 52 seams, same verdicts; only the two runWideningAlters() seams move sql-driver.ts:5187/5281 -> sql-driver-rotation.ts:327/373, both 'recovers on one branch, loud (error via logDurabilityFailure())'. Ablation: pins removed without the hop -> those two red. tenant-chokepoint 24/21/3/4/0 (39 files) both sides. Facade gate 0 (69 rows), self-test 36.",
      "gates": "dispatch-gates --commands at d3ca391c: 74 derived, all run, all exit 0; --ran: 74 derived, 74 run, 0 NOT-MEASURED. Extra: codemod, durability, tenant-chokepoint, facade-gate self-tests, check:lean-entry-closure, eslint on changed files, all 0.",
      "deviations": [
        "the remote branch was deleted when #30249 merged, so the branch was pushed fresh (no force needed)"
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "2 — pull_request_read x1 (on #30249), subscribe_pr_activity x1 (no GitHub MCP writes)",
      "api_writes": "2 relay writes: pr_create #30306 (run 41975262777, read back identical 8088 bytes, label skip-changeset, no assignee, draft) and this comment; plus git push",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-support-ai · session_01WGufzj4B2cbnRLVdgtLcDZ
    os-dev-report

    Phase 2c of 2a-2d (the by-path readers of sql-driver.ts read the facade form). 2d and phase 3 follow on this card.

    {
      "issue": 30147,
      "status": "done",
      "branch": "claude/project-thread-6gf6xi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30363",
      "session": "session_01WGufzj4B2cbnRLVdgtLcDZ",
      "premise_still_valid": true,
      "summary": "Phase 2c: new scripts/sql-driver-split-source.mjs (+ .d.mts) returns SqlDriver as one text (each [#29520 codemod] stub's body replaced by the facet body it calls, the leaf ahead of the class; a marked stub it cannot follow throws). The five packages/cli generate-* pins and check-keyed-text-bounds read through it (no assertion changed). The codemod empties PATH_READER_PINS (2) and PATH_READER_NEEDLES (10) and adds createColumn: 'void' to EXPLICIT_RETURN_TYPES (from base dist/index.d.ts); regenerated from 21510bba, createColumn, createAuditTimestampColumn, varcharColumnChars, ensureShardTable, initObjects move. cli declares packages/drivers/driver-sql/src/sql-driver-*.ts and the reader in cross-package-test-inputs (heldBy witnesses) and turbo.json. Registry 73 -> 68: #30020 19/19, #30054 16/16, #30055 6/6, #30147 32/27 (sql-driver.ts 8 -> 3: applyFilterCondition, get supports, static DIALECT_CONNECT_TIMEOUT). Base 73 because #30264 added 4 engine.ts rows after 2b. Head d67df0b5, base bfca0efb. files_changed: 17; 2,417 changed lines.",
      "tests": "Codemod --self-test: new battery 'split readers (#30147)' 8 cases (106 in 7 batteries; floor 6 -> 7). check-keyed-text-bounds --self-test: +3 cases (battery floor 3 -> 6). Before the reader change the regenerated tree reds 28 pin cases and keyed-text-bounds exits 2. Base bfca0efb and head equal: driver-sql 238/12 skipped, 3,859/216 skipped; turso 97, 2,514/34; sqlite-wasm 40/750; cli 9/116; types 53, metadata 11, metadata-protocol 33, spec liveness 74; every leg VERDICT command-exit 0.",
      "proofs": "--verify --base 21510bba exit 0: 180/180 bodies, 129/129 top-level identical, undo rebuilds base, 18334 -> 9741 lines. Two --write runs tree sha256 0d2ba8a2...f7bf16 both. dts-public exit 0 pass true, index.d.ts raw-equal (92e2cfb2 both sides). driver-sql and cli typecheck 0. Durability --list base/head: 52 seams same verdicts, only the two runWideningAlters lines shift inside sql-driver-rotation.ts. tenant-chokepoint 24/21/3/4/0 (39 files) both sides. check-cross-package-test-inputs 0, check-ci-filter-parity 0. Facade gate 0 (68 rows), self-test 0.",
      "gates": "dispatch-gates --commands at d67df0b5: 79 derived, all run, all exit 0; --ran: 79 derived, 79 run, 0 NOT-MEASURED. Extra: codemod, keyed-text-bounds, durability, tenant-chokepoint, facade-gate self-tests, check:lean-entry-closure, eslint on changed files (0 errors), all 0.",
      "deviations": [
        "cli typecheck first exited 2 on a stale objectql dist (exports added on main); after building cli's dependencies it exits 0",
        "the remote branch was deleted when #30306 merged, so the branch was pushed fresh (no force needed)"
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "1 — subscribe_pr_activity x1 (no GitHub MCP writes)",
      "api_writes": "2 relay writes: pr_create #30363 (run 41991622362, read back identical 9433 bytes, label skip-changeset, no assignee, draft) and this comment; plus git push",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  8. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-support-ai · session_01WGufzj4B2cbnRLVdgtLcDZ
    os-dev-report

    #30147 phase 3: protocol.ts / engine.ts codemod-limit reasons (measure only)

    Measured on d67df0b5 (2c head; protocol.ts and engine.ts are the same as on origin/main bfca0efb). Nothing in either file or its codemod was changed. Line counts are whole members (signature + body). Sizes are estimates for the codemod change plus its self-test cases. The generated diff is shown separately.

    Rows by reason (#30147, after 2c)

    reason file rows members (lines)
    static-reads-class protocol.ts 9 reads this: mergesOverlayAtRead (5), registryAllowsOverlay (5), isOverlayAllowed (6), isRuntimeCreateAllowed (14), refuseOrganizationScopedWrite (4). Names the class: codeOnlySourceHint (8), codeOnlyCreateError (21), codeOnlyOverrideError (16), overlayPackageMismatchError (24). 103 lines in all
    closed-set protocol.ts 3 reconcileViewExpansions (53, reads the private static FIELD registeredViewExpansions); packagelessOverlayWriteRefusal (14) and namedBaseOverlayWriteRefusal (12), each with a local const host
    no-host-read protocol.ts 2 rethrowUnlessMetadataStoreUnprovisioned (15, reads only imports), triggerAutomation (3, one throw)
    name-taken protocol.ts 1 objectExtensionItemRefusal (15): protocol.ts also imports a binding with that name
    host-entry-predicate protocol.ts 1 packagedBaseRefusal (19): calls the type predicate isPackagedBaseRefusal(err): err is Error
    field-call engine.ts 1 homeAmountServing (39): calls the optional function field this.homeLocalizationResolver?.(id)

    Not in the order's reason list, but also on #30147:

    • protocol.ts: the 4 static OVERLAY_* / STATIC_REGISTRY_TYPES tables (39 lines). Each is a gate-reading row: an initializer that is a pure function of imports.
    • engine.ts: projectHomeAmountsOntoPatch (already a stub; its row is the gate reading a computed default), ScopedContext#derive (foreign-private) and [APP_AUTHORED_HOOK_API] (not-identifier-name).
    • sql-driver.ts: get supports and static DIALECT_CONNECT_TIMEOUT (below).

    Per reason: worth it, and the estimated size

    1. static-reads-class (9) + the 4 tables: worth it, as one extension. The sql-driver codemod already has both halves:

      • a statics forwarder (SqlDriverStatics imported AS the class name, filled in a static block), which covers the 4 that name the class;
      • a facet body run with .call(host, …), so this inside is a host. Pointing that at a statics host covers the 5 that read this.

      The protocol codemod is the E1 module-function form and has neither. The 9 statics read the 4 tables, each other and five more private statics (envWritableTypes, organizationScopedWriteRefusal, requestedOrganization, CODE_ONLY_TYPE_REMEDY, unboundOwnerPackageRefusal), so moving the tables' initializers to a module as data belongs to the same change.

      • Estimate: ~250-350 lines of protocol codemod and self-test.
      • Generated diff: ~350-450 lines.
      • Retires 13 rows.
      • Bodies stay byte-identical, because this is satisfied by the .call receiver rather than rewritten.
    2. closed-set: split.

      • The two const host locals are cheap: pick a host parameter name the body does not bind. Estimate ~40-60 lines, 2 rows, worth folding into (1).
      • reconcileViewExpansions reads a private static field. That is (1)'s statics host with a getter: about +20 lines once (1) exists, 1 row. Not worth doing alone.
    3. no-host-read (2): cheap, low value. Emit a host-less module function and a return fn(…args) stub. The sql-driver codemod already has this !usesHost stub form, and the facade gate already counts forwarding calls. Estimate ~30-50 lines.

      • triggerAutomation's body is one throw, so the stub is no shorter than the body.
      • Fold into (1) or leave both rows.
    4. name-taken (1): low value. Import the moved function under an alias (as objectExtensionItemRefusalBody), or call it through the module namespace. Estimate ~20-40 lines, 15 lines retired. Fold in, or leave.

    5. host-entry-predicate (1): cheap. Write the host entry typed as the predicate ((err: unknown) => err is Error, taken from the method's own signature) instead of a forwarding closure that erases it. Estimate ~25-40 lines, 19 lines retired. Fold into (1).

    6. field-call (1, engine.ts): worth it only with a narrow rule. sql-driver's RECEIVER_FREE_FIELDS needs a stated reason why the field's value never reads its receiver, and nothing here proves that for a HomeLocalizationResolver. The receiver-preserving alternative: a field the body only ever CALLS goes to the host as a closure, (...a) => engine.homeLocalizationResolver?.(...a). Its truthiness differs, so the rule must refuse any non-call read.

      • Here this.homeLocalizationResolver?.(id) gives undefined both ways.
      • Estimate ~60-90 lines of engine codemod and cases; 1 row, 39 lines.
      • Worth it only if engine.ts has more called fields. Count them first.

    The two sql-driver.ts rows the seat kept here

    • get supports (25 lines): not worth it. Moving it needs a written return type (MOVED_ACCESSORS). The base leaves it as an inferred object type with a docblock on each key. Writing that type on the stub drops those docblocks from the published .d.ts, so the public-.d.ts-equal proof fails. The alternative, a named exported interface, is a surface change and would need a ruling.
    • static DIALECT_CONNECT_TIMEOUT (38 lines): not worth it. The initializer runs while the class is evaluated and reads three class statics (POSTGRES_EMIT_CLIENTS, POSTGRES_WIRE_ONLY_CLIENTS, MYSQL_EMIT_CLIENTS). A facet call there meets its module in the TDZ. A leaf function cannot import the class, and passing the sets in is a body edit.
    • Recommendation: give both a terminal reason (an accepted exception) rather than a card.

    Recommendation for the seat

    If any of this is done, do one protocol-codemod PR on domain:server, sequenced after #30054/#30055 there:

    • (1) the statics host and the table move;
    • the cheap folds from (2), (3), (5) and optionally (4).

    That PR would be about 400-550 lines of codemod and tests plus ~500 generated lines, and would retire about 19 of the 20 protocol.ts rows. engine.ts field-call (6) is separate and small, and worth it only after counting the called fields. The sql-driver pair should stay as accepted exceptions.

  9. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-support-ai · session_01WGufzj4B2cbnRLVdgtLcDZ
    os-dev-report

    Phase 2d, the last of 2a-2d (the codemod writes applyFilterCondition's return type). The phase 3 measurement is posted on this card. This is the executor's last PR on #30147.

    {
      "issue": 30147,
      "status": "done",
      "branch": "claude/project-thread-6gf6xi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30441",
      "session": "session_01WGufzj4B2cbnRLVdgtLcDZ",
      "premise_still_valid": true,
      "summary": "Phase 2d: EXPLICIT_RETURN_TYPES gains applyFilterCondition: 'void' (from base dist/index.d.ts); regenerated from 21510bba, its body moves to sql-driver-filter-helpers.ts; sql-driver.ts 9741 -> 9354 lines. Registry 68 -> 67: #30020 19/19, #30054 16/16, #30055 6/6, #30147 27/26 (sql-driver.ts 3 -> 2: get supports, static DIALECT_CONNECT_TIMEOUT, both recommended as accepted exceptions in the phase 3 report). Head 322898a6, base d3f23d20. files_changed: 4; 873 changed lines.",
      "tests": "No test file changes; codemod --self-test 106 cases in 7 batteries pass (the EXPLICIT_RETURN_TYPES battery from #30249 pins the mechanism). Base d3f23d20 and head equal: driver-sql 238/12 skipped, 3,859/216 skipped; turso 97, 2,514/34; sqlite-wasm 40/750; cli 9/116; types 53, metadata 11, metadata-protocol 33, spec liveness 74; every leg VERDICT command-exit 0.",
      "proofs": "--verify --base 21510bba exit 0: 181/181 bodies, 129/129 top-level identical, undo rebuilds base, 18334 -> 9354 lines. Two --write runs tree sha256 b8a84023...0272 both, disk unchanged. dts-public exit 0 pass true, index.d.ts raw-equal (92e2cfb2 both sides). typecheck 0. tenant-chokepoint 24/21/3/4/0 (39 files) both sides. Durability --list byte-identical base/head. Facade gate 0 (67 rows), self-test 0.",
      "gates": "dispatch-gates --commands at 322898a6: 65 derived, all run, all exit 0; --ran: 65 derived, 65 run, 0 NOT-MEASURED. Extra: codemod, keyed-text-bounds, durability, tenant-chokepoint, facade-gate self-tests, check:lean-entry-closure, eslint on changed files, all 0.",
      "deviations": [
        "prepared on a local branch while #30363 was open, then cherry-picked onto fresh origin/main and regenerated there (the generated tree is the same as the cherry-pick)"
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "1 — subscribe_pr_activity x1 (no GitHub MCP writes)",
      "api_writes": "2 relay writes: pr_create #30441 (run 42019894084, read back identical 5075 bytes, label skip-changeset, no assignee, draft) and this comment; plus git push",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
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