Repository navigation
Description
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)
protocol.ts+engine.ts(landed via refactor(metadata-protocol): generate the protocol.ts section split with a deterministic codemod #29998 / refactor(objectql): generate the engine.ts section split with a deterministic codemod #30012):- inferred-return-type 16
- static-reads-class 9
- query-options erasure pin 6
- closed-set 4
- no-host-read 2
- name-taken 1
- host-entry-predicate 1
- field-call 1
sql-driver.ts(PR refactor(driver-sql): put SqlDriver into facade form with the sql-driver codemod (sql-driver.ts 18,334 -> 10,979, body-identical) #30139, when it lands):- path-reader pin 9
- accessor 5
- knex field-call 4
- inferred-return-type 4
- computed parameter default 2
- comment in parameters 1
Wanted
- Re-point every codemod-limit row to this card, leaving state-owning rows on refactor: move shared state out of the protocol.ts and engine.ts facades into state-owning facets, so the hot bodies left on the class can become delegations (ruling 6624345766) #30020.
- Per reason, either extend the codemod so the member becomes a delegation, or record why it stays a body. Examples:
- write an explicit return type into the generated facet;
- make the by-path pins read the facet module;
- handle accessors with a get/set delegation.
- For each change: byte-identity of moved bodies, public
.d.tsEQUAL, the facade gate exit 0 with the row removed, plus the touched packages' suites.
Out of scope (⛔)
- State-owning bodies (refactor: move shared state out of the protocol.ts and engine.ts facades into state-owning facets, so the hot bodies left on the class can become delegations (ruling 6624345766) #30020).
- Moving docblocks (refactor: move the private docblocks of the hand-series stubs into their hand modules — about 1,900 lines off engine.ts (86 stubs) and about 4,000 off protocol.ts (157 stubs) #30053).
Dedupe (open and closed): facade exception, codemod limit, facade-delegation-registry. Nearest: #30020 (state-owning facets), #30053 (docblocks), #30019 (the gate, closed). New.
Activity
tooling(facade): card the 25 codemod-limit SqlDriver exception rows on …
objectstack-fleet commentedon Nov 4, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 ·
domain:devxkept ·pm:queue· 2026-11-04T16:54Z⛔ Not a claim.
scripts/facade-delegation-registry.json) cite refactor: move shared state out of the protocol.ts and engine.ts facades into state-owning facets, so the hot bodies left on the class can become delegations (ruling 6624345766) #30020, but they are bodies because of codemod limits, not because of facet state. A further 25 come fromsql-driver.ts(PR refactor(driver-sql): put SqlDriver into facade form with the sql-driver codemod (sql-driver.ts 18,334 -> 10,979, body-identical) #30139). Under ruling 6624345766 item 3, each row must name the card that retires it, so this card re-points them. p2, as the programme.as anysites in engine.ts's six erasure-pinned methods so the codemod can move them (about 550 lines) #30055 (the query-options erasure pins) already retire two of these reasons onengine.tsandprotocol.ts. Re-point those rows at them rather than re-doing that work here. Serial with them on the same files.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
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; seatsession_01WGufzgBDcBNVmSmo7VFHpj)Account:
os-support-aiBranch:
claude/project-thread-6gf6xi(harness-pinned card-thread branch; platform exception toclaude/issue-<n>-<slug>)Worktree: the card thread's own container checkout
Domain:
domain:devxSeat:
domain:devx#1Ruling-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.mjsand the generatedpackages/drivers/driver-sql/src/sql-driver.tsplus 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: highClause-②: 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
maine826e779: 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
objectstack-fleet commentedon Nov 5, 2026
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": [] }chore(scripts): the six sql-driver.ts inferred-return-type rows go to…
objectstack-fleet commentedon Nov 5, 2026
domain:devx#1 · os-support-ai · session_01WGufzgBDcBNVmSmo7VFHpj
Phase 1 landed ·
domain:devx#1· 2026-11-05T02:10Zf2a9007evia the merge queue (seat record on57a3127d)origin/main:scripts/facade-delegation-registry.jsonState: the card stays open and
pm:dispatchedstays. 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:applyFilterCondition.Phase 3, measuring the protocol.ts / engine.ts reasons, follows. Changing those files needs the seat's call.
refactor(driver-sql): the sql-driver codemod retires 15 facade-gate e…
objectstack-fleet commentedon Nov 5, 2026
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": [] }objectstack-fleet commentedon Nov 5, 2026
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": [] }objectstack-fleet commentedon Nov 5, 2026
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": [] }objectstack-fleet commentedon Nov 5, 2026
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 onorigin/mainbfca0efb). 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)
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 allregisteredViewExpansions); packagelessOverlayWriteRefusal (14) and namedBaseOverlayWriteRefusal (12), each with a localconst hostthrow)isPackagedBaseRefusal(err): err is Errorthis.homeLocalizationResolver?.(id)Not in the order's reason list, but also on #30147:
static OVERLAY_*/STATIC_REGISTRY_TYPEStables (39 lines). Each is a gate-reading row: an initializer that is a pure function of imports.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).get supportsandstatic DIALECT_CONNECT_TIMEOUT(below).Per reason: worth it, and the estimated size
static-reads-class (9) + the 4 tables: worth it, as one extension. The sql-driver codemod already has both halves:
SqlDriverStaticsimported AS the class name, filled in a static block), which covers the 4 that name the class;.call(host, …), sothisinside is a host. Pointing that at a statics host covers the 5 that readthis.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.thisis satisfied by the.callreceiver rather than rewritten.closed-set: split.
const hostlocals are cheap: pick a host parameter name the body does not bind. Estimate ~40-60 lines, 2 rows, worth folding into (1).reconcileViewExpansionsreads 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.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!usesHoststub form, and the facade gate already counts forwarding calls. Estimate ~30-50 lines.triggerAutomation's body is onethrow, so the stub is no shorter than the body.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.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).field-call (1, engine.ts): worth it only with a narrow rule. sql-driver's
RECEIVER_FREE_FIELDSneeds a stated reason why the field's value never reads its receiver, and nothing here proves that for aHomeLocalizationResolver. 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.this.homeLocalizationResolver?.(id)givesundefinedboth ways.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 for the seat
If any of this is done, do one protocol-codemod PR on
domain:server, sequenced after #30054/#30055 there: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.
objectstack-fleet commentedon Nov 5, 2026
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": [] }objectstack-fleet commentedon Nov 5, 2026
domain:devx#1 · os-support-ai · session_01WGufzgBDcBNVmSmo7VFHpj
Release: claim 6646600620 (
session_01WGufzj4B2cbnRLVdgtLcDZ, card thread, branchclaude/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 doneProduce: 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.mdResume-from:
/mnt/project-files/issue-30147/report-phase3.md(phase 3 plan)Where this card stands
sql-driver.tsis 9,354 lines onmain(10,979 when Codemod split: put driver-sql sql-driver.ts into facade form with a deterministic script, like protocol.ts and engine.ts #30105 landed). Exception rows onmain: 88 at the start, 67 now..call(host)facet receiver. That is about 400-550 tooling lines plus about 500 generated. It touchesdomain:serverfiles, so it should run after refactor: give the inferred-return-type public methods on the engine.ts and protocol.ts facades explicit return types (.d.ts unchanged), so the codemod can move their bodies #30054 and refactor: sweep the #4918as anysites in engine.ts's six erasure-pinned methods so the codemod can move them (about 550 lines) #30055, which work on the same files.homeAmountServingfield-call, count engine.ts's called-only fields first. A narrow forwarding-closure rule costs about 60-90 lines.get supportsandstatic DIALECT_CONNECT_TIMEOUT. Measured as not worth retiring. Spellingsupports' type drops the per-key docblocks from the public.d.ts. The static initializer hits the class TDZ. Phase 3 recommends making both terminal accepted exceptions. ⛔ That needs the maintainer's ruling, because ruling 6624345766 item 3 wants a retiring card for every row.State:
pm:dispatchedremoved,pm:queueback, and the assignee cleared. The card stays open for the protocol/engine phase. Triage may re-route it todomain:server, since those files are that lane's.fix(metadata-protocol): host-split refuses an instance method read as…
objectstack-fleet commentedon Nov 6, 2026
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.getDiscovery's row inscripts/facade-delegation-registry.jsonunder Facade codemods: retire the codemod-limit exception rows in the facade gate registry (protocol.ts, engine.ts, sql-driver.ts) #30147 instead of moving it.typeof this.searchAll === 'function'to setcapabilities.search. A host entry forwards a method through a closure that is always a function, so the moved body would advertise search on every host.discovery-search-capability-agreement.test.ts(rest) caught it, andhost-split.mjsnow refuses an instance method read as a value.typeof this.searchAll === 'function'in as an argument.