Skip to content

test: harden fix-wave oracle ownership - #1847

Merged
KyleAMathews merged 2 commits into
mainfrom
codex/wave2-oracle-hardening
Sep 17, 2026
Merged

KyleAMathews merged 2 commits into
mainfrom
codex/wave2-oracle-hardening

Conversation

@KyleAMathews

@KyleAMathews KyleAMathews commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator

Summary

Moves the permanent regression laws from PRs #1833 and #1834 into their established independent oracle owners, registers those owners in the documented campaigns, and records the correct authority for the rest of the recent fix wave. There are no runtime, API, dependency, or shipped-artifact changes.

Root cause

The recent fixes carried good same-path regression evidence, but some of that evidence lived in broad conventional suites rather than the independent model/property owners responsible for the underlying ordering and equality laws. One receiving owner was also absent from the focused DB oracle campaign, and PowerSync had no focused campaign entry point despite already having a real-provider correctness oracle.

Approach

Key invariants

  • A receiving owner must fail on the historical defect or faithful mutant and pass on current main.
  • Ordering evidence must exercise both scan and eager auto-index paths and preserve the exact provider request contract.
  • Join equality must agree with an independent predicate evaluator across the established value-identity domains and lifecycle transitions.
  • Full-join lifecycle evidence must preserve every unmatched row when multiple same-side rows share a null join key.
  • Specialized backend and type-algebra authorities remain specialized.
  • Every focused oracle owner must be reachable from its documented campaign.

Non-goals

Trade-offs

The equality matrix makes the cold-join owner larger, but keeps the law under one existing independent authority and removes a larger duplicate block from the broad join suite. PowerSync remains a real SDK/SQLite oracle rather than being replaced by a portable synthetic fixture.

Verification

Historical RED evidence:

Current GREEN evidence:

pnpm --filter @tanstack/db test:oracles
# 37 files, 2,065 tests; no type errors

pnpm --filter @tanstack/powersync-db-collection test:oracles
# 1 file, 9 tests; no type errors
  • Receiving-owner focus: 257 tests passed.
  • Conventional collateral: 113 tests passed.
  • Typechecks passed for DB, PowerSync, DB-IVM, and Offline Transactions.
  • ESLint, Prettier, pre-commit lint-staged, and git diff --check passed.
  • Docs-link verification remains at the exact baseline of 49 pre-existing links outside /docs; this branch adds none.
  • The strengthened duplicate-null lifecycle owner passes all 32 tests and keeps the exact pair at every checkpoint in both modes.

Shipped-weight proof:

  • @tanstack/db: 358 JS/declaration artifacts and 2,349,100 bytes on both base and branch; dist trees identical.
  • PowerSync: 36 artifacts and 140,123 bytes on both base and branch; dist trees identical.
  • Separate source delta: docs +22/-2, manifests +3/-2, tests +592/-517; no src, dist, lockfile, dependency, or changeset changes.

Files changed

  • docs/contributing/oracle-coverage.md: records fix-wave authority, focused campaigns, and Electric's real-provider prerequisites.
  • packages/db/package.json: registers the cold-join owner.
  • packages/db/tests/query/pagination-oracle.property.test.ts: receives fix(db): preserve default locale collation options #1833's permanent ordering law.
  • packages/db/tests/query/cold-join-reconciliation-oracle.test.ts: receives fix(db): align join keys with equality identity #1834's permanent equality law, including duplicate same-side null multiplicity through lifecycle transitions.
  • packages/db/tests/collection-auto-index.test.ts and packages/db/tests/query/join.test.ts: delete losslessly duplicated regressions.
  • packages/powersync-db-collection/package.json: exposes the existing real-provider oracle campaign.

Related: #1831, #1832, #1833, #1834, #1835, #1842

