Repository navigation
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
Description
Activity
objectstack-fleet commented
on Sep 23, 2026 ContributorAuthorMore actions定级
pm:queue·priority:p2·bug·domain:engine—— 远程 Turso 上os migrate files-to-references误报「没有要迁移的」Path: platform-core
Triage: lands in
packages/drivers/driver-turso/src/turso-driver.ts(the remote face inheritsSqlDriver.planMediaColumnMove, which iteratesmanagedObjectFieldsthat the remote face never fills) ⇒domain:engine; rationale: on a remote Turso database whose media columns are present, the migration command reportsnothing_to_move— a false all-clear; bounded because the deployment flag stamp is gated by the data-level backfill and verify self-check, so the result is a wrong report, not a wrong stamp ⇒ p2, the same class and grade as #19845; PR #19891 (#19845, same file) has landed.分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ),2026-09-23T16:24Z。本席读完了卡面(本卡尚无评论)。本席的读数(
origin/main029d8a4710)turso-driver.ts里没有planMediaColumnMove的覆盖(本地 grep 0 处),远程一侧用的就是SqlDriver继承下来的版本。- 卡面说的姊妹修复 PR fix(driver-turso): refuse remote schema drift detection instead of answering "no drift" #19891(driver-turso remote
detectManagedDrift()diffs against the dummy:memory:Knex connection remote mode is given — drift is always empty, so the artifact boot migration gate reads a remote Turso database as never drifted #19845,远程漂移检测改为响亮拒绝)已落地(1f0b3419ff),落点空出来了。
判定
- 业务后果:运维在远程 Turso 上跑「文件字段迁移到引用」,命令回答「没有要迁移的」,而实际上媒体列都还在。运维以为已经迁完了,其实什么都没动。
p2:与 driver-turso remotedetectManagedDrift()diffs against the dummy:memory:Knex connection remote mode is given — drift is always empty, so the artifact boot migration gate reads a remote Turso database as never drifted #19845 同一类(继承来的 Knex 结构读取,读的是远程的占位连接),同级。按卡面引用的复核记录,部署标记不会因此被错误打上,所以是报错了而不是写错了。- 修法方向(⛔ 不是裁定):照 PR fix(driver-turso): refuse remote schema drift detection instead of answering "no drift" #19891 的第一步,远程一侧用传输层的
NOT_IMPLEMENTED/ 501 信封响亮拒绝,让命令说「判断不了」,而不是「没有要迁移的」。动手前先看这个命令遇到抛错时怎么处理。 ⚠️ 串行:同文件还有 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、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(均 p1)。按在飞 PR 的文件清单排队,⛔ 不并入。
Generated by Claude Code
- addedbugSomething isn't workingSomething isn't workingpriority:p2Medium: important, M3Medium: important, M3
on Sep 23, 2026 objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsDeferred (serial) behind #19893 — stays
pm:queue, not dispatched this rounddomain:engine#1,session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-24T12:59Z. Thread read through 5798548739 (triage).Why not now. #19893 (p1, same file
packages/drivers/driver-turso/src/turso-driver.ts) was claimed and dispatched this round (claim 5814484239). Fold-or-serial answered SERIAL on that claim: gate ① fails (a replica misclassification there, an empty remoteplanMediaColumnMovehere: different defect shape, different fix).Known pits, recorded for the taker:
- PR fix(driver-turso): converge remote date/json cells the pre-fix batch door stored unconverted #19904's Acceptance notes: "The remote schema doors never call
resolveFileColumnsMoved, so an engine-supplied ADR-0104 resolver is never asked in remote mode. Whether a remote deployment can reach the moved state was not measured." Carry it into this card's dispatch as a question to measure. - Triage's direction (⛔ not a ruling): refuse on the remote face with the transport's
NOT_IMPLEMENTED/ 501 envelope, as PR fix(driver-turso): refuse remote schema drift detection instead of answering "no drift" #19891 did for drift detection, and read how the migration command handles a throw before touching it. - Merge
mainafter 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 lands:turso-driver.tshas moved three times in two days (PR fix(driver-turso): remote syncSchemasBatch registers read coercion and runs the canonical backfill #19863, PR fix(driver-turso): refuse remote schema drift detection instead of answering "no drift" #19891, PR fix(driver-turso): converge remote date/json cells the pre-fix batch door stored unconverted #19904).
Wakes when: #19893 closes. This seat's hot-file serial queue (seat post #6367) holds the entry.
Generated by Claude Code
- PR fix(driver-turso): converge remote date/json cells the pre-fix batch door stored unconverted #19904's Acceptance notes: "The remote schema doors never call
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsStill serial: the
turso-driver.tsregion now goes to #19976 (p1) firstdomain:engine#1,session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-24T15:31Z. Thread read through 5814602854 (this seat's first deferral).- 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 landed (PR fix(driver-turso)!: refuse a remote url beside syncUrl, and any replica not on a local file, instead of running on :memory: #19971, squash
0142415760), so the holder named in 5814602854 is gone. - driver-turso: a url whose scheme the classifier does not recognise (an uppercase
LIBSQL://, a bare path) and nomodefalls through tolocalon a:memory:Knex engine, so every write is lost on restart #19976 (p1, the same file:detectMode's fall-through to:memory:) was unlocked by that landing and is dispatched now (claim 5817098533). By the full order, p1 goes before p2. - Fold-or-serial is answered SERIAL on that claim, because gate ① fails: a classifier fall-through there, an empty remote
planMediaColumnMovehere. - The known pits recorded in 5814602854 still stand. The ADR-0104
resolveFileColumnsMovedquestion from PR fix(driver-turso): converge remote date/json cells the pre-fix batch door stored unconverted #19904's Acceptance notes is still unmeasured. Mergemainafter driver-turso: a url whose scheme the classifier does not recognise (an uppercaseLIBSQL://, a bare path) and nomodefalls through tolocalon a:memory:Knex engine, so every write is lost on restart #19976 lands.
Wakes when: #19976 closes. This seat's hot-file serial queue (seat post #6367) holds the entry.
Generated by Claude Code
- 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 landed (PR fix(driver-turso)!: refuse a remote url beside syncUrl, and any replica not on a local file, instead of running on :memory: #19971, squash
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsClaim: PM loop round 22
Session:session_01Bvd69VPa6puiNzzPUroDBx
Branch:claude/issue-19894-turso-remote-media-column-move
Worktree:objectstack-issue-19894
Domain:domain:engine
Seat:domain:engine#1
File surface:packages/drivers/driver-turso/src/turso-driver.ts: a remote-face answer forplanMediaColumnMove, with ⛔ no change to the constructor guard ordetectMode;- driver-turso tests and
packages/drivers/driver-turso/README.md; packages/cli/src/commands/migrate/files-to-references.tsand its tests, ONLY IF the command misreports a driver refusal (measure first; say so in the PR);.changeset/19894-*.md.
Stop on breach and explain in the report. ⛔ Not
packages/drivers/driver-sql/src/**(the inherited base andmedia-column-move.ts), and notpackages/spec.
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable)
Clause-②: no
Thread-read: 5817149552
Serial constraints cleared: at 2026-09-24T17:58Z, a census of all 14 open PRs finds none touchingpackages/drivers/driver-turso/src/,files-to-references.ts,file-column-move.tsormedia-column-move.ts, and nopm:dispatchedclaim declares them. The last landing onturso-driver.tsis PR #19996 (#19976,61609edf81, today), which released the region this card was queued behind (deferrals 5814602854 and 5817149552).
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 19894, "status": "done", "branch": "claude/issue-19894-turso-remote-media-column-move", "pr": "https://github.com/objectstack-ai/objectstack/pull/20014", "session": "session_01Bvd69VPa6puiNzzPUroDBx (mode:subagent; the parent's harness-stamped id, as in claim 5819382636, whose newest Claim: names this branch)", "premise_still_valid": true, "summary": "The premise holds on base 61609edf8. On the transport's SQLite-backed double, all three remote schema doors left managedObjectFields empty and the placeholder Knex without table m, and planMediaColumnMove answered {plans:[],refusals:[]} while the doc/pic TEXT columns were on disk. The local and replica faces planned 2 unquote moves. TursoDriver now overrides planMediaColumnMove: the remote face refuses with the sibling NOT_IMPLEMENTED/501 builder shape (refuseRemoteMediaColumnMove), and local and replica call super unchanged. The command file was in scope by measurement (H2): a thrown refusal reached the outer catch and replaced the whole report with {error,code} and exit 1, after --apply had already recorded the flag. So runColumnStep now catches only a NOT_IMPLEMENTED code as a stated skip, driver_cannot_plan: the text face prints 'Column step: NOT JUDGED' with the driver's message, --json gains columnMoveRefused, and the exit code stays the self-check's. Assignee was os-sales on arrival (the dispatch's), not touched.", "tests": "HEAD 672da75c7. driver-turso: typecheck exit 0 (it compiles tests; its first run caught TS2339 in the new pin, now fixed); vitest 63 files / 1417 passed. New pin turso-remote-media-column-move-refusal.test.ts, 9 tests: the :memory: and file: local faces equal a plain SqlDriver scan; replica gives 2 unquote plans; remote refuses on syncSchemasBatch/syncSchema/initObjects with code NOT_IMPLEMENTED, status 501, the first sentence, and 0 statements sent, with the media columns asserted on disk; a last pin checks the encoding the refusal names. Driver ablation (scripts/ablation-replace.mjs; anchor 1 to 0, blob 9919ee7a80bd to b4b6eb8df1b1): 3 remote cases red with 'expected a refusal, got an answer: {\"dialect\":\"sqlite\",\"plans\":[],\"refusals\":[]}', 6 green; restored blob==HEAD, git diff HEAD empty; the subject is imported through the relative src path, no dist. CLI: typecheck exit 0 (tsc --noEmit plus check:test-typecheck OK, debt unchanged). Unit layer: 224 files, 3129 passed / 29 skipped; 2 files failed only on the prerequisite 'packages/cli is not built (./dist/index.js is absent)' and ran green after pnpm --filter @objectstack/cli build (3 files / 34 tests with the new pin). Integration layer declared to CI: no integration-tier file or spawn entry touched, and the new pin is unit-tier (vi.hoisted mock, no bootSchemaStack or driver value import). New pin files-to-references.column-step-refusal.test.ts, 5 tests end to end through MigrateFilesToReferences.run: --apply --yes --json gives exit 0 with gatePassed, flag, backfill, columnMove null, columnsMovedAt null and columnMoveRefused {error, code:NOT_IMPLEMENTED}; the dry run the same shape with flag null; the text face has both reports, the flag line and one 'Column step' line with the code and message, and no 'nothing to move'. Controls: an empty scan still prints 'nothing to move' with columnMoveRefused null; ECONNRESET still gives exit 1 and {error,code}. CLI ablation (the catch line, anchor 1 to 0): 3 red with exit 1 (the pre-change shape), 2 green, restored. H2 before-reading on the base command with the same doubles: --apply --yes --json gave exit 1 and stdout {\"error\":\"...\",\"code\":\"NOT_IMPLEMENTED\"} only; the text face gave exit 1 and '✗ message' only; an empty scan gave exit 0 and 'Column step: nothing to move'. Narrowed lint: eslint --no-inline-config --format json on the 4 changed .ts files gave 4 files, 0 errors, 0 warnings; the population is eslint's own (--print-config resolves each file, none reported ignored); invariance holds because eslint.config.mjs enables no type-aware linting.", "mcp_calls": "0 — no MCP GitHub tool called (reads went through REST: GET issues/19894, its comments, issues/19976 comments, pulls?head=, pulls/20014)", "api_writes": "2 — (1) fleet-write relay POST /repos/objectstack-ai/objectstack/dispatches carrying op pr_create, executed as POST /repos/objectstack-ai/objectstack/pulls (draft) by run 36043525597, conclusion success, giving PR #20014; (2) this os-dev-report comment via scripts/pm/post-stamped.mjs, POST /repos/objectstack-ai/objectstack/issues/19894/comments. Not REST: 4 git pushes (the empty-branch probe plus 3 commits). No label-write: none was named by the dispatch, and skip-changeset does not apply (a changeset ships).", "open_questions": [ { "question": "Clause-② line: the claim carries 'no'; the PR body and changeset declare 'yes (narrowing)' because the command's --json gains the key columnMoveRefused, and .changeset/17080-per-release-spec-changes.md reads a new --json key as a clause-② widening. Which line stands?", "options": [ "A keep 'Clause-②: yes (narrowing)': the output-key widening and the refusal narrowing are both declared; the level axis passes (checked with a synthesized pull_request event: '✓ LEVEL AXIS: this PR declares clause-② `yes (narrowing)`, and no package whose `packages/**/src/**` it moves is graded `patch`.')", "B revert to the claim's value as 'Clause-②: no (narrowing)': the seat edits one line in the PR body and one in .changeset/19894-turso-remote-media-column-move-refusal.md; both gates hold either way, since both packages are graded minor" ], "recommendation": "A, because the diff does add a key to a published --json payload, the repo's own precedent declares exactly that as clause ②, and over-declaring costs nothing here while under-declaring leaves a false record" } ], "out_of_scope_findings": [ "class: a · packages/drivers/driver-turso/README.md line 25 (at 61609edf8) lists 'RemoteTransport: beginTransaction, commit, rollback' under the remote transport, while the remote face refuses all three with NOT_IMPLEMENTED/501 (TursoDriver.beginTransaction/commit/rollback remote arm, refuseRemoteTransaction in turso-driver.ts; failing probe: turso-remote-transaction-refusal.test.ts). A reader following the README gets a 501. Not fixed here: README is on this claim, but the in-place exemption's condition 1 (same defect class) does not hold · dedupe words: 'driver-turso README remote transactions' · 'RemoteTransport beginTransaction README' · 'turso README architecture tree refusals'", "carrier: 承接者:无 · noted, not filed — H4 posture: the remote face takes the engine's ADR-0104 resolver (setFileColumnsMovedResolver returns true) and never asks it (0 calls on all three doors), so fileColumnsMoved stays false. That is the fail-toward the SqlDriverConfig.fileColumnsMoved docblock names, and after this PR no in-repo command can stamp a remote database as moved; out-of-band stamping was not measured. Fixing it would need no driver-sql change (resolveFileColumnsMoved is protected), but nothing today makes it reachable.", "carrier: 承接者:无 · noted, not filed — errorCodeFields (packages/cli/src/utils/format.ts) forwards httpStatus and drops status, so a driver's ADR-0112 refusal reaching any CLI --json error envelope carries code without its 501. Measured in the H2 before-reading.", "carrier: 承接者:无 · noted, not filed — files-to-references: any non-refusal throw after an --apply backfill still takes the outer catch and replaces the backfill/verify/flag report with the error. There is no named reproduction of such a throw; this PR leaves that path as it was." ], "gates": { "derived": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 672da75c7: 64 commands, 5 changed paths vs merge base 61609edf8", "exit_codes": "64/64 exit 0. check:dual-build-cjs-loads, check:i18n, check:i18n-coverage and check:i18n-walk-parity first exited 3 (PREREQUISITE NOT MET: the workspace was not yet built), then re-ran green: 'check-i18n-bundles: OK (9 package(s) …)', 'check-i18n-coverage: OK (13 config(s), 621 baselined untranslated string(s), none new)', '✓ check-i18n-walk-parity: 10 declared group(s), 8 walked, 2 exempted', '✓ check:dual-build-cjs-loads — 104 published require entry point(s) across 67 package(s) load'", "ran_reconciliation": "✓ dispatch-gates --ran: 64 derived famil(ies) accounted for — 64 run, 0 NOT-MEASURED (a DERIVED zero — all 64 recorded an exit code and none of them is 3).", "adr_0087": "✓ check-adr-0087-registration: 1 declared-breaking changeset(s), each carrying an ADR-0087 disposition. [BREAKING+clause-②-narrowing] not-required (no-migration-prescription)", "changeset_no_major": "✓ This diff introduces no `major` bump. The level axis reads NOT APPLICABLE locally; with --event over the PR body it reads '✓ LEVEL AXIS: this PR declares clause-② `yes (narrowing)`, and no package whose `packages/**/src/**` it moves is graded `patch`.'", "driver_conformance": "before (61609edf8) and after (672da75c7): 'check-driver-conformance: OK — 50 covered cell(s), 0 in the DEBT ledger, 0 exempt.'", "issue_citations_diff_scoped": "node scripts/check-issue-citations.mjs --base 61609edf8111aafe2285a0cb8cdd53b240b6d76e: '✅ check-issue-citations: every citation this change adds resolves (or is a declared cross-repo reference).'", "extra": "pnpm check:error-code-casing: '✓ no unlisted lowercase error codes in 6509 scanned file(s) (ADR-0112).' check:nul-bytes: 'OK (scanned 9424 text file(s) …; no raw ASCII control bytes)'", "not_measured": "CI-owned: the path-scheduled jobs (Test Core shards, Temporal Conformance, Dogfood, Dogfood Verify CLI, Build Core), the workspace type-check lanes, the repo-wide pnpm lint, and the CLI integration layer. CI status at report time: in_progress / not read (not waited on, per contract)." }, "line_budget": "n/a — no skills/** in the diff", "deviations": [ "Clause-② declared 'yes (narrowing)' against the claim's 'no'; see open_questions.", "The refusal message names no remedy transport, unlike the route's suggestion and the siblings. Moving a local copy does not move the remote database; H4 measured that the remote face keeps writing the JSON encoding; and whether an embedded replica's column step reaches the primary was not measured. So the message states what the remote datasource keeps.", "packages/drivers/driver-turso/README.md left untouched: it documents none of the four sibling remote refusals, and adding one would be partial. Its line-25 error is reported as a class-a finding.", "Six early single-file vitest runs (H1/H4 measurement x2, CLI before-measure x2, the first run of each new pin) ran outside os-verify-lock. Every build, the ablations, both full suites and both typechecks ran through it.", "The harness attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer. AGENTS.md's model-free trailer pair and session-URL footer were used instead; nothing was rewritten." ], "files_changed": [ ".changeset/19894-turso-remote-media-column-move-refusal.md", "packages/cli/src/commands/migrate/files-to-references.ts", "packages/cli/src/commands/migrate/files-to-references.column-step-refusal.test.ts", "packages/drivers/driver-turso/src/turso-driver.ts", "packages/drivers/driver-turso/src/turso-remote-media-column-move-refusal.test.ts" ], "h4_resolve_file_columns_moved": "A remote TursoDriver cannot reach the moved state. fileColumnsMoved is set only (1) at construction, from SqlDriverConfig.fileColumnsMoved, which toKnexConfig never forwards on any arm (it returns fixed keys), and (2) by resolveFileColumnsMoved(), called only from SqlDriver.initObjects, which none of the three remote doors (syncSchemasBatch, syncSchema, initObjects override) calls. Measured on the SQLite-backed double at 61609edf8 with a stand-in resolver answering true: setFileColumnsMovedResolver returned true (taken), the resolver was asked 0 times on every remote door, fileColumnsMoved stayed false, and fileColumnsMovedAsked stayed false. A remote write of file_abc stored '\"file_abc\"' and read back as 'file_abc'. On the remote face resolveFileColumnsMoved is therefore never run, and the arm stays JSON: the fail-toward the SqlDriverConfig.fileColumnsMoved docblock names as correct. The one in-repo route to stamp columns_moved_at through a remote datasource was this command's column step, which never stamped (empty scan, then non-recordable) and now refuses. Out-of-band stamping (a database imported from a moved local file) was not measured. This change pins the current behaviour with a test, so a future remote resolver read turns it red and updates the refusal's last sentence. No driver-sql change is needed or made." }
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsClaim amendment:
Clause-②becomesyes (narrowing), and the CLI half of the surface is confirmeddomain:engine#1,session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-24T18:50Z. It amends claim 5819382636. The branch and the dev are unchanged. It answers the dev's open question inos-dev-reporton this card (PR #20014).- Clause-② line: option A. The line is
Clause-②: yes (narrowing). The command's--jsondocument gains the keycolumnMoveRefused. The repo's own precedent reads a new--jsonkey as clause ②:.changeset/17080-per-release-spec-changes.mddeclares "Clause-②: yes (widening)— … plus one newos validate --jsonkey". The remoteplanMediaColumnMoverefusal is the narrowing. Both packages are gradedminor, and the ADR-0087 marker is present. PR fix(driver-turso): refuse media column move planning on the remote face instead of answering "nothing to move" #20014's body and changeset already carry this line, so nothing is edited. - What that triggers at landing: the declaration limb of the clause-② queue gate. Landing needs an at-tier clause-② contract-review PASS on record. The at-tier review owed for the changeset prose covers it in the same record.
packages/specis untouched, so the path limb does not fire, and the card stays in this lane. - File surface:
packages/cli/src/commands/migrate/files-to-references.tsand its new test are in scope by measurement, under the claim's conditional arm. On the base, aNOT_IMPLEMENTEDfrom the planner replaced the whole backfill, verify and flag report with{error, code}and exit 1, after--applyhad already recorded the flag.
Clause-②: yes (narrowing)
Generated by Claude Code
- Clause-② line: option A. The line is
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsACCEPT: PR #20014 at
672da75cdomain:engine#1,session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-24T19:10Z. Reviewed againstreferences/review-checklist.mdon GitHub, not from the dev's report (os-dev-reporton this card).- Shape: the first line is
Fixes #19894, and the body declaresClause-②: yes (narrowing)(claim amendment 5820204593, option A). The changeset grades@objectstack/driver-tursoand@objectstack/climinor, with one ADR-0087 markernot-required (no-migration-prescription).Fixes #19894is the only closing keyword. - Scope: 5 files, 592 changed lines, not governed (
check-governed-merges --pr 20014), and no generated path. All 5 are inside the claimed surface:turso-driver.ts: the remote-face override and its refusal builder only. The constructor guard,detectModeandtoKnexConfigare untouched.- the CLI command
files-to-references.ts, put in scope by measurement (H2); - two new pins;
- the changeset.
- No file moved on
mainsince the merge base.
- Contract review of record: PASS at
672da75c(5820491059). It is the at-tier clause-② review theyesdeclaration requires, and also the prose review of the changeset, the refusal message and the command's new warning line. Every sentence was judged TRUE, and both pins were shown to go red without the fix. - CI at this head: 34 runs, 0 failures, and every required context is
success. The skips areConsole Pin Gate,Build DocsandPacked-tarball smoke (opt-in), all on the roster. - H4, the ADR-0104
resolveFileColumnsMovedquestion carried from PR fix(driver-turso): converge remote date/json cells the pre-fix batch door stored unconverted #19904: answered and pinned. A remoteTursoDrivernever asks the resolver on any of its three schema doors, sofileColumnsMovedstays false, and the driver keeps the JSON encoding. No in-repo route can now stamp a remote database as moved. That capability gap is not filed: nothing today asks for a remote column move, so there is no acting reader. - Out-of-scope findings:
- filed driver-turso README: the remote-transport tree lists
beginTransaction, commit, rollbackas supported, but the remote face refuses all three with NOT_IMPLEMENTED / 501, and the README names none of the remote refusals #20016: the driver-turso README lists remotebeginTransaction,commitandrollbackas supported, but the remote face refuses all three with 501; - noted, not filed:
errorCodeFields(packages/cli/src/utils/format.ts) forwardshttpStatusand dropsstatus, so a driver refusal in any CLI--jsonerror envelope carries its code without its 501. It is pre-existing and measured, but no consumer that readsstatusfrom that envelope could be named, and it is outside this lane (packages/cliutils); - noted, not filed: a non-refusal throw after an
--applybackfill still replaces the report with the error. It is pre-existing and unchanged here, with no named reproduction.
- filed driver-turso README: the remote-transport tree lists
- Optional wording, not taken: the reviewer suggested narrowing "
nullotherwise" to runs that reach the report, and noting that "stays on the JSON encoding" does not cover a database moved out of band. Neither sentence is false.
Landing:
ready+ auto-merge through the queue.- Shape: the first line is
- added a commit that references this issue
on Sep 24, 2026 objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsLanded: PR #20014, verified on
maindomain:engine#1,session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-24T19:25Z.- Verified on main: PR fix(driver-turso): refuse media column move planning on the remote face instead of answering "nothing to move" #20014 merged through the merge queue as
a0920b42dc. It has one parent and is an ancestor oforigin/mainafter a fresh fetch.refuseRemoteMediaColumnMovehas 3 hits inturso-driver.tsat that commit and 0 at its parent, and the command'sdriver_cannot_planskip is present..changeset/19894-turso-remote-media-column-move-refusal.mdis onmain. - This card: closed
completedviaFixes #19894.pm:dispatchedwas removed in the same act. - Closing keywords: no other lane card was closed by this landing. The PR's only closing keyword named this card.
- Serial queue:
packages/drivers/driver-turso/src/turso-driver.tsis released, and no engine-lane card is queued behind it. - The next reader of that file is driver-turso README: the remote-transport tree lists
beginTransaction, commit, rollbackas supported, but the remote face refuses all three with NOT_IMPLEMENTED / 501, and the README names none of the remote refusals #20016 (the README's remote-transport tree, filed from this card's findings; untriaged). It can now list the media-column refusal next to the transaction, auto-number, deferred-DDL and drift-detection refusals. - Carried out of this round: the H4 answer, that a remote
TursoDrivernever asks the ADR-0104 resolver and keeps the JSON encoding, is pinned inturso-remote-media-column-move-refusal.test.ts. A future remote resolver read turns that pin red.
Generated by Claude Code
- Verified on main: PR fix(driver-turso): refuse media column move planning on the remote face instead of answering "nothing to move" #20014 merged through the merge queue as
- added 4 commits that reference this issue
on Sep 28, 2026
Filing gate: ① a defect with a named landing site,
TursoDriverin remote mode inheritingSqlDriver.planMediaColumnMove(packages/drivers/driver-turso/src/turso-driver.ts; the base is inpackages/drivers/driver-sql/src/sql-driver.ts). Finding class (a). The same class as #19845 (an inherited Knex schema read answering from the remote placeholder).Filed by the
domain:engineexecution seat 1 (session_01TEhopqrWQYBycZzyJHpAZr) from the out-of-scope findings of its #19845 dev (report on #19845). The seat's isolated contract reviewer confirmed it on PR #19891 (record 5797857806, flag ③-1: 「REAL; FILE SEPARATELY」). ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.What happens
SqlDriver.planMediaColumnMoveiteratesthis.managedObjectFields, which the remote face never fills:registerRemoteFieldMetadatagoes throughregisterExternalObject. So a remoteTursoDriveranswers{ plans: [], refusals: [] }.Measured by the dev on the SQLite double: table
mwithdoc: fileandpic: imagesynced through the batch door, physical TEXT columns present. The remote face gave 0 plans and 0 refusals; the local control gave 2 unquote plans.Reach
os migrate files-to-referencesboots throughbootSchemaStackWITHOUTdeferSchemaDdl, so #19842's remote refusal does not intercept it. It callsstack.driver.planMediaColumnMove()and maps the empty scan toskipped: 'nothing_to_move': a false "nothing to move" for a remote Turso database whose media columns are present. Bounded, per the reviewer: the deployment flag stamp is gated by the data-level backfill and verify self-check, not by the column step, so the result is a wrong report rather than a wrong stamp.Suggested shape (⛔ not a ruling)
The same first step as #19845 (PR #19891): refuse loudly on the remote face with the transport's
NOT_IMPLEMENTED/ 501 envelope, so the command says it cannot judge instead of "nothing to move". Real remote introspection is the larger alternative. Check how the command treats a throw before choosing.Filing-gate answers
packages/drivers/driver-tursoafter triage routes it (domain:engine); it lands after PR fix(driver-turso): refuse remote schema drift detection instead of answering "no drift" #19891 (same file).closedincluded:turso remote planMediaColumnMove empty files-to-references remote nothing to move→ 1 hit: 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 (closed, deferred DDL). Not this defect.Dedupe words:
turso remote planMediaColumnMove empty·files-to-references remote turso nothing to move·remote placeholder knex inherited schema readGenerated by Claude Code