Skip to content

fix(solid-db): set key option to $key when calling reconcile - #1598

Closed
Leonabcd123 wants to merge 9 commits into
TanStack:mainfrom
Leonabcd123:fix/solid-db-id-rendering
Closed

Leonabcd123 wants to merge 9 commits into
TanStack:mainfrom
Leonabcd123:fix/solid-db-id-rendering

Conversation

@Leonabcd123

@Leonabcd123 Leonabcd123 commented Jun 18, 2026 •

Copy link
Copy Markdown

Fixes #1524.

🎯 Changes

Add key option when calling reconcile which is set to $key, which makes it so items are matched correctly even when the id property doesn't exist.

✅ Checklist

  • I have tested this code locally with pnpm test.

🚀 Release Impact

  • This change affects published code, and I have generated a changeset.
  • This change is docs/CI/dev-only (no release).

Summary by CodeRabbit

  • Bug Fixes

    • Fixed live query reconciliation to match list items using the correct key field, preventing incorrect item reuse during updates and reordering.
  • Tests

    • Added coverage for custom item keys, confirming that sorted results update to the expected order after an item changes.

@coderabbitai

coderabbitai Bot commented Jun 18, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5ee98229-f10f-4426-a8b3-96745f1054fc

📥 Commits

Reviewing files that changed from the base of the PR and between bc32c8d and a04b71a.

📒 Files selected for processing (3)
  • .changeset/solid-id-rendering.md
  • packages/solid-db/src/useLiveQuery.ts
  • packages/solid-db/tests/useLiveQuery.test.tsx
💤 Files with no reviewable changes (1)
  • .changeset/solid-id-rendering.md
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/solid-db/src/useLiveQuery.ts
  • packages/solid-db/tests/useLiveQuery.test.tsx

📝 Walkthrough

Walkthrough

syncDataFromCollection now passes { key: "$key" } to reconcile. A regression test verifies item preservation and reordering for a collection keyed by _id. A patch changeset records the fix.

Changes

useLiveQuery reconciliation key fix

Layer / File(s) Summary
Reconciliation key and regression coverage
packages/solid-db/src/useLiveQuery.ts, packages/solid-db/tests/useLiveQuery.test.tsx, .changeset/solid-id-rendering.md
syncDataFromCollection now passes { key: "$key" } to reconcile. The test verifies that an _id-keyed collection preserves existing items and reorders results after an item name changes. The changeset records a patch release.

Estimated code review effort: 2 (Simple) | ~8 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the Solid DB fix and the specific reconcile key option change.
Description check ✅ Passed The description explains the fix, records local testing, and confirms the required changeset for published code.
Linked Issues check ✅ Passed The implementation and regression test address issue #1524 by reconciling items with custom keys such as _id.
Out of Scope Changes check ✅ Passed The source fix, regression test, and changeset are directly related to issue #1524 and the stated pull request objectives.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@Leonabcd123 Leonabcd123 changed the title fix(solid-db): set key property for reconciliation fix(solid-db): set key option to $key when calling reconcile Jun 18, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.changeset/solid-id-rendering.md:
- Line 5: The release note in the changeset file contains two typos that need
correction on line 5: the phrase "that that" appears as a duplicate word and
should be simplified to "that", and the word "reconcilation" is misspelled and
should be corrected to "reconciliation". Update the text to fix both instances
so the release note reads clearly and professionally.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e433e653-ee95-4104-8db2-eb84d69e6a44

📥 Commits

Reviewing files that changed from the base of the PR and between 00389a4 and 31933e0.

📒 Files selected for processing (3)
  • .changeset/solid-id-rendering.md
  • packages/solid-db/src/useLiveQuery.ts
  • packages/solid-db/tests/useLiveQuery.test.tsx

Comment thread .changeset/solid-id-rendering.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/solid-db/tests/useLiveQuery.test.tsx (1)

2609-2639: ⚠️ Potential issue | 🟠 Major

