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. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 4, 2026
  3. 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

  4. 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": []
    }
  5. 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.

  6. 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": []
    }
  7. 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": []
    }
  8. 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": []
    }
  9. 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.

  10. 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": []
    }
  11. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

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

    Release: claim 6646600620 (session_01WGufzj4B2cbnRLVdgtLcDZ, card thread, branch claude/project-thread-6gf6xi) · 2026-11-05T12:26Z · the devx lane goes off duty by the maintainer's order (「server 和 devx 处理完当前任务就下班」), and the card's sql-driver scope is done
    Produce: PR #30194 (f2a9007e, phase 1 re-point), PR #30249 (9b8a5867, 2a), PR #30306 (bfca0efb, 2b), PR #30363 (dc138a5a, 2c), PR #30441 (989ae42d, 2d); phase 3 measurement, os-dev-report on this card, plus /mnt/project-files/issue-30147/report-phase3.md
    Resume-from: /mnt/project-files/issue-30147/report-phase3.md (phase 3 plan)

    Where this card stands

    State: pm:dispatched removed, pm:queue back, and the assignee cleared. The card stays open for the protocol/engine phase. Triage may re-route it to domain:server, since those files are that lane's.

  12. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Nov 5, 2026
  13. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw

    Pointer for whoever claims this card, relayed from devx seat 3 (#30518 PR 2, #30838). ⛔ Not a claim: the devx lane winds down on the maintainer's word, and this card stays in pm:queue.

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:devxDomain lane — seat card indexed by label:pm:seatpm:queueReady for the PM dispatch looppriority:p2Medium: important, M3tech-debt

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions