Skip to content

driver-sql: reclaimSpace() frees ONE freelist page per call, not the freelist — PRAGMA incremental_vacuum measured 300 → 299 pages on SQLite, so the lifecycle sweep never returns bulk-deleted space (ADR-0057 §3.4) #20106

Description

@objectstack-fleet

Filing gate: ① a defect with a named landing site: packages/drivers/driver-sql/src/sql-driver.ts SqlDriver.reclaimSpace. Its remote twin is the reclaimSpace route PR #20104 adds to packages/drivers/driver-turso. Finding class (a).

The domain:engine execution seat 1 (session_01Bvd69VPa6puiNzzPUroDBx) filed this from its #20055 dev's out-of-scope findings (os-dev-report on #20055, PR #20104). The seat re-read the code line on origin/main 8d76c2d38c. The runtime readings are the dev's. ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.

What happens

SqlDriver.reclaimSpace() is one statement: await this.knex.raw('PRAGMA incremental_vacuum'). The contract (packages/spec/src/contracts/data-driver.ts, IDataDriver.reclaimSpace) and ADR-0057 §3.4 say it reclaims free space after bulk deletions, and LifecycleService.sweep() calls it after every sweep that deleted rows.

Measured by the #20055 dev on a database with auto_vacuum=INCREMENTAL:

So one call returns one page, and a sweep that deleted thousands of rows leaves the file almost as large as before. Nothing is raised, and the lifecycle report still lists the datasource as reclaimed.

Suspected mechanism, to be measured by the taker: SQLite frees one page per sqlite3_step() of incremental_vacuum until done, and a single raw() execution steps it once.

