Found while implementing #14023 (binding the @objectstack/metadata migrations to IDataDriver.execute). Filed separately: different package, different defect, and #5499's standing rule applies to it rather than to that card.
The mismatch
IDataDriver declares executeNON-optionally:
// packages/spec/src/contracts/data-driver.tsexecute(command: unknown,parameters?: unknown[],options?: DriverOptions): Promise<unknown>;
Two shipped drivers satisfy that declaration with an implementation that never runs the command and never says so:
// packages/drivers/driver-memory/src/memory-driver.tsasyncexecute(command: any,params?: any[]){this.logger.warn('Raw execution not supported in InMemory driver',{ command });returnnull;// every command, always}// packages/drivers/driver-mongodb/src/mongodb-driver.tsasyncexecute(command: unknown,_parameters?: unknown[],options?: DriverOptions): Promise<unknown>{constsession=this.getSession(options);if(typeofcommand==='object'&&command!==null){returnawaitthis.db.command(commandasDocument,{ session });}returncommand;// a string command is handed straight back}Neither refuses. MemoryDriver returns null for everything; MongoDbDriver returns a string command back verbatim, and its _parameters are never read on either branch, so bindings are dropped silently even where the command IS executed.
Why this is worth a card rather than a shrug
A caller cannot distinguish "ran and found nothing" from "did not run". Probing for the method is the only capability test available — DriverCapabilities carries no member for raw-SQL support — so every consumer that resolves a raw-SQL entry point by typeof driver.execute === 'function' selects these drivers and then reads their silence as data. Measured consequence in the code that prompted this: dropProjectionTables(memoryDriver) reports status: 'dropped' for all five deprecated tables, because DROP TABLE IF EXISTS "succeeded" — five successful drops of tables that were never touched. The column-probing migrations degrade more gently, reporting not_applicable or table_missing, which is plausible-looking and equally untrue.
Refusing loudly, the way an unimplemented escape hatch should, is one of the two shapes this could take. The other is a declared capability flag that separates "implements the escape hatch" from "can run SQL" — which is a contract question, not something a consumer can guess at with a driver-name sniff.
Boundary
Same class as #13878 (InMemoryDriver.update() returning a value its declared return type forbids) but a different member and a different mechanism: that one was invisible to tsc behind an inferred any, this one type-checks cleanly and is only visible at run time. Not a duplicate; backlinked because a repair of either should look at the other.
SqlDriver (and therefore SqliteWasmDriver) and the Turso remote transport implement execute honestly — they run the command and carry parameters positionally. They are not in scope here.
Routing
Per #5499 (maintainer ruling, 2026-08-05), new driver-memory / driver-mongodb cards get domain:engine and go straight to pm:on-hold referencing that anchor rather than into pm:queue. Labelled that way. I did not measure this against #5499's escalation exception (a driver defect that makes CI go falsely green or red): nothing in this repo's suites drives these migrations through MemoryDriver, and I did not look for other consumers whose tests could be affected. If triage wants that exception considered, the measurement is still owed.
Re-run
git grep -n "Raw execution not supported" -- packages/drivers/driver-memory/src
git grep -n "_parameters" -- packages/drivers/driver-mongodb/src
git grep -n "execute(command" -- packages/spec/src/contracts/data-driver.ts
Dedup declaration
Repo-scoped REST listing of the 62 open domain:engine issues plus a local keyword grep (MemoryDriver, driver-memory, MongoDb, execute(), no-op, silently). Control: grepping the same fetched list for driver.raw returned #14023 and #14025, so the channel was answering. Nearest neighbours are #13878 (different member, above) and #5499 (the freeze anchor, not a defect card). No duplicate found.
Backlinks: #14023 (where this was found), #13878, #5499.
Generated by Claude Code
Generated by Claude Code
Found while implementing #14023 (binding the
@objectstack/metadatamigrations toIDataDriver.execute). Filed separately: different package, different defect, and #5499's standing rule applies to it rather than to that card.The mismatch
IDataDriverdeclaresexecuteNON-optionally:Two shipped drivers satisfy that declaration with an implementation that never runs the command and never says so:
Neither refuses.
MemoryDriverreturnsnullfor everything;MongoDbDriverreturns a string command back verbatim, and its_parametersare never read on either branch, so bindings are dropped silently even where the command IS executed.Why this is worth a card rather than a shrug
A caller cannot distinguish "ran and found nothing" from "did not run". Probing for the method is the only capability test available —
DriverCapabilitiescarries no member for raw-SQL support — so every consumer that resolves a raw-SQL entry point bytypeof driver.execute === 'function'selects these drivers and then reads their silence as data. Measured consequence in the code that prompted this:dropProjectionTables(memoryDriver)reportsstatus: 'dropped'for all five deprecated tables, becauseDROP TABLE IF EXISTS"succeeded" — five successful drops of tables that were never touched. The column-probing migrations degrade more gently, reportingnot_applicableortable_missing, which is plausible-looking and equally untrue.Refusing loudly, the way an unimplemented escape hatch should, is one of the two shapes this could take. The other is a declared capability flag that separates "implements the escape hatch" from "can run SQL" — which is a contract question, not something a consumer can guess at with a driver-name sniff.
Boundary
Same class as #13878 (
InMemoryDriver.update()returning a value its declared return type forbids) but a different member and a different mechanism: that one was invisible totscbehind an inferredany, this one type-checks cleanly and is only visible at run time. Not a duplicate; backlinked because a repair of either should look at the other.SqlDriver(and thereforeSqliteWasmDriver) and the Turso remote transport implementexecutehonestly — they run the command and carryparameterspositionally. They are not in scope here.Routing
Per #5499 (maintainer ruling, 2026-08-05), new
driver-memory/driver-mongodbcards getdomain:engineand go straight topm:on-holdreferencing that anchor rather than intopm:queue. Labelled that way. I did not measure this against #5499's escalation exception (a driver defect that makes CI go falsely green or red): nothing in this repo's suites drives these migrations throughMemoryDriver, and I did not look for other consumers whose tests could be affected. If triage wants that exception considered, the measurement is still owed.Re-run
Dedup declaration
Repo-scoped REST listing of the 62 open
domain:engineissues plus a local keyword grep (MemoryDriver,driver-memory,MongoDb,execute(),no-op,silently). Control: grepping the same fetched list fordriver.rawreturned #14023 and #14025, so the channel was answering. Nearest neighbours are #13878 (different member, above) and #5499 (the freeze anchor, not a defect card). No duplicate found.Backlinks: #14023 (where this was found), #13878, #5499.
Generated by Claude Code
Generated by Claude Code