Skip to content

feat(db): track applied loadSubset coverage - #1774

Open
KyleAMathews wants to merge 32 commits into
codex/loadsubset-outcome-plumbingfrom
codex/loadsubset-coverage-registry
Open

feat(db): track applied loadSubset coverage#1774
KyleAMathews wants to merge 32 commits into
codex/loadsubset-outcome-plumbingfrom
codex/loadsubset-coverage-registry

Conversation

@KyleAMathews

Copy link
Copy Markdown
Collaborator

This adds a source-side coverage registry that publishes only exact, authoritative loadSubset facts backed by rows that have reached the collection. It also keeps cleanup retry-safe and restores Query DB's eager observer after TanStack Query removes its cache entry.

Root cause

Request intent and a resolved adapter Promise do not prove that a source has established reusable coverage. Coverage also cannot own adapter resources or rows implicitly: compaction, stale results, failed release, and cache removal each have different lifetimes.

Approach

  • Track demand leases, physical acquisitions, applied coverage, and row provenance as separate records.
  • Bind publication tokens to the exact collection, source, demand, and current generation.
  • Publish finite-prefix coverage only from applied row keys: either at least the requested limit, or fewer rows plus exact exhaustion.
  • Integrate publication and release with _sync.loadSubset and _sync.unloadSubset.
  • Keep release atomic. A throwing adapter callback leaves ownership intact, surfaces the original error, and can be retried without repeating callbacks that already succeeded.
  • Recreate Query DB's eager lifetime observer after cache removal without retiring its owned rows.

Key invariants

  • Requests and unknown extents establish no coverage.
  • Stale or mismatched outcomes establish neither rows nor coverage.
  • Public coverage facts are defensive immutable snapshots.
  • Coverage compaction never erases leases, acquisitions, or row ownership.
  • Logical retirement and GC happen only after every required release callback succeeds.
  • Query cache removal does not release eager collection ownership.

Non-goals

  • This PR does not yet use coverage to suppress or combine future load requests.
  • It does not change adapter query planning or public query syntax.

Verification

pnpm vitest run packages/db/tests/load-subset-outcome.test.ts packages/db/tests/query/coverage-registry-oracle.property.test.ts packages/db/tests/query/load-subset-oracle.property.test.ts packages/query-db-collection/tests/ownership-lifecycle.oracle.test.ts packages/query-db-collection/tests/query.test.ts --maxWorkers=1
pnpm --filter @tanstack/db test
pnpm --filter @tanstack/query-db-collection test
pnpm --filter @tanstack/db build
pnpm --filter @tanstack/query-db-collection build
pnpm --filter @tanstack/db lint
pnpm --filter @tanstack/query-db-collection lint

The coverage-registry command model also passes a 100× campaign of 10,000 generated histories.

Files changed

  • packages/db/src/query/coverage-registry.ts: coverage, ownership, generation, and retry-safe release state.
  • packages/db/src/collection/sync.ts: production load/unload integration.
  • packages/db/src/query/load-subset-outcome.ts and types: exact applied-row evidence.
  • packages/db/tests/query/coverage-registry-oracle.property.test.ts: command/state-machine oracle and focused laws.
  • packages/query-db-collection/src/query.ts: eager lifetime observer repair.
  • packages/db/src/query/live/ARCHITECTURE.md: source coverage and release contracts.

Depends on #1772. Part of #1657.

@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 17049449-577f-4249-8f94-f916e13113ee

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@pkg-pr-new

pkg-pr-new Bot commented Aug 25, 2026

Copy link
Copy Markdown
More templates

@tanstack/angular-db

npm i https://pkg.pr.new/@tanstack/angular-db@1774

@tanstack/browser-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/browser-db-sqlite-persistence@1774

@tanstack/capacitor-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/capacitor-db-sqlite-persistence@1774

@tanstack/cloudflare-durable-objects-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/cloudflare-durable-objects-db-sqlite-persistence@1774

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@1774

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@1774

@tanstack/db-sqlite-persistence-core

npm i https://pkg.pr.new/@tanstack/db-sqlite-persistence-core@1774

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@1774

@tanstack/electron-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/electron-db-sqlite-persistence@1774

@tanstack/expo-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/expo-db-sqlite-persistence@1774

@tanstack/node-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/node-db-sqlite-persistence@1774

@tanstack/offline-transactions

npm i https://pkg.pr.new/@tanstack/offline-transactions@1774

@tanstack/powersync-db-collection

npm i https://pkg.pr.new/@tanstack/powersync-db-collection@1774

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@1774

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@1774

@tanstack/react-native-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/react-native-db-sqlite-persistence@1774

@tanstack/react-router-with-db

npm i https://pkg.pr.new/@tanstack/react-router-with-db@1774

@tanstack/rxdb-db-collection

npm i https://pkg.pr.new/@tanstack/rxdb-db-collection@1774

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@1774

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@1774

@tanstack/tauri-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/tauri-db-sqlite-persistence@1774

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@1774

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@1774

commit: 7bb86a8

@github-actions

github-actions Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Size Change: +6.72 kB (+4.14%)

Total Size: 169 kB

📦 View Changed
Filename Size Change
packages/db/dist/esm/collection/state.js 6.08 kB +308 B (+5.34%) 🔍
packages/db/dist/esm/collection/subscription.js 6.24 kB +240 B (+4%)
packages/db/dist/esm/collection/sync.js 7.12 kB +2.16 kB (+43.66%) 🚨
packages/db/dist/esm/query/builder/get-query-ir.js 121 B +121 B (new file) 🆕
packages/db/dist/esm/query/builder/index.js 6.6 kB +9 B (+0.14%)
packages/db/dist/esm/query/coverage-registry.js 3.49 kB +3.49 kB (new file) 🆕
packages/db/dist/esm/query/ir-stable-identity.js 4.17 kB +96 B (+2.36%)
packages/db/dist/esm/query/live/collection-config-builder.js 7.32 kB +121 B (+1.68%)
packages/db/dist/esm/query/live/collection-subscriber.js 2.48 kB +64 B (+2.65%)
packages/db/dist/esm/query/live/utils.js 1.36 kB +10 B (+0.74%)
packages/db/dist/esm/query/load-subset-outcome.js 557 B +50 B (+9.86%) ⚠️
packages/db/dist/esm/query/runtime-reference-identity.js 446 B +37 B (+9.05%) 🔍
packages/db/dist/esm/query/subset-dedupe.js 1.54 kB +11 B (+0.72%)
ℹ️ View Unchanged
Filename Size
packages/db/dist/esm/client.js 3.66 kB
packages/db/dist/esm/collection-options.js 236 B
packages/db/dist/esm/collection/change-events.js 1.44 kB
packages/db/dist/esm/collection/changes.js 1.95 kB
packages/db/dist/esm/collection/cleanup-queue.js 810 B
packages/db/dist/esm/collection/events.js 434 B
packages/db/dist/esm/collection/index.js 3.99 kB
packages/db/dist/esm/collection/indexes.js 1.99 kB
packages/db/dist/esm/collection/lifecycle.js 1.86 kB
packages/db/dist/esm/collection/mutations.js 2.54 kB
packages/db/dist/esm/collection/transaction-metadata.js 144 B
packages/db/dist/esm/deferred.js 207 B
packages/db/dist/esm/errors.js 5.3 kB
packages/db/dist/esm/event-emitter.js 748 B
packages/db/dist/esm/index.js 3.79 kB
packages/db/dist/esm/indexes/auto-index.js 829 B
packages/db/dist/esm/indexes/base-index.js 784 B
packages/db/dist/esm/indexes/basic-index.js 2.17 kB
packages/db/dist/esm/indexes/btree-index.js 2.29 kB
packages/db/dist/esm/indexes/index-registry.js 820 B
packages/db/dist/esm/indexes/reverse-index.js 557 B
packages/db/dist/esm/live-query-adapter.js 318 B
packages/db/dist/esm/live-query-observer.js 3.65 kB
packages/db/dist/esm/live-query-options.js 702 B
packages/db/dist/esm/live-query-window-controller.js 4.43 kB
packages/db/dist/esm/local-only.js 975 B
packages/db/dist/esm/local-storage.js 2.18 kB
packages/db/dist/esm/optimistic-action.js 359 B
packages/db/dist/esm/paced-mutations.js 496 B
packages/db/dist/esm/proxy.js 3.75 kB
packages/db/dist/esm/query/builder/functions.js 1.47 kB
packages/db/dist/esm/query/builder/ref-proxy.js 1.24 kB
packages/db/dist/esm/query/compiler/evaluators.js 1.9 kB
packages/db/dist/esm/query/compiler/expressions.js 430 B
packages/db/dist/esm/query/compiler/group-by.js 3.69 kB
packages/db/dist/esm/query/compiler/index.js 8.71 kB
packages/db/dist/esm/query/compiler/joins.js 2.95 kB
packages/db/dist/esm/query/compiler/lazy-targets.js 1.11 kB
packages/db/dist/esm/query/compiler/order-by.js 1.8 kB
packages/db/dist/esm/query/compiler/parent-routes.js 319 B
packages/db/dist/esm/query/compiler/route-metadata.js 419 B
packages/db/dist/esm/query/compiler/select.js 1.58 kB
packages/db/dist/esm/query/effect.js 5.19 kB
packages/db/dist/esm/query/expression-helpers.js 1.43 kB
packages/db/dist/esm/query/ir.js 1.59 kB
packages/db/dist/esm/query/live-query-collection.js 391 B
packages/db/dist/esm/query/live/bucket-facade-adapter.js 2.76 kB
packages/db/dist/esm/query/live/collection-registry.js 264 B
packages/db/dist/esm/query/live/internal.js 145 B
packages/db/dist/esm/query/live/materialized-pipeline.js 2.47 kB
packages/db/dist/esm/query/live/subset-demand-controller.js 1.23 kB
packages/db/dist/esm/query/load-subset-options.js 1.08 kB
packages/db/dist/esm/query/optimizer.js 2.92 kB
packages/db/dist/esm/query/predicate-utils.js 3.38 kB
packages/db/dist/esm/query/query-once.js 359 B
packages/db/dist/esm/scheduler.js 1.43 kB
packages/db/dist/esm/SortedMap.js 1.3 kB
packages/db/dist/esm/strategies/debounceStrategy.js 247 B
packages/db/dist/esm/strategies/queueStrategy.js 428 B
packages/db/dist/esm/strategies/throttleStrategy.js 246 B
packages/db/dist/esm/transactions.js 3.5 kB
packages/db/dist/esm/utils.js 927 B
packages/db/dist/esm/utils/array-utils.js 273 B
packages/db/dist/esm/utils/browser-polyfills.js 304 B
packages/db/dist/esm/utils/btree.js 5.61 kB
packages/db/dist/esm/utils/comparison.js 1.34 kB
packages/db/dist/esm/utils/cursor.js 457 B
packages/db/dist/esm/utils/index-optimization.js 2.39 kB
packages/db/dist/esm/utils/type-guards.js 157 B
packages/db/dist/esm/utils/uuid.js 449 B
packages/db/dist/esm/virtual-props.js 360 B

compressed-size-action::db-package-size

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 7.25 kB

ℹ️ View Unchanged
Filename Size
packages/react-db/dist/esm/DbProvider.js 317 B
packages/react-db/dist/esm/HydrationBoundary.js 263 B
packages/react-db/dist/esm/index.js 330 B
packages/react-db/dist/esm/live-query-internals.js 282 B
packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.81 kB
packages/react-db/dist/esm/useLiveQuery.js 2.68 kB
packages/react-db/dist/esm/useLiveQueryEffect.js 355 B
packages/react-db/dist/esm/useLiveSuspenseQuery.js 812 B
packages/react-db/dist/esm/usePacedMutations.js 401 B

compressed-size-action::react-db-package-size

KyleAMathews and others added 15 commits August 25, 2026 14:22
…t-coverage-registry

# Conflicts:
#	packages/db/src/collection/sync.ts
#	packages/db/tests/load-subset-outcome.test.ts
…t-coverage-registry

# Conflicts:
#	packages/db/src/query/live/collection-config-builder.ts
#	packages/db/src/types.ts
#	packages/db/tests/collection-subscription.test.ts
…t-coverage-registry

# Conflicts:
#	packages/db/src/collection/sync.ts
#	packages/db/src/query/live/collection-config-builder.ts
#	packages/db/tests/collection-subscription.test.ts
#	packages/db/tests/load-subset-outcome.test.ts
…t-coverage-registry

# Conflicts:
#	packages/db/src/collection/sync.ts
…t-coverage-registry

# Conflicts:
#	packages/db/src/collection/subscription.ts
#	packages/db/tests/collection-subscription.test.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant