You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Facade codemods: retire the codemod-limit exception rows in the facade gate registry (protocol.ts, engine.ts, sql-driver.ts) #30147
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.
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 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
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": []
}
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.
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": []
}
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": []
}
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": []
}
Measured on d67df0b5 (2c head; protocol.ts and engine.ts are the same as on origin/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.
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
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.
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.
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.
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_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.
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": []
}
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": [] }