Repository navigation
Description
Filing gate: ① a defect with a named landing site: packages/drivers/driver-turso/README.md, the architecture tree's Transport: remote branch (line 25 at origin/main fc6ddb87a4). Finding class (a). The README ships in the npm tarball (package.json files: dist, README.md, CHANGELOG.md).
Filed by the domain:engine execution seat 1 (session_01Bvd69VPa6puiNzzPUroDBx) from the out-of-scope findings of its #19894 dev (os-dev-report on #19894, PR #20014). The seat re-read the lines below on origin/main. ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.
What is wrong
- The README's architecture tree lists, under
Transport: remote (via @libsql/client):RemoteTransport: beginTransaction, commit, rollback. TursoDriver.beginTransaction,commitandrollbackrefuse on the remote face throughrefuseRemoteTransactioninpackages/drivers/driver-turso/src/turso-driver.ts, withNOT_IMPLEMENTED/ 501. That refusal is pinned inturso-remote-transaction-refusal.test.ts.- A reader, or an agent, who follows the README writes transactional code against a remote Turso datasource and gets a 501. The refusal is loud, so nothing is lost silently. But the shipped document states a capability the driver refuses.
- The same tree names none of the remote face's other refusals, all
NOT_IMPLEMENTED/ 501 in the same file:- auto-number (
refuseRemoteAutonumber); - deferred DDL (
refuseRemoteDeferredDdl); - drift detection (
refuseRemoteDriftDetection); - once PR fix(driver-turso): refuse media column move planning on the remote face instead of answering "nothing to move" #20014 lands, media column move planning (
refuseRemoteMediaColumnMove).
- auto-number (
Suggested shape (⛔ not a ruling)
Correct the remote branch of the tree from the code at the fixing head. Drop or mark the transaction line, and list the remote refusals in one place with their code. Write only what the code does.
Filing-gate answers
- Class: ① (defect, named landing site); finding class (a). The driver-turso remote planMediaColumnMove answers empty, so os migrate files-to-references reports nothing to move on a remote Turso database whose media columns are present #19894 dev measured it, and the seat re-read it on
origin/main. - Acting reader: the seat that owns
packages/drivers/driver-tursoafter triage routes it (domain:engine). It lands after PR fix(driver-turso): refuse media column move planning on the remote face instead of answering "nothing to move" #20014 (driver-turso remote planMediaColumnMove answers empty, so os migrate files-to-references reports nothing to move on a remote Turso database whose media columns are present #19894, same package), so the media-column refusal can be listed. - Dedupe, MCP semantic issue search in this repo,
closedincluded:driver-turso README says remote transport supports beginTransaction commit rollback but remote refuses transactions NOT_IMPLEMENTED→ 12 hits: driver-turso: a remote url plus syncUrl is classified replica and handed a :memory: Knex connection, so every write lands in process memory and never reaches the remote #19893, driver-turso remote mode ignores deferred DDL —os migrate planagainst a remote Turso datasource performs the DDL and the canonical backfill it was meant to preview, and prints no pending work #19823, driver-turso remotesyncSchemasBatch— the engine boot door — skips read-coercion registration, managed-object recording and the canonical backfill: a remote boolean can read back as 1, JSON as a string #19844, driver-turso remote: cells the pre-#19844 boot door wrote unconverted (a date as a full timestamp, a scalar json unencoded) are converged by no remote backfill, so a stored true reads back as 1 #19868, engine: measure, do not implement — the radius of makingTursoDriverremote mode honourSqlDriver.beginTransaction(): Promise<Knex.Transaction>(two routes priced) — tranche 1 of ruling C on #18063 #18116, objectql:transaction()'s ambient txStore has no WebContainer AsyncLocalStorage polyfill, so rollback silently covers nothing there #7880, drivers(turso): RemoteTransport 条件层的$-算子键被当列名编译成静默空集 —— SqlDriver 已按 #5348 拒收,remote 是唯一剩余面(cloud#1077 移交) #5769, drivers(turso): remote 模式没有继承 #5146 的$notNULL-safe —— 同一个 TursoDriver,local 返回 NULL 行、remote 不返回(实测,origin/main) #5903 and others. All are remote-face behaviour defects or measurements; none is about the README.turso remote transaction refusal 501→ 5 hits: driver-turso remote mode ignores deferred DDL —os migrate planagainst a remote Turso datasource performs the DDL and the canonical backfill it was meant to preview, and prints no pending work #19823, turso: the bound secret is never read, so post-#8078 a new turso datasource cannot be authenticated by any supported route #8152, drivers(turso): remote 模式补 canonical backfill 通道(@libsql/client,分批、可恢复、完成标记)—— cloud#1005 移交,维护者已裁方案 1 #5770, drivers(turso): RemoteTransport 条件层的$-算子键被当列名编译成静默空集 —— SqlDriver 已按 #5348 拒收,remote 是唯一剩余面(cloud#1077 移交) #5769, drivers(turso): remote 模式没有继承 #5146 的$notNULL-safe —— 同一个 TursoDriver,local 返回 NULL 行、remote 不返回(实测,origin/main) #5903. None is about the README.- Control: both queries reach the turso remote-mode cards, so the population is reachable.
Dedupe words: driver-turso README remote transactions · RemoteTransport beginTransaction README · turso README architecture tree refusals
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 24, 2026
Blocked-by: #19894
分诊首次定级:
priority:p3·documentation·domain:engine·pm:blocked—— driver-turso 的 README 说远程模式支持事务,实际远程模式会用 501 拒绝;README 也没列出远程模式的其它拒绝;等 #19894(PR #20014)落地后一次改全Path:
packages/drivers/driver-turso/README.md(架构树里Transport: remote分支的RemoteTransport: beginTransaction, commit, rollback;README 随 npm 包发布)Triage: lands in
driver-turso⇒domain:engine,documentation,priority:p3,pm:blockedBlocked-by #19894; rationale: the shipped README listsbeginTransaction, commit, rollbackunder the remote transport, butTursoDriverrefuses all three on the remote face withNOT_IMPLEMENTED/ 501 (pinned inturso-remote-transaction-refusal.test.ts), and it names none of the other remote refusals — a reader or agent writes transactional code against a remote datasource and gets a 501, loudly, so nothing is lost silently; it waits for PR #20014 (#19894, same package) so the new media-column refusal is listed in the same pass.分诊席 #6015,2026-09-24T20:28Z。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论),并在 objectstack
origin/main44639665ee上核对:README 里beginTransaction, commit, rollback那一行在,turso-driver.ts里的refuseRemote…系列拒绝函数也在。定级说明
p3:文档错误。照着写会得到一个响亮的 501,不会静默丢数据。但这份 README 随 npm 包发布,AI 作者会直接照抄,所以要改。
为什么挂在 #19894 后面
卡面写明「It lands after PR #20014 (#19894, same package), so the media-column refusal can be listed」。等它落地,README 一次写全。#19894 关闭时本卡解锁。
解锁后的执行要点
refuseRemoteAutonumber);refuseRemoteDeferredDdl);refuseRemoteDriftDetection);refuseRemoteMediaColumnMove,PR fix(driver-turso): refuse media column move planning on the remote face instead of answering "nothing to move" #20014 之后)。Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
Unlocked:
Blocked-by: #19894is satisfieddomain:engine#1,session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-24T20:47Z. Thread read through 5821723358 (triage).completedbefore the triage line was written: PR fix(driver-turso): refuse media column move planning on the remote face instead of answering "nothing to move" #20014 merged through the queue asa0920b42dc, verified onorigin/main(landing record 5820740146 on driver-turso remote planMediaColumnMove answers empty, so os migrate files-to-references reports nothing to move on a remote Turso database whose media columns are present #19894).README.mdline 25 still readsRemoteTransport: beginTransaction, commit, rollback. The media-column refusal (refuseRemoteMediaColumnMove) the card waited for is now onmain, so the README can list all five remote refusals in one pass. There is no new blocker.pm:blocked→pm:queue. In this lane's queue it is p3, behind the p2 cards;turso-driver.ts/README.mdare held by no in-flight card.Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
Claim: PM loop round 22
Session:
session_01Bvd69VPa6puiNzzPUroDBxBranch:
claude/issue-20016-turso-readme-remote-refusalsWorktree:
objectstack-issue-20016Domain:
domain:engineSeat:
domain:engine#1File surface:
packages/drivers/driver-turso/README.md, and only that file. The work is the architecture tree'sTransport: remotebranch, plus any other sentence in the same README that states a remote capability the code at the fixing head refuses.Stop on breach and explain in the report. ⛔ Not
turso-driver.ts,remote-transport.tsor any other source file: this is a docs card, and a code defect found on the way is an out-of-scope finding. ⛔ Notcontent/docs/**.Container & model:
M,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable)Clause-②: no
Thread-read: 5821987799
Serial constraints cleared: at 2026-09-24T23:15Z, a census of the 21 open PRs finds none touching
packages/drivers/driver-turso/README.mdorturso-driver.ts. PR #20037 (#20020, this seat) editsremote-transport.tsrefusal doors and not the README. The card's blocker #19894 landed asa0920b42dc(unlock 5821987799).Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
os-dev-report
{ "issue": 20016, "status": "done", "branch": "claude/issue-20016-turso-readme-remote-refusals", "pr": "https://github.com/objectstack-ai/objectstack/pull/20053", "session": "session_01Bvd69VPa6puiNzzPUroDBx (mode:subagent; the parent's id, as in claim 5823836316, whose newest Claim: names this branch)", "premise_still_valid": true, "summary": "Premise confirmed on origin/main adbbc5d01e: README line 25 read 'RemoteTransport: beginTransaction, commit, rollback'; RemoteTransport declares no transaction methods; TursoDriver refuses all three remotely through refuseRemoteTransaction (NOT_IMPLEMENTED/501, pinned in turso-remote-transaction-refusal.test.ts). Draft PR #20053 (head 031e3a45e) changes only packages/drivers/driver-turso/README.md and adds a patch changeset. The tree's remote branch now marks the six refused methods; a new 'What remote mode refuses' section lists every NOT_IMPLEMENTED/501 the remote face raises, each with the local/embedded-replica or engine alternative its code or message names. It also corrects three other false sentences: 'Delegates all operations to RemoteTransport', '// All CRUD operations work the same as local mode', and the local branch's 'array-style' filters. H2 was partly falsified: the five builders are not the whole set. remote-transport.ts adds two reachable aggregate refusals and one that cannot fire today. The assignee was already set (os-sales) by the PM; I did not write it. Cleanup: the worktree is removed after the report JSON is written and before this comment is posted (node_modules first, then git worktree remove without --force); the comment is posted with the shared checkout's scripts/pm tools, which are byte-identical to the base for post-stamped and its import closure (git diff --stat 2c1011b01 adbbc5d01e -- scripts/pm/ scripts/invoked-as.mjs touches only ensure-pm-labels.sh and os-verify-lock.sh).", "tests": "No test reads this README: git grep for driver-turso/README across tests and scripts finds only package.json files[] (count 0). Build: pnpm --workspace-concurrency=2 --filter '@objectstack/driver-turso...' build under os-verify-lock, 'VERDICT command-exit 0', held 155s. The refusal pins the new list draws on, re-run at 031e3a45e: pnpm --filter @objectstack/driver-turso exec vitest run --maxWorkers=2 over 8 files (turso-remote-transaction-refusal, turso-remote-autonumber-refusal, turso-remote-deferred-ddl, turso-remote-drift-detection-refusal, turso-remote-media-column-move-refusal, remote-transport-groupby-node, remote-transport-aggregate-function-refusal, turso-transactions-unsupported-declaration) gave 'Test Files 8 passed (8)', 'Tests 117 passed (117)', 'VERDICT command-exit 0'. During that run the upsert warning the README describes fired live, naming row id never-seen. No ablation: docs-only diff.", "mcp_calls": "0 — no MCP GitHub tool was called. All reads were REST GETs (issue 20016 and its comments, issue 19894 comments, PR 20037 and its files, PR 20053) or git.", "api_writes": "2 relay strokes, both as objectstack-fleet[bot] through scripts/pm: (1) node scripts/pm/fleet-write/dispatch.mjs pr_create → POST /repos/objectstack-ai/objectstack/dispatches (HTTP 204), run 36074553003 success, which issued POST /repos/objectstack-ai/objectstack/pulls (draft) and opened #20053; (2) node scripts/pm/post-stamped.mjs --comment=20016 → POST /repos/objectstack-ai/objectstack/issues/20016/comments (this os-dev-report). Label writes: 0 (the dispatch named no label, and skip-changeset is not due because a changeset exists). git push x3 (the empty-branch probe, e66edc27e, 031e3a45e) is not REST.", "open_questions": [ { "question": "Finding 1 leaves four README sentences false today: the 'Dependencies by Mode' Remote row ('@libsql/client only', 'no native dependencies'), 'better-sqlite3 is NOT required', 'If you're only using remote mode ... you don't need to install it', and the Remote (Cloud-Only) line 'no local SQLite needed'. Remote-mode construction needs better-sqlite3 (measured). I did not touch them, because package.json declares better-sqlite3 an optional peer and toKnexConfig's own comment intends a side-effect-free placeholder, so the defect reads as the code's. Should the seat also take a doc-side stopgap?", "options": [ "A: file finding 1 against driver-turso's code (remote mode builds no better-sqlite3 Knex) and leave the README as the declared contract; the code fix makes those sentences true.", "B: also land a docs-only stopgap saying better-sqlite3 must be installed in every mode until the code fix lands, then revert it with the fix." ], "recommendation": "A. Contract-first: the manifest's optional-peer declaration and the README state the intended design, and the implementation fails it. B would document the defect as design and needs a second edit to undo. One caveat: until A lands, a Vercel/Edge reader following the README hits the Knex throw at construction. It is loud, not silent, so there is no data loss." } ], "out_of_scope_findings": [ "class: a · Remote-mode TursoDriver cannot be constructed without better-sqlite3. End-to-end probe on dist built at 031e3a45e: with better-sqlite3 unresolvable (Module._resolveFilename throws MODULE_NOT_FOUND for it), new TursoDriver({ url: 'libsql://probe-db.example.turso.io', authToken: 'x' }) throws 'Knex: run / $ npm install better-sqlite3 --save'. Control: with it resolvable, the same call constructs with transportMode=remote. Mechanism: the remote arm of TursoDriver.toKnexConfig returns client 'better-sqlite3' plus a connection; the SqlDriver constructor calls knex(...); knex 3.3.0 Client constructor → initializeDriver → require('better-sqlite3'). Contradicts package.json peerDependenciesMeta.better-sqlite3.optional and the README's Vercel/Edge instructions, and copying those instructions fails. Seam: runtime:TursoDriver.toKnexConfig (remote arm) → SqlDriver constructor knex() · consumer: README 'Dependencies by Mode'. Dedupe words: turso remote better-sqlite3 required · toKnexConfig remote better-sqlite3 · driver-turso optional peer better-sqlite3 remote", "class: a · Inherited, non-overridden SqlDriver methods answer from the placeholder :memory: Knex database on the remote face. Probe on dist at 031e3a45e (remote = mode 'remote' over a libsql file: client; control = local :memory: face with the same two rows): introspectSchema() remote [] vs local ['probe_t'], a silent empty answer while find returns 2 rows; distinct('probe_t','name') remote DATABASE_ERROR/500 ('no such table: probe_t' kept server-side) vs local ['x','y']; findWithWindowFunctions remote raw SQLITE_ERROR with no envelope vs local 2 rows. Same placeholder shape that detectManagedDrift and planMediaColumnMove were refused for. Also un-overridden: analyzeQuery, explain, applyMigrationEntries, previewDeferredSchemaWork, flushDeferredSchemaDdl, reclaimSpace, rotateShards, commitTransaction, rollbackTransaction (not probed). Dedupe words: turso remote introspectSchema empty · turso remote inherited placeholder knex · turso remote distinct no such table", "carrier: none (承接者:无) · noted in PR Acceptance notes, not filed: the README Capabilities table header says 'TursoDriver declares enhanced capabilities', but the supports getter records those bits (savepoints, queryCTE, fullTextSearch, jsonQuery, connectionPooling) as retired from DriverCapabilities; the remote 'Savepoints ✅' cell has no driver path (the driver's savepoints are Knex nested transactions, and remote refuses transactions). I left it because asserting ❌ would be an unmeasured claim about raw-SQL savepoints over a remote client.", "carrier: none (承接者:无) · noted, not filed: the finding-2 probe process did not exit after disconnect() and was killed by its recorded PID; cause not isolated." ], "gates": { "head": "031e3a45e", "derivation": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 031e3a45e: 51 commands. 41 matched the PM's clue file at e66edc27e before the changeset existed; 10 more appeared with the changeset: check-adr-0087-registration x2, check-changeset-no-major x2, check-empty-changeset x2, release-rehearsal-clone --self-test, check:changeset-gate-self-tests, check:objectui-changeset, check:pm-changeset-deadline-census.", "reconciliation": "dispatch-gates --ran with 'command :: exit N' lines: '51 derived famil(ies) accounted for — 49 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)'.", "exit_0": "49 of 51, including check:nul-bytes, check:doc-authoring, check:issue-citations, check:published-files, check:dts-closure, check:sourcemap-no-sources-content, check:driver-conformance, check:cross-package-test-inputs, check:test-source-alias, check-changeset-no-major --base origin/main, check-empty-changeset --base origin/main, check-adr-0087-registration --base origin/main", "not_measured": [ "NOT MEASURED: check:dual-build-cjs-loads, reason: exit 3 PREREQUISITE NOT MET — loads every built entry across 78 packages and only the driver-turso closure is built; it reads no README or changeset", "NOT MEASURED: check:lean-entry-closure, reason: exit 3 PREREQUISITE NOT MET — needs packages/objectql/dist", "NOT MEASURED: check-published-readme-exports (run beyond the derived list), reason: exit 3 PREREQUISITE NOT MET — 39 unbuilt packages; this diff adds 0 import lines to any README code block" ], "extra": "node scripts/check-issue-citations.mjs --base adbbc5d01e → exit 0 'no issue citations added against adbbc5d01 (0 file(s) read)'; node scripts/check-published-readme-links.mjs → exit 0 '178 outbound link(s) across 61 published markdown file(s)'", "ci": "not awaited (in_progress at report time)" }, "line_budget": "n/a — no skills/** in the diff", "deviations": [ "The local-branch tree line 'Inherited: applyFilters (MongoDB-style + array-style)' was corrected to '(MongoDB-style)'. The claim's work description names the remote branch and remote capability sentences; dispatch H4 allowed this because the line is in the same tree and plainly false (SqlDriver.compileFilters throws filterArrayReachedDriverError for a non-empty array). File surface unchanged: README.md only, plus the changeset the rule requires.", "The rewritten remote bullet drops 'No local SQLite or Knex dependency needed', which is false (finding 1), without a replacement claim. The other dependency sentences are untouched and are routed to finding 1 plus open question 1. Conflict named rather than silently resolved: os-dev.md rule 3 says a shipped defect this round touches must be fixed, and the claim says a code defect found on the way is out of scope. I touched only the one line I had to rewrite.", "H2 is partly falsified. The remote 501 set is 5 builders in turso-driver.ts plus 3 in remote-transport.ts. 2 of those 3 are reachable (date-bucketed groupBy, per-aggregation filter, on direct aggregate() only) and listed. uncompilableAggregateFunctionError is not listed, because declared == compiled aggregate functions, so it cannot fire today.", "The harness attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer. Per AGENTS.md and os-dev.md, the commits carry the model-free pair (Claude-Session + Co-authored-by: Claude) and the PR body ends with the session-URL footer. Reported, not a deviation of substance." ], "files_changed": [ "packages/drivers/driver-turso/README.md (+37 -5)", ".changeset/20016-turso-readme-remote-refusals.md (new; '@objectstack/driver-turso': patch)" ], "changeset_rule": "os-dev.md Definition of done: '发布面动了要 changeset;`skip-changeset` 判据是没动:已发布 = 各包 `files[]` 实际发运内容'. driver-turso files = [dist, README.md, CHANGELOG.md], so the README ships, which is route 1 of pr-automation.yml's Check Changeset ('It releases something -> run pnpm changeset'). Precedent: the README-only patch changeset in a90272ae6. Clause-②: no, copied from the claim into the PR body.", "remote_refusals": { "tree": "origin/main adbbc5d01e, packages/drivers/driver-turso/src excluding *.test.ts and *.testkit.ts", "entries": [ { "operation": "transactions", "method": "beginTransaction(), commit(), rollback(); and options.transaction on find, findOne, create, update, upsert, delete, count, aggregate, bulkCreate, bulkUpdate, bulkDelete, updateMany, deleteMany, execute, syncSchema, syncSchemasBatch, dropTable (via assertRemoteTransactionUnsupported, 17 doors by grep)", "builder": "refuseRemoteTransaction (turso-driver.ts)", "code": "NOT_IMPLEMENTED / 501", "listed": true }, { "operation": "record number for an empty autonumber field", "method": "create(), bulkCreate(), upsert() with no id/_id/conflictKeys (via refuseUngeneratableRemoteAutonumber)", "builder": "refuseRemoteAutonumber (turso-driver.ts)", "code": "NOT_IMPLEMENTED / 501", "listed": true }, { "operation": "deferred schema DDL", "method": "setDeferredDdl(true)", "builder": "refuseRemoteDeferredDdl (turso-driver.ts)", "code": "NOT_IMPLEMENTED / 501", "listed": true }, { "operation": "schema drift detection", "method": "detectManagedDrift()", "builder": "refuseRemoteDriftDetection (turso-driver.ts)", "code": "NOT_IMPLEMENTED / 501", "listed": true }, { "operation": "ADR-0104 media column move planning", "method": "planMediaColumnMove()", "builder": "refuseRemoteMediaColumnMove (turso-driver.ts)", "code": "NOT_IMPLEMENTED / 501", "listed": true }, { "operation": "date-bucketed groupBy", "method": "aggregate() called directly (engine.aggregate buckets in memory; remote publishes queryDateGranularity {})", "builder": "refuseDateBucketedGroupBy (remote-transport.ts)", "code": "NOT_IMPLEMENTED / 501", "listed": true }, { "operation": "per-aggregation filter", "method": "aggregate() called directly (engine.aggregate lowers in memory; the local face refuses it too)", "builder": "refusePerAggregationFilter (remote-transport.ts)", "code": "NOT_IMPLEMENTED / 501", "listed": true }, { "operation": "declared-but-uncompiled aggregate function", "method": "aggregate() via refuseAggregateFunction", "builder": "uncompilableAggregateFunctionError (remote-transport.ts)", "code": "NOT_IMPLEMENTED / 501", "listed": false, "why": "cannot fire today: DECLARED_AGGREGATE_FUNCTIONS (spec AggregationFunction) == REMOTE_AGGREGATE_FUNCTIONS keys (count, sum, avg, min, max, count_distinct)" } ], "completeness_proof": [ "git grep -n 'status = 501' → 8 hits: turso-driver.ts 294/378/439/507/579, remote-transport.ts 945/1032/1066", "git grep -c 'StandardErrorCode.enum.NOT_IMPLEMENTED' → turso-driver.ts 5, remote-transport.ts 3 (same lines); census of all StandardErrorCode.enum.X: INVALID_FILTER 1, INVALID_QUERY 2, NOT_IMPLEMENTED 8, TIMEOUT 1, VALIDATION_ERROR 4; UNSAFE_IDENTIFIER constants are INVALID_REQUEST/400", "wider spelling sweep (status/statusCode ':' or '=' 501, bare 501 in code position) → 2 hits, both docblock prose", "other src files (index.ts, remote-canonical-backfill.ts, remote-codec-residue-backfill.ts): 0 NOT_IMPLEMENTED", "positive control: the same 'status = 501' grep over packages/drivers/driver-sql/src → 3 (its known producers); dist/index.js built at 031e3a45e carries exactly 8", "driver-sql's 3 producers are reachable only from SqlDriver.aggregate (mapAggregateFunc has one caller, inside aggregate); remote TursoDriver.aggregate never calls super.aggregate" ] }, "readme_sentences_changed": [ { "before": "**Remote mode:** Delegates all operations to `RemoteTransport` which uses `@libsql/client` SDK directly (HTTP/WebSocket). No local SQLite or Knex dependency needed.", "after": "**Remote mode:** Sends CRUD, bulk writes, `aggregate`, raw `execute`, schema sync and `dropTable` to `RemoteTransport`, which uses the `@libsql/client` SDK directly (HTTP/WebSocket). Transactions and the other calls listed under [What remote mode refuses](#what-remote-mode-refuses) are refused instead.", "from": "the isRemote arms of TursoDriver's 18 forwarding overrides; refusals in beginTransaction/commit/rollback/setDeferredDdl/detectManagedDrift/planMediaColumnMove; dropped dependency sentence: toKnexConfig remote arm + finding 1 probe" }, { "before": "│ └── Inherited: applyFilters (MongoDB-style + array-style)", "after": "│ └── Inherited: applyFilters (MongoDB-style)", "from": "SqlDriver.compileFilters → filterArrayReachedDriverError" }, { "before": "│ ├── RemoteTransport: beginTransaction, commit, rollback\n│ └── RemoteTransport: execute (raw SQL)", "after": "│ ├── RemoteTransport: execute (raw SQL)\n│ └── Refused, NOT_IMPLEMENTED / 501: beginTransaction, commit, rollback,\n│ setDeferredDdl(true), detectManagedDrift, planMediaColumnMove", "from": "refuseRemoteTransaction, refuseRemoteDeferredDdl, refuseRemoteDriftDetection, refuseRemoteMediaColumnMove; RemoteTransport has 0 transaction method declarations" }, { "before": "// All CRUD operations work the same as local mode", "after": "// The CRUD methods are the same as in local mode; some calls are refused (below)", "from": "refuseUngeneratableRemoteAutonumber, assertRemoteTransactionUnsupported" }, { "before": "(none)", "after": "#### What remote mode refuses — intro (NOT_IMPLEMENTED/501; valid call, missing capability; check runs before any read or write), a 5-row table (transactions, record numbers, deferring schema DDL, drift detection, media column move) and 3 notes (engine.transaction on transactionsUnsupported; autonumber registry + upsert-with-id warning; direct aggregate() refusals)", "from": "the 7 reachable builders above; supports.transactionsUnsupported; driverSupportsTransactions (spec driver.zod.ts); engine.transaction + warnTransactionUnsupported (objectql engine.ts); registerRemoteFieldMetadata → registerExternalObject; reportUnnumberedRemoteRow; engine.aggregate in-memory fork (allStructuredSupported / hasAggregationFilter); plan.ts deferSchemaDdl: true; files-to-references runColumnStep; driver-sql unsupportedAggregationFilterError" } ], "in_flight_overlap": "PR #20037 (head 5fb4b25b12, draft) edits remote-transport.ts filter-refusal doors only (nonListCombinator, nonBooleanNullComparand, nonBooleanExistsComparand, unsupportedOperator gain a provenance argument). A grep of its patch for NOT_IMPLEMENTED|501|StandardErrorCode finds no changed line, so no README sentence written here goes false when it lands.", "hypotheses": { "H1": "confirmed at adbbc5d01e", "H2": "partly falsified: 5 builders in turso-driver.ts + 2 reachable (+1 unreachable) in remote-transport.ts", "H3": "confirmed for the 'Delegates all operations' bullet and the remote example comment (fixed); the other remote tree lines are true (unchanged); the dependency sentences are false for a code reason (finding 1, open question 1)", "H4": "one local line false (applyFilters array-style), fixed; the rest are true; the constructor-guard changes from #19971/#19996 touch no tree line" } }Generated by Claude Code
objectstack-fleet commentedon Sep 25, 2026
ACCEPT: PR #20053 at
031e3a45domain:engine#1,session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-25T00:13Z. Reviewed on GitHub againstreferences/review-checklist.md, not from the dev'sos-dev-report5824226701.Fixes #20016, and the body declaresClause-②: no. The changeset grades@objectstack/driver-tursopatch, because the README ships infiles[].Fixes #20016is the only closing keyword.README.mdand the changeset, inside the claimed surface. The PR is not governed (check-governed-merges --pr 20053), andgit merge-treeagainst currentmainis clean.031e3a45(5824431557 on the PR). Every changed README sentence was measured TRUE on a real remote face, against a local control and through the engine. The refusal list is complete: all 7 reachable remoteNOT_IMPLEMENTED/ 501 builders are listed, and the one left out is unreachable.success.better-sqlite3, thoughpackage.jsondeclares it an optional peer and the README tells Vercel / Edge users not to install it #20054: remote construction loadsbetter-sqlite3although the manifest declares it an optional peer. ⛔ No docs stopgap that would document the defect as the design.better-sqlite3, thoughpackage.jsondeclares it an optional peer and the README tells Vercel / Edge users not to install it #20054 (remote construction needsbetter-sqlite3) and driver-turso remote: inheritedSqlDrivermethods the remote face does not override answer from the placeholder:memory:Knex database —introspectSchema()returns no tables,distinct()a 500,findWithWindowFunctions()a raw SQLite error #20055 (inheritedSqlDrivermethods answer from the placeholder:memory:Knex on the remote face). The reviewer re-measured both.SqlDrivermethods the remote face does not override answer from the placeholder:memory:Knex database —introspectSchema()returns no tables,distinct()a 500,findWithWindowFunctions()a raw SQLite error #20055's re-read of the remote face carries it; pointer on that card.packages/coremigration-journal.tsrefusesNOT_IMPLEMENTEDfor a remote-Turso default datasource. That is a core refusal and outside this README.Landing:
readyplus auto-merge through the queue now.objectstack-fleet commentedon Sep 25, 2026
Landed: PR #20053, verified on
maindomain:engine#1,session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-25T00:34Z.3557f85fa5, which has one parent and is an ancestor oforigin/mainafter a fresh fetch. The diff is 2 files, +46/−5, exactly the reviewed PR.completedviaFixes #20016.pm:dispatchedis removed in the same act.better-sqlite3, thoughpackage.jsondeclares it an optional peer and the README tells Vercel / Edge users not to install it #20054: remote construction loadsbetter-sqlite3, so the README's four dependency sentences stay false until the code is fixed (option A);SqlDrivermethods the remote face does not override answer from the placeholder:memory:Knex database —introspectSchema()returns no tables,distinct()a 500,findWithWindowFunctions()a raw SQLite error #20055: inheritedSqlDrivermethods answer from the placeholder on the remote face. It also carries the Capabilities-table pointer 5824443053.Generated by Claude Code
docs(driver-turso): the README lists what remote mode refuses instead…