Wrap useLiveQuery in a managed reactive root to avoid leaked subscriptions.

This test directly instantiates useLiveQuery without a reactive owner context. In Solid.js, effects and signals created by useLiveQuery must be disposed properly to prevent subscription leakage between tests. Use renderHook (the established pattern throughout this file) or createRoot with cleanup to ensure proper lifecycle management.

Suggested fix
-  const query = useLiveQuery((q) =>
-    q
-      .from({ items: collection })
-      .orderBy(({ items }) => items.name, `asc`),
-  )
+  const rendered = renderHook(() =>
+    useLiveQuery((q) =>
+      q
+        .from({ items: collection })
+        .orderBy(({ items }) => items.name, `asc`),
+    ),
+  )

   await waitFor(() => {
-    expect(query.isReady).toBe(true)
+    expect(rendered.result.isReady).toBe(true)
   })

   expect(
-    Array.from(query()).map((item) => item.name),
+    Array.from(rendered.result()).map((item) => item.name),
   ).toEqual([`Bob`, `Kevin`, `Stuart`])

   collection.utils.begin()
   collection.utils.write({
     type: `update`,
     value: {
       _id: `stuart1`,
       name: `Alvin`,
     },
   })
   collection.utils.commit()

   await waitFor(() => {
     expect(
-      Array.from(query()).map((item) => item.name),
+      Array.from(rendered.result()).map((item) => item.name),
     ).toEqual([`Alvin`, `Bob`, `Kevin`])
   })
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/solid-db/tests/useLiveQuery.test.tsx` around lines 2609 - 2639, The
test is directly calling useLiveQuery without a managed reactive root context,
which can leak subscriptions between tests in Solid.js. Wrap the useLiveQuery
call and all subsequent query operations in either renderHook (the established
pattern used elsewhere in this test file) or createRoot with proper cleanup to
ensure effects and signals are disposed correctly. This ensures the reactive
context is properly initialized and cleaned up after the test completes,
preventing subscription leakage.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@packages/solid-db/tests/useLiveQuery.test.tsx`:
- Around line 2609-2639: The test is directly calling useLiveQuery without a
managed reactive root context, which can leak subscriptions between tests in
Solid.js. Wrap the useLiveQuery call and all subsequent query operations in
either renderHook (the established pattern used elsewhere in this test file) or
createRoot with proper cleanup to ensure effects and signals are disposed
correctly. This ensures the reactive context is properly initialized and cleaned
up after the test completes, preventing subscription leakage.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c00179c5-f4e2-4a12-8731-4007dfcd934c

📥 Commits

Reviewing files that changed from the base of the PR and between bc32c8d and 21f021b.

📒 Files selected for processing (1)
  • packages/solid-db/tests/useLiveQuery.test.tsx

@coderabbitai

coderabbitai Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Reviews resumed.

@Leonabcd123

Copy link
Copy Markdown
Author

Superseded by #1825

@Leonabcd123
Leonabcd123 deleted the fix/solid-db-id-rendering branch September 17, 2026 03:38
Miodec added a commit to monkeytypegame/monkeytype that referenced this pull request Oct 27, 2026
## Summary

Updates the TanStack data + devtools packages in `frontend` to their
latest versions:

| Package | From | To | Kind |
| --- | --- | --- | --- |
| `@tanstack/solid-db` | 0.2.22 | **0.3.12** | dep |
| `@tanstack/query-db-collection` | 1.0.40 | **1.4.8** | dep |
| `@tanstack/solid-query` | 5.101.0 | **5.104.5** | dep |
| `@tanstack/solid-devtools` | 0.8.5 | **0.8.13** | devDep |
| `@tanstack/solid-query-devtools` | 5.101.0 | **5.104.5** | devDep |