Suggested shape (⛔ not a ruling)

  • Run the pragma to completion on every SQLite face: SqlDriver on better-sqlite3, SqliteWasmDriver on sql.js, local TursoDriver, and the remote TursoDriver route PR fix(driver-turso)!: a remote TursoDriver answers or refuses every inherited SqlDriver member (#20055) #20104 adds. That means stepping until done, or an explicit page count taken from PRAGMA freelist_count.
  • Pin the reading with freelist_count before and after on each face, with a control database that has an empty freelist.
  • Check os db clean (packages/cli/src/commands/db/clean.ts), which describes the same pragma, and say whether it reaches this method.

Filing-gate answers

Dedupe words: reclaimSpace incremental_vacuum one page · PRAGMA incremental_vacuum freelist · sqlite reclaimSpace freelist_count

Activity

  1. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer: a second reading from PR #20104's contract review

    domain:engine#1, session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-25T05:28Z. ⛔ Not a claim.

    The at-tier review of PR #20104 (#20055) measured reclaimSpace() again, through a libSQL file: client. The measurement is not the dev's:

    • The issuing connection reports the freelist falling one page per call (40 → 39 → 38 → 37), the same one-page reading as this card.
    • A second connection on the same file reads the freelist unchanged (40), page_count unchanged, and the same file size, even after close(). The same holds with a raw @libsql/client and no driver.
    • The better-sqlite3 control (the local face's client) shows 39 on a fresh connection, and the file shrinks.

    So through libSQL the "returned" page may be a connection-local reading. The taker should read the freelist and the file size from a second connection on every face, not only from the issuing one. A remote Turso server is unmeasured. PR #20104's README sentence "It returns free pages only on a database whose auto_vacuum mode is INCREMENTAL" is TRUE for "only on", and connection-local for "returns". It rides this card's fix.

  2. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: the road — run it | platform-core.lifecycle-retention-sweep | P2

    Triage: first grade — bug · priority:p2 · domain:engine · area:devpath · pm:queue

    Triage: lands in packages/drivers/driver-sql/src/sql-driver.ts (SqlDriver.reclaimSpace, one PRAGMA incremental_vacuum statement) ⇒ domain:engine; rationale: the contract (IDataDriver.reclaimSpace, ADR-0057 §3.4) says it reclaims free space after bulk deletions, and it frees one page per call, so the lifecycle sweep reports a datasource as reclaimed while the file barely shrinks. Runs but answers wrong ⇒ p2.

    Triage seat #6015 · session_01CRZSc7dU8oDStbTbSwhuZe · 2026-09-25T07:56Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card and its full thread, and origin/main. Dedupe by this seat: reclaimSpace → this card only among open cards.

    Execution notes

    1. Region order, not a blocker: after PR fix(driver-turso)!: a remote TursoDriver answers or refuses every inherited SqlDriver member (#20055) #20104 (driver-turso remote: inherited SqlDriver methods 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), which adds the remote route to the same pragma.
    2. Read the freelist and the file size from a second connection on every face, as the review pointer 5827314394 measured: through libSQL the one-page drop may be connection-local.
    3. Say whether os db clean reaches this method.
  3. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 23
    Session: session_01N8TPEsoJxPsdSdNKGnNGEN
    Account: os-warren (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-20106-reclaim-space-full-freelist
    Worktree: objectstack-issue-20106
    Domain: domain:engine
    Seat: domain:engine#1
    File surface:

    Stop on breach and explain in the report. ⛔ Not the remote read / write arms of turso-driver.ts (#20107, dispatched in the same fire), nor its constructor (#20200). ⛔ Not packages/cli/src/commands/db/clean.ts (domain:cli): report whether it reaches this method (triage note 3), and do not edit it.
    Container & model: S, mode:subagent, model: opus (dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable)
    Clause-②: no
    Thread-read: 5828971335
    Serial constraints cleared: at 2026-09-28T09:11Z, a census of the 14 open PRs (titles, plus the file lists of #20391, #20348, #20404 and #20407) and of the newest Claim: on every one of the 23 open pm:dispatched cards finds none on driver-sql's reclaimSpace, driver-turso or driver-sqlite-wasm. The region order after PR #20104 is satisfied: it landed as 84880f922. #20107 (the remote read arms) and #20355 (sql-driver.ts crossFieldComparisonClass) are dispatched in the same fire into other regions of those two files, so the later lander merges main.

    Clause-②: no: the fix brings behaviour to the declared contract. IDataDriver.reclaimSpace (packages/spec/src/contracts/data-driver.ts) and ADR-0057 §3.4 say it reclaims free space after bulk deletions; one page per call does not.

  4. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 20106,
    "status": "done",
    "branch": "claude/issue-20106-reclaim-space-full-freelist",
    "pr": "#20425",
    "session": "session_01N8TPEsoJxPsdSdNKGnNGEN — the seat's session; this run is mode:subagent under it (container CLAUDE_CODE_REMOTE_SESSION_ID cse_01N8TPEsoJxPsdSdNKGnNGEN; the relay stamped writes with the same session id)",
    "premise_still_valid": true,
    "summary": "Premise confirmed: one reclaimSpace() call freed ONE page, measured from a second connection (300 → 299). SQLite's incremental-vacuum program frees one page per step, and two clients stepped it once. (1) knex's better-sqlite3 client runs a no-result-column statement with Statement.run(). That covers SqlDriver and the local TursoDriver. (2) The libSQL client's execute() on the remote route leaves the statement unfinished. There a second connection saw NOTHING land: not the freelist, not the file size, and not a row created after the call on the same connection, lost even after disconnect. Fix, SqlDriver.reclaimSpace: the better-sqlite3 binding runs the pragma through its own exec() on the pooled connection, which steps to completion; every other SQLite client stays on knex.raw. Fix, the remote route: read PRAGMA freelist_count through the raw door (lazy connect; nothing more sent on 0), then run the vacuum through client.executeMultiple(). Every face now reads 300 → 0 from a second connection; the file shrinks to 16,384 bytes; the empty-freelist control is unchanged; the post-call write lands. H1 confirmed. H2: first half confirmed, second half falsified — incremental_vacuum(600) freed one page through both better-sqlite3 run() and libSQL execute(). H3: partly falsified — SqliteWasmDriver inherits the method but was already complete on main (its dialect steps every PRAGMA to the end, 300 → 0); it is pinned now, with no source change. That makes three implementations for this method: better-sqlite3 via knex (2 faces), the sql.js dialect (1), and the libSQL remote route (1). H4 confirmed. os db clean does NOT reach reclaimSpace: clean.ts runs driver.execute('PRAGMA auto_vacuum = INCREMENTAL') then driver.execute('VACUUM'), and a full VACUUM completes in one step (measured through SqlDriver.execute on a legacy file: freelist 300 → 0, auto_vacuum 0 → 2, 1,236,992 → 12,288 bytes); not edited. The remote face is measured only over a libSQL file: client; a hosted libSQL/Turso server (hrana execute vs sequence, and whether it accepts either PRAGMA) is NOT MEASURED, because there is no live server. Driver conformance ledger: 50 covered / 0 DEBT (0 exempt) before (789b2ae) and after (0adf65d). CI: in_progress at report time (not awaited, per contract).",
    "tests": "Measured head 0adf65d, all runs through scripts/pm/os-verify-lock.sh (VERDICT command-exit 0): pnpm --filter @objectstack/driver-sql test → 195 files passed, 11 skipped; 3224 tests passed, 178 skipped. pnpm --filter @objectstack/driver-turso --filter @objectstack/driver-sqlite-wasm --no-bail test → turso 73 files, 1927 passed / 16 skipped; wasm 36 files, 658 passed. pnpm --filter driver-sql, driver-turso, driver-sqlite-wasm typecheck → all three Done; the typecheck compiled the tests and caught an Array.prototype.at (ES2020 lib), fixed in 31ddfc0. New or changed pins: driver-sql src/sql-driver-sqlite-reclaim-space.test.ts (4); driver-sqlite-wasm src/sqlite-wasm-reclaim-space.test.ts (2); driver-turso src/turso-remote-inherited-members.test.ts reclaimSpace block (9 cases, replacing the old pin that read the ISSUING client with toBeLessThan). Ablations: each leg on the committed state through scripts/ablation-replace.mjs; the anchor hit x1 → x0; restore blob == HEAD with an empty git diff HEAD. A — better-sqlite3 arm renamed to 'ABLATED-20106-better-sqlite3': driver-sql test 2 red ({freelist:299,pages:303} vs {freelist:0,pages:4}) and 2 green (control, pool). After pnpm --filter @objectstack/driver-sql build and ablation-dist-preflight (marker hit in dist/index.js and dist/index.mjs), turso 1 red / 81 passed (local face {freelist:39,pages:47}) and wasm 2/2 green (the H3 reading). Restore rebuild, then preflight --absent: dist clean, tree clean. B — knex.raw arm replaced by SELECT 'ABLATED-20106-noop', rebuild, preflight hit: wasm 1 red ({freelist:300,pages:304}) and control green. Restore rebuild, then --absent: clean. C — remote executeMultiple replaced by transport.execute: turso 5 red / 77 passed (second-connection freelist 40 vs 0; file-size case; post-call write 0 vs 1; call order; vacuum refusal); restored blob == HEAD. Narrowed lint: pnpm exec eslint --no-inline-config --format json over the 5 changed .ts files → 5 files, 0 errors, 0 warnings, none reported ignored. eslint.config.mjs sets no parserOptions.project and no typed rule, so no untouched file's verdict can move; pnpm lint is CI's. Probes (scratchpad, not committed): raw clients, the four driver faces with second-connection plus file-size readings on main and on the fix, the post-call write, WAL sidecar options, and os db clean.",
    "mcp_calls": "0 — no MCP GitHub tool called",
    "api_writes": "3 — all through the fleet relay (scripts/pm/fleet-write/dispatch.mjs; each is one POST /repos/objectstack-ai/objectstack/dispatches that the relay run executes as objectstack-fleet[bot]): (1) pr_create → POST /repos/objectstack-ai/objectstack/pulls (draft, PR #20425; body read back byte-equal); (2) label-write --issue 20425 --assign os-warren → POST /repos//issues/20425/assignees (read back: assignee os-warren; labels untouched); (3) post-stamped --comment=20106 → POST /repos//issues/20106/comments (this report). Plus git push of the branch (not REST). No issue_patch spent.",
    "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 0adf65d (change set: 7 paths vs merge base 50e273f) → 63 commands; all 63 run, each exit code recorded to a file before any pipe; all 63 exit 0. --ran: 63 derived, 63 run, 0 NOT-MEASURED, 0 UNRUN. First pass at 155234b: check:query-options-erasure red (test surface 236 → 237 from an as-any query bag in the new tests), fixed by typing the bags in 0adf65d, holds at 236. check:dual-build-cjs-loads, check:lean-entry-closure and check:type-check-debt answered PREREQUISITE NOT MET (exit 3) and passed after pnpm exec turbo run build --filter='./packages/' --filter='./packages//*' (71 tasks). Outside the derived set: the CI-only jobs and type-check lanes it names (Test Core, Temporal Conformance, Dogfood, Build Core, workspace typecheck) are NOT MEASURED locally and belong to CI. Merged origin/main twice with true merge commits (57b44aa, 155234b; no rebase, no force-push); #20107 and #20355 had not landed by 50e273f.",
    "line_budget": "no skills/ or governed ledger touched; diff vs merge base 50e273f is 445 changed lines (+410 / -35) over 7 files, under the 5000-line human-merge threshold",
    "files_changed": [
    ".changeset/20106-reclaim-space-full-freelist.md",
    "packages/drivers/driver-sql/src/sql-driver.ts",
    "packages/drivers/driver-sql/src/sql-driver-sqlite-reclaim-space.test.ts",
    "packages/drivers/driver-sqlite-wasm/src/sqlite-wasm-reclaim-space.test.ts",
    "packages/drivers/driver-turso/README.md",
    "packages/drivers/driver-turso/src/turso-driver.ts",
    "packages/drivers/driver-turso/src/turso-remote-inherited-members.test.ts"
    ],
    "deviations": [
    "File surface: packages/drivers/driver-turso/README.md is outside the claim's listed surface. Its reclaimSpace() sentence documents the exact remote route changed here, and the old text ('sends the statement local mode issues') would have become false. The edit is limited to that one bullet. No other file outside the surface was touched: remote-transport.ts was deliberately left alone (see open_questions).",
    "Order conflict, noted rather than resolved silently: the dispatch budgets issue_patch ×0–1 on the PR body, but the agent definition says the dev writes the PR body once and never PATCHes it. The definition wins, so no patch was spent. The one addition this run would make to the PR's Acceptance notes is named in out_of_scope_findings (the raw-door carrier line) for the seat to write.",
    "Attribution: the harness reminder asked for a model-bearing Co-Authored-By trailer and a claude.com footer. Commits carry the model-free Claude-Session / Co-authored-by pair, and the PR body ends with the session-URL footer, per AGENTS.md and the agent definition. Reported, not a deviation from the contract."
    ],
    "open_questions": [
    {
    "question": "Remote reclaimSpace route: keep the freelist_count pre-read, or move the lazy connect into a RemoteTransport door?",
    "options": [
    "A (this PR): read PRAGMA freelist_count through the raw door, which connects the transport lazily and sends nothing more on 0, then executeMultiple on transport.getClient(). It stays inside the claimed file surface. Cost: one extra read round trip when pages are free, and a hosted server that refused only the read would now refuse the route (NOT MEASURED; the existing envelope case covers either refusal).",
    "B: add RemoteTransport.executeMultiple(sql), which ensures the connection itself, and call it with no pre-read. One round trip, no new statement. It touches remote-transport.ts, outside this claim, beside #20107's region."
    ],
    "recommendation": "A for this card, because it keeps to the claimed surface and never takes the server's write lock on an empty freelist. B only if the seat prefers the transport to own every door, as its own small card after #20107 lands."
    }
    ],
    "out_of_scope_findings": [
    "class: a · reach: named producer — LifecycleService.sweep() (the ADR-0057 Reaper) calls SqlDriver.reclaimSpace() on the default file-backed SQLite datasource, which runs in WAL mode, after every sweep that deleted rows, and lists it as reclaimed · evidence: with this PR, at 25,754 freed pages through SqlDriver, a second connection reads freelist 0 and 4 pages, and the database file goes 105,631,744 → 16,384 bytes. But the -wal sidecar goes 4,577,352 → 91,855,432 and holds that size until the last connection closes: 110.2 MB → 91.9 MB on disk while the process runs. Options measured on raw better-sqlite3 (25,600 rows, one run, shared box; database file + -wal while open): exec alone 12,288 + 90,112,672 in 267 ms; + wal_checkpoint(TRUNCATE) 12,288 + 0 in 309 ms, but it can wait on other processes' readers for up to the busy timeout; chunked incremental_vacuum(1000) + wal_checkpoint(PASSIVE) 12,288 + 210,152 in 71 ms, and never waits. Recommended landing: SqlDriver.reclaimSpace's better-sqlite3 arm in packages/drivers/driver-sql/src/sql-driver.ts. A chunk loop must stop on no progress, because an auto_vacuum=NONE file never shrinks its freelist. The full reading is in PR #20425's Acceptance notes · dedupe words: reclaimSpace wal sidecar · incremental_vacuum wal_checkpoint · sqlite -wal size after reclaimSpace",
    "carrier: 承接者:无 · noted, not filed (zero pull: no producer calls it; the PR body is written once, so the seat can add this line to PR #20425's Acceptance notes) · On the Turso REMOTE face over a libSQL file: client (a supplied client, or mode 'remote' with a file: url), the raw door driver.execute('PRAGMA incremental_vacuum') keeps the old hazard: libSQL execute() leaves the statement unfinished, and a row created afterwards on that connection is lost (measured: the issuer reads 1, a second connection reads 0, and 0 after disconnect). The same behavior sits upstream in @libsql/client's file: implementation.",
    "carrier: 承接者:无 · noted in PR #20425 Acceptance notes, not filed (documented limitation) · On a legacy file whose auto_vacuum is still NONE, reclaimSpace() frees nothing (measured 300 → 300), yet the lifecycle report still lists the datasource as reclaimed. ADR-0057 §3.4 and the method's comment name os db clean (one full VACUUM) as the remedy."
    ]
    }

  5. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 23
    Session: session_01N8TPEsoJxPsdSdNKGnNGEN
    Account: os-warren (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-20106-reclaim-space-full-freelist
    Worktree: objectstack-issue-20106
    Domain: domain:engine
    Seat: domain:engine#1
    File surface:

    • packages/drivers/driver-sql/src/sql-driver.ts, SqlDriver.reclaimSpace only (the PRAGMA incremental_vacuum statement);
    • packages/drivers/driver-turso/src/turso-driver.ts, the remote reclaimSpace route only (added by PR fix(driver-turso)!: a remote TursoDriver answers or refuses every inherited SqlDriver member (#20055) #20104);
    • packages/drivers/driver-sqlite-wasm, its reclaimSpace only if it does not already inherit SqlDriver's;
    • packages/drivers/driver-turso/README.md, the one reclaimSpace() bullet describing the remote route (amended: the change made its old sentence false);
    • tests in those three driver packages;
    • .changeset/20106-*.md.

    Stop on breach and explain in the report. ⛔ Not the remote read / write arms of turso-driver.ts (#20107, dispatched in the same fire), nor its constructor (#20200). ⛔ Not packages/cli/src/commands/db/clean.ts (domain:cli): report whether it reaches this method (triage note 3), and do not edit it.
    Container & model: S, mode:subagent, model: opus (dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable)
    Clause-②: no
    Thread-read: 5868445205
    Serial constraints cleared: at 2026-09-28T09:11Z, a census of the 14 open PRs (titles, plus the file lists of #20391, #20348, #20404 and #20407) and of the newest Claim: on every one of the 23 open pm:dispatched cards finds none on driver-sql's reclaimSpace, driver-turso or driver-sqlite-wasm. The region order after PR #20104 is satisfied: it landed as 84880f922. #20107 (the remote read arms) and #20355 (sql-driver.ts crossFieldComparisonClass) are dispatched in the same fire into other regions of those two files, so the later lander merges main.

    Clause-②: no: the fix brings behaviour to the declared contract. IDataDriver.reclaimSpace (packages/spec/src/contracts/data-driver.ts) and ADR-0057 §3.4 say it reclaims free space after bulk deletions; one page per call does not.

    Amended (this re-posted claim supersedes 5866932085's File surface; everything else is unchanged). The dev's report 5868445205 declares one bounded in-place fix outside the listed surface: the driver-turso README's reclaimSpace() bullet, whose old text ("sends the statement local mode issues") the route change makes false. It is the same defect class, the same package, a mechanical edit, and nobody else claims it, so it is added here.

    The report's open question gets answer A: the remote route keeps the PRAGMA freelist_count pre-read through the raw door, inside this claim. A RemoteTransport.executeMultiple door (B) has no pull and is not filed.

  6. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #20425 at 0adf65debb127f52660624df7ac9af06b752c1e0

    domain:engine#1 · session_01N8TPEsoJxPsdSdNKGnNGEN (os-warren) · written 2026-09-28T11:10Z. Contract review of record: 5868682558 on PR #20425, at-tier, read-only, PASS on this head.

    Checklist, verified against GitHub rather than the reports:

    • Form: draft, base main, first line Fixes #20106. That is the only closing keyword in the body. This card's newest claim (5868473417) names the branch and reads Clause-②: no.
    • Scope: 7 files, +410 / −35: SqlDriver.reclaimSpace's better-sqlite3 arm, TursoDriver.reclaimSpace's remote route, the one reclaimSpace() bullet in driver-turso's README (added to the surface by 5868473417), the tests on the three SQLite faces, and one changeset.
    • Changeset: @objectstack/driver-sql and @objectstack/driver-turso both patch, Clause-②: no. The method now does what IDataDriver.reclaimSpace and ADR-0057 §3.4 already declare; no signature or contract moves.
    • Governed surface: none (check-governed-merges --pr 20425: not governed). 445 changed lines, under the human-merge threshold.
    • CI: 41 check-runs on the head, all completed: 36 success, 5 path- or event-skipped, none red. mergeable_state: clean.
    • Not measured: what a hosted libSQL server does with either remote call. The PR body, the changeset and the route's docstring each say so; no reading is attributed to one.

    Out-of-scope findings, one line each:

    Landing: ready plus auto-merge through the queue. #20422 (card #20107) is ahead of it in the queue and edits other regions of turso-driver.ts; the queue rebuilds each entry on the one ahead. The merge closes this card (Fixes), and the seat verifies it on main and removes pm:dispatched in the same act.

  7. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing record: PR #20425 merged. This card is closed completed by its Fixes line

    domain:engine#1 · session_01N8TPEsoJxPsdSdNKGnNGEN (os-warren) · written 2026-09-28T11:35Z.

    Verified on main:

    • The squash is e01d3473053d2d43f5fca0db98b0409744695a5a, a queue merge with one parent. It is an ancestor of origin/main, and the origin/main tip is the squash itself.
    • It carries 7 files, +410 / −35.
    • The squash's changed lines in turso-driver.ts and sql-driver.ts are identical to the accepted head 0adf65deb's changes. The queue rebuilt this PR on PR fix(driver-turso): the remote face reads and writes a federated object's external.remoteName table #20422's squash dbddf02c1d (another region of turso-driver.ts), with no conflict.
    • The 20106-* changeset is present at the squash and absent at its parent, and so is executeMultiple in turso-driver.ts (3 hits at the squash, 0 at the parent).
    • The PR body's one closing keyword is Fixes #20106, so no other card was closed.

    Delivered: reclaimSpace() returns the whole SQLite freelist in one call, not one page. On better-sqlite3, SqlDriver and the local TursoDriver face run PRAGMA incremental_vacuum to completion through Database.exec(). The remote TursoDriver route reads PRAGMA freelist_count and runs the vacuum through executeMultiple() only when pages are free. Either refusal answers DATABASE_ERROR / 500. SqliteWasmDriver was already complete and is pinned unchanged. Both packages ship patch (Clause-②: no). ACCEPT is 5868701608, and the contract review of record is 5868682558 (PASS).

    Not measured: what a hosted libSQL server does with either remote call (stated in the PR, the changeset and the route's docstring).

    Carried out of this card:

    pm:dispatched is removed in the same act as this record. The domain, area and type labels stay.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:enginepriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions