delete_database now removes the directories rows of the target database explicitly, inside the same transaction and ahead of the parent row. The foreign_keys pragma applies per connection, and the dedicated transaction connections open with it off, so the explicit delete replaces the cascade on this path. A device check after create and delete shows the registry clean of that database and free of orphan directories rows. A write whose SQL execution fails now ends the batch. The native transaction rolls back and every queued callback reports the error. Validation failures that leave the store untouched, such as a missing key, an exhausted key generator, or an unknown store, keep reporting through their own request while the batch continues. Widening the abort to those cases pushed upgrade transactions into the abort path that servo#43950 deferred, and turned seven WPT keypath subtests into device timeouts. The engine comment now matches this behavior. The quota bucket covers RDB_E_SQLITE_IOERR alongside RDB_E_SQLITE_FULL. The Api error carries a bare status code, so the mapping reads the code directly, while the ENOSPC source-chain check keeps serving the Io variant. This is slightly broader than the sqlite twin, where an IOERR also needs an ENOSPC in its chain. A device-tier unit test pins the mapping end to end against a max_page_count-limited store, with the pragma set on the transaction connection where it takes effect. The three on-device unit tests expect the rdb/ subdirectory that RDB creates under the database dir. The integration tier now builds for the device target, with the crate-level gate lifted and the inner webstorage gate removed, while tests/client_storage.rs keeps its gate for rusqlite. Four engine-agnostic IndexedDB cases join the suite, covering cross-type key sort order, key-range open and closed bounds, auto-increment, and a batch write failure surfacing an error. The two path-included test modules carry allow(dead_code), which restores a warning-free host test build. The webstorage load-failure warning now says the in-memory map starts empty and the final save is skipped. This round was validated with cargo test -p servo-storage on a Linux host, 52 tests passing with a warning-free build, and with cargo test --no-run for the aarch64-unknown-linux-ohos target with the ohos-rdb-backend feature, which also builds warning-free. On the device, the ten WPT storage tests match desktop expectations on 1218 of 1225 subtests, and the previous device-tested build reproduces the same seven-timeout keypath pattern on the same day, which places the drift in the environment. The six storage cases pass, an interior-NUL value survives a process kill and restart, and the registry row checks above come from the pulled reg.rdb. AI-assissted: Yes (agent session; implementation and testing on device)