```
frontend/src/ts/
├── collections/              # 8 query-backed collections: writes → await/void, isPersisted → when("settled"), id workaround removed
│   ├── results.ts            # + last-10 average live-query: empty single-result state ([] → undefined)
│   ├── tags.ts  presets.ts  connections.ts  inbox.ts
│   ├── ape-keys.ts  custom-themes.ts  result-filter-presets.ts
│   └── utils/misc.ts         # applyIdWorkaround deleted (TanStack/db#1524 fixed upstream)
├── ape/server-configuration.ts    # fetchQuery → queryClient.query()
├── router/routes.ts               # 9× prefetchQuery → query().catch(noop), ensureQueryData → query() + staleTime "static"
└── components/pages/
    ├── leaderboard/LeaderboardPage.tsx  # next-page prefetchQuery → query().catch(noop)
    └── profile/ProfileSearchPage.tsx    # fetchQuery → queryClient.query()
```

### Breaking changes found and how they were handled

<details>
<summary><b>1. <code>@tanstack/db</code> 0.15.0 — <code>setWindow</code>
on <code>findOne</code> queries (no code change, verified
unused)</b></summary>

Breaking: a `findOne` keeps its compiled limit (1). An ordered
`findOne`'s `setWindow` can move the offset but now **throws
`SetWindowFindOneLimitError`** for any other limit (before it silently
made the `findOne` return N rows); an unordered `findOne` with a nonzero
offset **throws `SetWindowRequiresOrderByError`**.

- Docs: [TanStack DB — Query
windowing](https://tanstack.com/db/latest/docs/queries/windowing)
- Changelog: [`@tanstack/db`
0.15.0](https://github.com/TanStack/db/blob/main/packages/db/CHANGELOG.md)

Our three `findOne()` usages (`results.ts` averages/daily-best) are
aggregate projections and never call `setWindow`/`getWindow` —
**verified unused, no fix needed**.

</details>

<details>
<summary><b>2. <code>@tanstack/db</code> 0.12.0 — removal of
<code>begin({ immediate })</code> (no code change, verified
unused)</b></summary>

Breaking: the `immediate` option of the sync `begin()` API was removed;
writes made while a mutation persists now queue behind it instead of
applying at once.

- Docs: [TanStack DB —
Transactions](https://tanstack.com/db/latest/docs/collections/transactions)
- Changelog: [`@tanstack/db`
0.12.0](https://github.com/TanStack/db/blob/main/packages/db/CHANGELOG.md)

The app never calls `begin({ immediate })` — **verified unused, no fix
needed**.

</details>

<details open>
<summary><b>3. <code>@tanstack/query-db-collection</code> 1.4.0 —
collection writes now reject promises instead of throwing synchronously
(code change)</b></summary>

Breaking: validation errors from `writeInsert`, `writeUpdate`,
`writeDelete`, `writeUpsert` and `writeBatch` now **reject the returned
promise**; before they threw synchronously. The changelog's migration
guidance: *"Await the promise and catch the error."*

- Docs: [TanStack DB — Query collections: direct
writes](https://tanstack.com/db/latest/docs/collections/query-collection)
- Changelog: [`@tanstack/query-db-collection` 1.4.0, PR
#2044](TanStack/db#2044)

Until 1.3.2 these writes returned a sync receipt, so all 31 call sites
in the 8 collections were bare expressions. Since writes now return
`Promise<void>`, they had to be handled or the repo's
`no-floating-promises` lint rule (error severity) fails:

- **24 calls inside async `mutationFn`s → `await`** (e.g.
`collections/tags.ts`, `results.ts`, `presets.ts`, `connections.ts`,
`ape-keys.ts`, `custom-themes.ts`, `result-filter-presets.ts`). This
preserves the old semantics exactly: a write validation failure rejects
the mutation (previously the sync throw already did, inside the async
function) instead of becoming an unhandled rejection.
- **7 calls inside sync `onMutate` / `writeBatch` callbacks → `void`**
(tags `toggleTagActive`/`setTagActive`/`clearActiveTags`, `inbox.ts`
batch delete/read) — sync callbacks can't await; these are
fire-and-forget, as before.

</details>

<details open>
<summary><b>4. <code>@tanstack/db</code> 0.15.x /
<code>query-db-collection</code> 1.3.5 — transaction settlement rework,
<code>isPersisted</code> deprecated (code change)</b></summary>

The sync transaction API gained two moments (accepted vs. visible):
`commit()` receipts and subset loads resolve at *visibility*, while
handler-facing writes resolve at *acceptance*. As part of this,
**`Transaction.isPersisted` is deprecated — "Use `when('settled')`
instead. This alias will be removed in the 1.0 RC."** (`when('settled')`
has the same resolve/reject semantics: resolves with the transaction on
success, rejects with the original error on failure.)

- Docs: [TanStack DB — Transactions:
`when()`](https://tanstack.com/db/latest/docs/collections/transactions)
- Changelog: [`@tanstack/db` 0.12.0 / 1.3.5
entry](https://github.com/TanStack/db/blob/main/packages/query-db-collection/CHANGELOG.md)

All **26** `await transaction.isPersisted.promise` occurrences (public
action wrappers in the 8 collections, e.g. `addCustomTheme`,
`insertApeKey`, `acceptConnection`, `updateResultTags`) → `await
transaction.when("settled")`.

</details>

<details open>
<summary><b>5. <code>@tanstack/solid-db</code> 0.2.46 — live-query
result types include the empty single-result representation (code
change)</b></summary>

Type-level breaking: conditional live-query result types were aligned
with the disabled/empty reactive bindings, so a `findOne()` inside
`useLiveQuery` now types its empty state as `[]` (empty array) in the
union: `{ ...; wpm: number; acc: number } | []`. Property access on the
union (`last10()?.wpm` in `AverageNotice.tsx`) no longer type-checks
(TS2339).

- Docs: [TanStack DB — Solid: live
queries](https://tanstack.com/db/latest/docs/frameworks/solid)
- Changelog: [`@tanstack/solid-db`
0.2.46](https://github.com/TanStack/db/blob/main/packages/solid-db/CHANGELOG.md)

`useUserAverage10LiveQuery` (`results.ts`) now normalizes through a
`createMemo`: `[]` (and `undefined`) → `undefined`, keeping the existing
"no average" rendering path. This is the only consumer of a
single-result live query.

</details>

<details open>
<summary><b>6. <code>@tanstack/query-core</code> 5.102.0 — imperative
<code>QueryClient</code> methods deprecated (code change)</b></summary>

Minor in 5.x (non-breaking: methods still work, removal is "next major
version"), but the repo lints deprecations as errors, so these had to be
migrated to the new API:

- `prefetchQuery` → **`queryClient.query(options)`** — new
`query()`/`infiniteQuery()` methods added in
[#10658](TanStack/query#10658). Unlike
`prefetchQuery` (which never rejected), `query()` rejects on error, so
fire-and-forget prefetches in `router/routes.ts` (9) and
`LeaderboardPage.tsx` (1) now end in `.catch(noop)` to keep the old
swallow-errors behavior.
- `fetchQuery` → **`queryClient.query(options)`** (1:1, both reject on
error): `ape/server-configuration.ts` sync, `ProfileSearchPage.tsx`
username validation.
- `ensureQueryData` → **`queryClient.query({ ...options, staleTime:
"static" })`** — the mapping recommended in the deprecation tag;
`staleTime: "static"` ("never stale") is new in 5.102. Used in the
friends route loader.
- Docs: [TanStack Query —
`QueryClient`](https://tanstack.com/query/latest/docs/framework/solid/api/queryclient#queryclientquery)

</details>

<details>
<summary><b>7. <code>@tanstack/solid-devtools</code> 0.8.5 → 0.8.13 /
core <code>@tanstack/devtools</code> 0.12.2 → 0.15.0 (no code
change)</b></summary>

The adapter is patch-only (0.8.x); the movement is in the core
`@tanstack/devtools` package it wraps. Relevant entries, checked against
our usage in `components/dev/TanstackDevtools.tsx` (`<TsDevTools
plugins={[inline query plugin, hotkeysDevtoolsPlugin(),
SignalsDevtoolsPlugin()]} config={{ defaultOpen: false }} />`):

- **Plugin pane workspace**
([#492](TanStack/devtools#492)): panes can now
be split/stacked/resized, up to 18 open (was 3). User-visible change;
also, `state.activePlugins` in the devtools `localStorage` state is
superseded by `state.layout` — **existing state is migrated
automatically on first read** (unusable entries repaired, unknown ids
dropped), so no app-side action needed.
- **Plugin lifecycle guarantees** (same PR): a pane's mount node is
never removed while the plugin is open (iframes/canvas keep living) and
`destroy` fires exactly once on close — a fix for plugin authors, no API
change.
- **`use*` → `create*` rename**
([#477](TanStack/devtools#477)): the only
breaking tag in the range is `@tanstack/devtools-ui`'s exported
`useTheme` → `createTheme` (prevents React Compiler from transforming
the Solid panel code). We don't import `@tanstack/devtools-ui` directly
— **no impact**.
- Docs: [TanStack Devtools](https://tanstack.com/devtools)

Our plugin objects (`{ id, name, render, defaultOpen }`) satisfy the
unchanged plugin interface — typecheck clean.
`@tanstack/solid-hotkeys-devtools@0.7.0` (unchanged) peers only on
`solid-js`, so no coupling with the new core.

</details>

<details>
<summary><b>8. <code>@tanstack/solid-query-devtools</code> 5.101.0 →
5.104.5 (no code change)</b></summary>

Patch-only range — every release is a version alignment with
`@tanstack/query-devtools`/`@tanstack/solid-query` (5.x stable, no API
changes). `SolidQueryDevtoolsPanel`'s `client` prop is unchanged. Docs:
[TanStack Query
devtools](https://tanstack.com/query/latest/docs/framework/solid/overview)

</details>

<details open>
<summary><b>9. <code>applyIdWorkaround</code> workaround removed (code
change)</b></summary>

`collections/utils/misc.ts` carried `applyIdWorkaround` — a temp
workaround for
[TanStack/db#1524](TanStack/db#1524) (Solid
rendering showed one item for all rows in a `getKey: (it) => it._id`
collection with ordered live queries, fixed by copying `_id` onto an
`id` property of every fetched row). That issue is closed and its fixes
— [solid-db#1598](TanStack/db#1598) (reconcile
key), [solid-db#1604](TanStack/db#1604) (row
cloning in `syncDataFromCollection`),
[solid-db#1825](TanStack/db#1825) (preserve live
result identity for custom-key rows, shipped in `@tanstack/solid-db`
0.2.46, see [Solid live-query
docs](https://tanstack.com/db/latest/docs/frameworks/solid)) — are all
part of the updated 0.3.12.

Removed the helper and all 7 usages (the `queryFn` row-mapping in the
`custom-themes`, `connections`, `ape-keys`, `presets`, `results`,
`result-filter-presets` and `tags` collections). All consumers type rows
via the zod schemas, which never declared `id`, so no code could depend
on the injected property — typecheck confirms.

</details>

### Entries checked and deliberately not actioned

- **`query-db-collection` 1.2.0**: QueryClient-default `placeholderData`
no longer materializes as collection rows, QueryClient-default
`initialData` no longer seeds on-demand subset observers. Our
`QueryClient` (`queries/index.ts`) sets neither globally — no impact.
- **`query-db-collection` 1.3.0**: mutation-handler auto-refetch
deprecated (`warnOnce` when a handler doesn't return `{ refetch: false
}`). Our collections register **no** `onInsert`/`onUpdate`/`onDelete`
handlers (mutations run through `createOptimisticAction` + explicit
`write*`), so the warning never fires. When handlers are ever added, the
library wants an explicit `{ refetch: false }` or manual `await
collection.utils.refetch()`.
- **`@tanstack/solid-db` 0.3.0 (minor)**: opt-in network-first initial
rendering for *persisted* (SQLite) collections (`initialRender: {
strategy: "network-first" }`, new `persistedStatus`/`isPersistedReady`
flags). We use pure Query-backed collections with no persistence adapter
— no impact.
- **`@tanstack/solid-query` 5.104.4**: type-only re-exports switched to
`export type *` — our named imports (incl. `UseQueryResult`) unaffected,
typecheck clean. (Same `export type *` change landed in
`solid-query-devtools`'s `query-devtools` dep — devtools-only, no app
code touched.)

## Evidence

- **Before:** draft — signed-in browser smoke test still owed, no
runtime evidence for the write/settlement rework.
**After:** smoke run on the dev server (3000/5005) as a signed-in test
account:

- **Average notice** (`useUserAverage10LiveQuery`): with ≥10 results it
shows the real average (84 wpm 87% acc); switching the test language so
the settings filter matches zero results, the empty single-result state
(`[]`) renders "no average" via the new `createMemo` normalization, and
switches back when the language returns — the only consumer of a
single-result live query.
- **Tags, presets, custom themes, ape keys**: create → rename → delete
through the real UI for each. Every mutation settled with no error
notification and no optimistic rollback; every `_id`-keyed list rendered
each row with its own data. Renaming a custom theme re-sorted it to the
top with both rows keeping their own name/colors — the
one-item-for-all-rows regression behind the removed `applyIdWorkaround`
(TanStack/db#1524) is not present.
- **Inbox/connections**: friends page renders with the (empty)
connections list; the account has no pending requests, so the
`writeBatch` read/delete path went unexercised.
- **`queryClient.query()`**: profile search rejects an unknown username
("Unknown user", submit disabled) and accepts an existing one (submit
enabled); the about page rendered all four prefetched sections; the
leaderboard rendered its table.
- **Devtools panel**: skipped — core package is patch-only alignment, no
app code touched.

Observed while smoke-testing (filed as bugs, not blockers): rename
modals (custom theme, ape key) apply the change but the modal takes
several seconds to close — `when("settled")` settles later than
`isPersisted` did for query-backed collections; and a SimpleModal whose
boolean input is never touched reports invalid until the checkbox is
toggled once (form layer, untouched by this PR).

- **Automated:**
  - `pnpm oxlint --type-aware --type-check` — exit 0, 0 errors
  - `pnpm vitest run` — 84 files, **1622/1622 tests pass**
- `pnpm vite build` — success (catches bundler-level issues from the
`export type *` change and the new `db-ivm` dep)

> The original draft note — a signed-in browser smoke test is still
owed: tag/preset/custom-theme create-edit-delete, inbox read/delete, the
average notice on the test page (the transaction-acceptance and
write-validation rework in 1.3.x/1.4.x is runtime behavior the test
suite doesn't exercise), reordering a `_id`-keyed list — e.g. rename a
custom theme so it sorts to the top and check every row shows its own
data (the regression behind the removed #1524 workaround) — and a look
at the redesigned devtools plugins panel (pane workspace layout, plus
the `localStorage` state migration for anyone who has customized open
panes) — is now resolved by the smoke run above; the observed issues
remain as filed bugs, not blockers.

## Merge Danger

**Door:** two-way

Dependency bump plus mechanical API migration; reverting the PR restores
the prior versions and behavior. No schema, storage, or API contract
changes — a rollback costs one revert.

**Blast Radius:** app-wide

Every signed-in data flow runs through the changed code: the 8
query-backed collections (tags, results, presets, connections, inbox,
ape keys, custom themes, result-filter-presets) with their new
write/settlement semantics, and every route's background data fetch on
the new `queryClient.query()` API. A divergence in write timing or
live-query reconciliation would surface as slow-closing modals,
rolled-back mutations, or duplicated list rows across the whole
signed-in experience.

---------

Co-authored-by: Jack <jack@monkeytype.com>
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.

solid-db rendering issues when not using key named id

1 participant