Summary by CodeRabbit

  • Documentation

    • Expanded contributor guidance for identifying authoritative correctness tests and finding owners.
    • Added commands for running oracle and service-dependent end-to-end test suites.
  • Tests

    • Added comprehensive join-equality coverage across supported value types, indexing modes, replacement histories, and lazy loading.
    • Added coverage for locale-aware ordering, numeric sorting, inherited collection settings, pagination, and auto-index behavior.
    • Updated correctness test commands to include the new oracle scenarios.

@coderabbitai

coderabbitai Bot commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 6860c3f6-ea26-4b76-baac-8eefa80c78f0

📥 Commits

Reviewing files that changed from the base of the PR and between 873e3ec and f6d2ac7.

📒 Files selected for processing (2)
  • docs/contributing/oracle-coverage.md
  • packages/db/tests/query/cold-join-reconciliation-oracle.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/contributing/oracle-coverage.md

Included review availability: Your plan provides up to 8 included reviews per hour; 6 remain after this review.


📝 Walkthrough

Walkthrough

The change adds focused join and collation oracle coverage, removes overlapping join tests, and updates package scripts and contributor documentation for oracle ownership and execution.

Changes

Oracle coverage consolidation

Layer / File(s) Summary
Join equality oracle coverage
packages/db/tests/query/cold-join-reconciliation-oracle.test.ts, packages/db/tests/query/join.test.ts, packages/db/package.json
Adds equality coverage across value domains, replacement histories, auto-index modes, duplicate null rows, and lazy binary loading. Removes equivalent cases from the general join suite and registers the oracle test command.
Inherited collation oracle coverage
packages/db/tests/query/pagination-oracle.property.test.ts, packages/db/tests/collection-auto-index.test.ts
Tests inherited locale collation, lexical versus numeric ordering, and eager versus disabled auto-indexing. Removes two overlapping locale compare-option tests.
Oracle campaign wiring and documentation
packages/powersync-db-collection/package.json, docs/contributing/oracle-coverage.md
Adds the PowerSync oracle command and documents oracle ownership, authority limits, and commands for running the campaigns.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Other

Merge Risk: ⚪ Minimal · up to f6d2a

This PR changes regression coverage, test commands, and documentation; no current merge-blocking risk remains.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 2 files. (1 skipped: 1 … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly identifies the main change: strengthening oracle ownership for the fix wave.
Description check ✅ Passed The description thoroughly explains the changes, motivation, approach, invariants, non-goals, trade-offs, verification, and release impact. It does not use the template headings or include the checkli…
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 2 files. (1 skipped: 1 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

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 Sep 17, 2026

Copy link
Copy Markdown
More templates

@tanstack/angular-db

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

@tanstack/browser-db-sqlite-persistence

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

@tanstack/capacitor-db-sqlite-persistence

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

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

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/db-sqlite-persistence-core

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

@tanstack/electric-db-collection

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

@tanstack/electron-db-sqlite-persistence

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

@tanstack/expo-db-sqlite-persistence

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

@tanstack/node-db-sqlite-persistence

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

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

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

@tanstack/react-router-with-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/tauri-db-sqlite-persistence

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: f6d2ac7

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 165 kB

ℹ️ 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 2.25 kB
packages/db/dist/esm/collection/cleanup-queue.js 794 B
packages/db/dist/esm/collection/events.js 481 B
packages/db/dist/esm/collection/index.js 4.6 kB
packages/db/dist/esm/collection/indexes.js 1.99 kB
packages/db/dist/esm/collection/lifecycle.js 2.15 kB
packages/db/dist/esm/collection/mutations.js 2.53 kB
packages/db/dist/esm/collection/state.js 6.51 kB
packages/db/dist/esm/collection/subscription.js 8.72 kB
packages/db/dist/esm/collection/sync.js 4.62 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.26 kB
packages/db/dist/esm/event-emitter.js 964 B
packages/db/dist/esm/index.js 3.68 kB
packages/db/dist/esm/indexes/auto-index.js 829 B
packages/db/dist/esm/indexes/base-index.js 1.14 kB
packages/db/dist/esm/indexes/basic-index.js 2.07 kB
packages/db/dist/esm/indexes/btree-index.js 2.26 kB
packages/db/dist/esm/indexes/index-registry.js 820 B
packages/db/dist/esm/indexes/reverse-index.js 376 B
packages/db/dist/esm/live-query-adapter.js 318 B
packages/db/dist/esm/live-query-observer.js 3.69 kB
packages/db/dist/esm/live-query-options.js 702 B
packages/db/dist/esm/live-query-window-controller.js 4.36 kB
packages/db/dist/esm/local-only.js 989 B
packages/db/dist/esm/local-storage.js 2.17 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.32 kB
packages/db/dist/esm/query/builder/functions.js 1.47 kB
packages/db/dist/esm/query/builder/index.js 6.69 kB
packages/db/dist/esm/query/builder/query-ir.js 116 B
packages/db/dist/esm/query/builder/ref-proxy.js 1.24 kB
packages/db/dist/esm/query/compiler/evaluators.js 1.92 kB
packages/db/dist/esm/query/compiler/expressions.js 560 B
packages/db/dist/esm/query/compiler/group-by.js 4.13 kB
packages/db/dist/esm/query/compiler/index.js 9.06 kB
packages/db/dist/esm/query/compiler/joins.js 2.95 kB
packages/db/dist/esm/query/compiler/lazy-targets.js 1.1 kB
packages/db/dist/esm/query/compiler/order-by.js 1.91 kB
packages/db/dist/esm/query/compiler/parent-routes.js 319 B
packages/db/dist/esm/query/compiler/route-metadata.js 1.24 kB
packages/db/dist/esm/query/compiler/select.js 1.58 kB
packages/db/dist/esm/query/effect.js 4.6 kB
packages/db/dist/esm/query/equality-value-identity.js 591 B
packages/db/dist/esm/query/expression-helpers.js 1.43 kB
packages/db/dist/esm/query/ir-stable-identity.js 4.04 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.73 kB
packages/db/dist/esm/query/live/collection-config-builder.js 6.97 kB
packages/db/dist/esm/query/live/collection-registry.js 264 B
packages/db/dist/esm/query/live/collection-subscriber.js 2.25 kB
packages/db/dist/esm/query/live/internal.js 145 B
packages/db/dist/esm/query/live/materialized-pipeline.js 2.32 kB
packages/db/dist/esm/query/live/ordered-source-loader.js 3.14 kB
packages/db/dist/esm/query/live/subset-demand-controller.js 1.26 kB
packages/db/dist/esm/query/live/utils.js 1.14 kB
packages/db/dist/esm/query/optimizer.js 2.91 kB
packages/db/dist/esm/query/query-once.js 359 B
packages/db/dist/esm/query/runtime-reference-identity.js 572 B
packages/db/dist/esm/query/subset-dedupe.js 486 B
packages/db/dist/esm/scheduler.js 1.34 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.71 kB
packages/db/dist/esm/utils.js 1.01 kB
packages/db/dist/esm/utils/array-utils.js 270 B
packages/db/dist/esm/utils/browser-polyfills.js 304 B
packages/db/dist/esm/utils/btree.js 4.51 kB
packages/db/dist/esm/utils/callbacks.js 174 B
packages/db/dist/esm/utils/comparison.js 1.49 kB
packages/db/dist/esm/utils/cursor.js 676 B
packages/db/dist/esm/utils/error.js 167 B
packages/db/dist/esm/utils/get-or-create.js 155 B
packages/db/dist/esm/utils/index-optimization.js 2.42 kB
packages/db/dist/esm/utils/type-guards.js 230 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.34 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.9 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
KyleAMathews merged commit 2841fde into main Sep 17, 2026
11 checks passed
@KyleAMathews
KyleAMathews deleted the codex/wave2-oracle-hardening branch September 17, 2026 16:25
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