diff --git a/.fallowrc.jsonc b/.fallowrc.jsonc
index 477875d..4c840ff 100644
--- a/.fallowrc.jsonc
+++ b/.fallowrc.jsonc
@@ -1,16 +1,19 @@
{
"$schema": "./node_modules/fallow/schema.json",
- // Astro copies this browser entry from public/ and loads it through the
- // Starlight head configuration, which static import analysis cannot follow.
- "entry": ["apps/docs/public/package-version.js", "playwright.docs.config.ts"],
+ "entry": [
+ "scripts/measure-construction.mts",
+ "scripts/verify-docs-examples.mts",
+ "apps/docs/public/package-version.js",
+ "playwright.docs.config.ts",
+ "tests/types/*.{ts,tsx}"
+ ],
"ignorePatterns": ["examples/tanstack-start/src/routeTree.gen.ts"],
- // Framework tooling consumes these exports through convention-generated entries.
"ignoreExports": [
{
- "file": "apps/docs/astro.config.mjs",
+ "file": "apps/docs/astro.config.mts",
"exports": ["default"]
},
{
@@ -27,10 +30,9 @@
}
],
- // Each executable example keeps its resource ownership and cancellation
- // workflow and UI in place so readers can understand and copy the integration.
- // Fingerprints expire when the duplicated code or occurrence count changes.
"duplicates": {
+ "mode": "semantic",
+ "near": true,
"ignoredClones": [
"dup:22704c46:2",
"dup:3fec4231:2",
@@ -54,21 +56,21 @@
]
},
- // Vite+ tasks, packing, and imported lint presets invoke tools Fallow cannot trace.
- // Keep Effect peer and test dependencies available for the library and fixtures.
"ignoreDependencies": [
"@arethetypeswrong/cli",
+ "@effect/platform-node",
"@effect/tsgo",
"@effect/vitest",
"@shadcn/lint",
+ "@tanstack/intent",
"effect",
"publint",
+ // React belongs to the private apps; Fallow attributes shared example sources to the root.
+ "react",
"typescript-5.9",
"unplugin-unused"
],
- // Health measures shipped library code in src/. Exclude docs, examples,
- // tooling, and tests here; other audits retain their repository-wide scope.
"health": {
"ignore": [
"apps/**",
@@ -85,8 +87,13 @@
"rules": {
"private-type-leaks": "error",
- // Public-entry suppressions are valid in the entry audit but necessarily
- // look stale in production mode, where package entry exports are exempt.
"stale-suppressions": "off"
- }
+ },
+
+ "overrides": [
+ {
+ "files": ["src/index.ts"],
+ "rules": { "unused-types": "off" }
+ }
+ ]
}
diff --git a/.github/actions/setup-repository/action.yml b/.github/actions/setup-repository/action.yml
index be46bee..a8a6024 100644
--- a/.github/actions/setup-repository/action.yml
+++ b/.github/actions/setup-repository/action.yml
@@ -1,12 +1,6 @@
name: Set up repository
description: Install the pinned package manager, Vite+, and workspace dependencies.
-inputs:
- cache:
- description: Whether setup-vp should restore and save its dependency cache.
- required: false
- default: 'true'
-
runs:
using: composite
steps:
@@ -17,6 +11,6 @@ runs:
uses: voidzero-dev/setup-vp@1b32467adbe183473499fd9d5d372c3ed9641754 # v1.18.0
with:
node-version-file: .node-version
- cache: ${{ inputs.cache }}
+ cache: true
run-install: |
args: ['--frozen-lockfile']
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 0dd8acd..4f99167 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -2,9 +2,6 @@ name: CI
on:
pull_request:
- push:
- branches:
- - main
schedule:
- cron: '17 4 1 * *'
workflow_call:
@@ -29,6 +26,7 @@ jobs:
name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
+ fetch-depth: 0
persist-credentials: false
- &setup_repository
@@ -38,49 +36,31 @@ jobs:
- name: Verify formatting
run: vp run format
- - name: Construct package prerequisite
- run: vp run pack
-
- - name: Run type-aware linting
- run: vp run lint
-
- - name: Run TypeScript checking
+ - name: Check shipped skills
+ env:
+ INTENT_REVIEW_BASE: ${{ github.event.pull_request.base.sha }}
+ run: |
+ vp run skills-check
+ if [ -n "$INTENT_REVIEW_BASE" ]; then
+ vp exec intent maintainer check --base "$INTENT_REVIEW_BASE" --github-summary
+ else
+ vp exec intent maintainer check --github-summary
+ fi
+
+ - name: Run type-aware linting and TypeScript checking
run: vp run typecheck
+ - name: Check public API compiler fixtures
+ run: vp run api-types
+
- name: Run Effect diagnostics
run: vp run effect-check
- - name: Run Vitest
- run: vp run test
-
- name: Run Fallow audits
run: vp run fallow
- package-contract:
- name: Package contract
- needs: source-quality
- runs-on: ubuntu-latest
- timeout-minutes: 20
-
- steps:
- - *checkout
- - *setup_repository
-
- - name: Construct and inspect package
- run: vp run pack
-
- - name: Verify packed consumers and type scale
- run: vp run packed-package
-
- - name: Preserve verified package artifact
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
- with:
- name: package-${{ github.sha }}
- path: .artifacts/*.tgz
- if-no-files-found: error
- include-hidden-files: true
- compression-level: 0
- retention-days: 7
+ - name: Run Vitest
+ run: vp run test
example-builds:
name: Example builds
@@ -98,6 +78,18 @@ jobs:
- name: Build TanStack Start application
run: vp run tanstack-start-build
+ - name: Preserve application builds
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: application-builds
+ path: |
+ dist
+ examples/vite-react/dist
+ examples/tanstack-start/dist
+ if-no-files-found: error
+ include-hidden-files: true
+ retention-days: 7
+
documentation:
name: Documentation
needs: source-quality
@@ -114,11 +106,20 @@ jobs:
- name: Build documentation
run: vp run docs-build
+ - name: Preserve documentation build
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: documentation-build
+ path: apps/docs/dist
+ if-no-files-found: error
+ include-hidden-files: true
+ retention-days: 7
+
browser:
name: Playwright (${{ matrix.browser }})
needs:
- - package-contract
- example-builds
+ - documentation
runs-on: ubuntu-latest
timeout-minutes: 20
@@ -134,14 +135,25 @@ jobs:
- *checkout
- *setup_repository
+ - name: Restore application builds
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: application-builds
+
+ - name: Restore documentation build
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: documentation-build
+ path: apps/docs/dist
+
- name: Install ${{ matrix.browser }}
run: vp exec playwright install --with-deps ${{ matrix.browser }}
- name: Check documentation in ${{ matrix.browser }}
- run: vp run docs-e2e --project=${{ matrix.browser }}
+ run: vp run --ignore-depends-on docs-e2e --project=${{ matrix.browser }}
- name: Run ${{ matrix.browser }} acceptance tests
- run: vp run e2e:${{ matrix.browser }}
+ run: vp run --ignore-depends-on e2e:${{ matrix.browser }}
- name: Preserve Playwright failure diagnostics
if: failure()
diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml
index 28eaffa..d15d979 100644
--- a/.github/workflows/deploy-docs.yml
+++ b/.github/workflows/deploy-docs.yml
@@ -2,6 +2,12 @@ name: Deploy documentation
on:
workflow_call:
+ inputs:
+ build-artifact:
+ description: Validated documentation artifact from this workflow run.
+ required: false
+ type: string
+ default: ''
workflow_dispatch:
permissions:
@@ -20,23 +26,32 @@ jobs:
timeout-minutes: 15
steps:
+ - name: Restore validated documentation
+ if: inputs.build-artifact != ''
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: ${{ inputs.build-artifact }}
+ path: apps/docs/dist
+
- name: Check out repository
+ if: inputs.build-artifact == ''
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
persist-credentials: false
- name: Set up repository
+ if: inputs.build-artifact == ''
uses: ./.github/actions/setup-repository
- - name: Check documentation
- run: vp run docs-check
+ - name: Build documentation
+ if: inputs.build-artifact == ''
+ run: vp run docs-build
- - name: Build and upload documentation
- uses: withastro/action@e84f40bd8d2caa9e768ec82ad30dd81f0b280853 # v6
+ - name: Upload documentation
+ uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5
with:
- package-manager: pnpm@12.8.2
- path: ./apps/docs
+ path: apps/docs/dist
deploy:
name: Deploy documentation
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 361580b..9481e94 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,15 +1,6 @@
name: Release
on:
- pull_request:
- paths:
- - .changeset/**
- - .github/workflows/release.yml
- - package.json
- - pnpm-lock.yaml
- - pnpm-workspace.yaml
- - scripts/verify-packed-consumer.mts
- - vite.config.ts
push:
branches:
- main
@@ -22,6 +13,12 @@ concurrency:
cancel-in-progress: false
jobs:
+ validation:
+ name: Repository validation
+ permissions:
+ contents: read
+ uses: ./.github/workflows/ci.yml
+
select-mode:
name: Select release mode
runs-on: ubuntu-latest
@@ -42,8 +39,6 @@ jobs:
- &setup_repository
name: Set up repository
uses: ./.github/actions/setup-repository
- with:
- cache: false
- name: Select Changesets mode
id: changesets
@@ -55,7 +50,7 @@ jobs:
run: |
version="$(node --print "require('./package.json').version")"
if [[ "$version" == "0.0.0" ]]; then
- echo '::error::Refusing to publish the placeholder 0.0.0 version. Add and merge a real release Changeset first.'
+ echo '::error::Refusing to publish the placeholder 0.0.0 version. Prepare a real package version before publishing.'
exit 1
fi
@@ -64,7 +59,7 @@ jobs:
if: needs.select-mode.outputs.mode == 'version' && github.event_name == 'push'
needs:
- select-mode
- - quality-and-pack
+ - validation
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
@@ -84,10 +79,12 @@ jobs:
quality-and-pack:
name: Validate and pack release artifact
- if: needs.select-mode.outputs.mode != 'none' || github.event_name != 'push'
- needs: select-mode
+ if: needs.select-mode.outputs.mode == 'publish'
+ needs:
+ - select-mode
+ - validation
runs-on: ubuntu-latest
- timeout-minutes: 40
+ timeout-minutes: 15
permissions:
contents: read
outputs:
@@ -98,48 +95,16 @@ jobs:
- *setup_repository
- name: Construct package for release packing
- if: needs.select-mode.outputs.mode == 'publish' || github.event_name != 'push'
run: vp run pack
- name: Pack release artifact
- if: needs.select-mode.outputs.mode == 'publish' || github.event_name != 'push'
id: pack
uses: changesets/action/pack@8488615a623b1b9c987934bb89eae8af6a946ac1 # v2.1.1
with:
publish-plan-artifact-id: ${{ needs.select-mode.outputs.publish-plan-artifact-id }}
- - name: Download the release artifact for verification
- if: needs.select-mode.outputs.mode == 'publish' || github.event_name != 'push'
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
- with:
- artifact-ids: ${{ steps.pack.outputs.pack-dir-artifact-id }}
- path: .artifacts/release
-
- - name: Select the release archive
- if: needs.select-mode.outputs.mode == 'publish' || github.event_name != 'push'
- shell: bash
- run: |
- mapfile -t archives < <(find .artifacts/release/packages -type f -name '*.tgz' -print)
- if [[ "${#archives[@]}" -ne 1 ]]; then
- echo "::error::Expected one release archive, found ${#archives[@]}."
- exit 1
- fi
- echo "EFFECT_API_QUERY_TARBALL=${archives[0]}" >> "$GITHUB_ENV"
-
- - name: Install browser engines and system dependencies
- if: github.event_name == 'push'
- run: vp exec playwright install --with-deps chromium firefox webkit
-
- - name: Run complete repository validation
- if: github.event_name == 'push'
- run: vp run validate
-
- - name: Verify dry-run artifact
- if: github.event_name != 'push'
- run: vp run verify-packed-package
-
publish:
- name: Publish verified artifact
+ name: Publish release artifact
if: needs.select-mode.outputs.mode == 'publish' && github.event_name == 'push'
needs:
- select-mode
@@ -155,7 +120,7 @@ jobs:
- *checkout
- *setup_repository
- - name: Publish verified artifact to npm
+ - name: Publish release artifact to npm
uses: changesets/action/publish@8488615a623b1b9c987934bb89eae8af6a946ac1 # v2.1.1
with:
create-github-releases: false
@@ -173,3 +138,5 @@ jobs:
id-token: write
pages: write
uses: ./.github/workflows/deploy-docs.yml
+ with:
+ build-artifact: documentation-build
diff --git a/.intent/review-state.json b/.intent/review-state.json
new file mode 100644
index 0000000..dd04c9f
--- /dev/null
+++ b/.intent/review-state.json
@@ -0,0 +1,1608 @@
+{
+ "schemaVersion": 1,
+ "baseline": "5b91ddb1de13970365669c887b9d767ea417fbd4",
+ "items": {
+ "skill:skills/effect-api-query/SKILL.md": {
+ "fingerprint": "aa5a86ba2ce9edcfaf62e73f06f34b3e6b6504b709153f5c4961c8c085532b90",
+ "snapshot": {
+ "GLOSSARY.md": "ad19a69727108dd047208b6e76e05f5b1d241620ed75cb241a62fb4c068dc792",
+ "README.md": "fd60880b03b69efdd8300aeee473fdf1a5b2894e5f3f1d4a701525a0ac2fa967",
+ "apps/docs/src/content/docs/concepts/client-lifecycle.md": "fcbaca84f266060b946eed9cbf9d0b9815352b7b1d6ddaff5803b29484345380",
+ "apps/docs/src/content/docs/concepts/data-normalization.md": "f1505ec3eb35a33fac289706c2cc318a2ffb80555e3302ca102e67e21c9012da",
+ "apps/docs/src/content/docs/concepts/http-utility-tree.md": "ed03938167f31822b76efbeac381fd3f8d297061fe567928ee022f8dbfadb9b4",
+ "apps/docs/src/content/docs/concepts/queries-and-mutations.md": "204141ba9e3b52e8e0b2d994ef4381cfcecf898d0bd011866f8cbfc8e89cb15c",
+ "apps/docs/src/content/docs/concepts/rpc-utility-tree.md": "fd5fcc232279e9577b8b2faf321a85e9a340e6090ea5887bbab208cca2d24a4e",
+ "apps/docs/src/content/docs/concepts/semantic-keys.md": "4fcc7437b4c0698f590926545e41b68eed1094027fb18a8834fb695db63262c6",
+ "apps/docs/src/content/docs/examples.md": "4035adf9d277a7a3d75b22be8147ee6acb3329e6e96ca7c76b9d4fc052758239",
+ "apps/docs/src/content/docs/examples/cancellable-commands.md": "c175cbd7f15b2322b3039a95aba937a440ae4198794195b6db7419b2a3acb245",
+ "apps/docs/src/content/docs/getting-started/compatibility-and-stability.md": "74f9d59c908fe6ab70ccfb8940c1f976e060b38a05cc6bbe75f72403d3b3ed7b",
+ "apps/docs/src/content/docs/getting-started/feature-support.md": "5a6b57b8e539937b203da9bb571d31da2169a014f6f0ee6d0625627a8b0f7525",
+ "apps/docs/src/content/docs/getting-started/http-quick-start.md": "9ac402d68c35a3e8e4d3139ab0424a55395eecd671dd25ba2e942b311230a6ff",
+ "apps/docs/src/content/docs/getting-started/installation.md": "fde89cc5c10d005672db696bdc8016deb42d86977fca1b89cfe6315c760bf2d3",
+ "apps/docs/src/content/docs/getting-started/quick-start.md": "34846f39ac2bc6275920d09f04f1141c2ef8d93688f2d83faaa6e29b3d7ac91a",
+ "apps/docs/src/content/docs/guides/angular-query.md": "82b6cc47488db0b166b0f79597526e26274823b48377482fb52949a00c5a9515",
+ "apps/docs/src/content/docs/guides/cache-filters.md": "ac56ebb6d8949bec515be80850a5386d79eb9dc38533286ad3fa638f82654418",
+ "apps/docs/src/content/docs/guides/cache-management.md": null,
+ "apps/docs/src/content/docs/guides/cancellation.md": "8566563c90d913c4db16435d314eba1ec53d6873b30aa5652097d0994c50cc4c",
+ "apps/docs/src/content/docs/guides/choose-stream-history.md": "6996df3a8b18c4fadbcc76a3635a8a5408f155b4068509d4801b38afa7f22f16",
+ "apps/docs/src/content/docs/guides/conditional-queries.md": "7cc52d18217653c63699e78ecce3efb78c484e57ba75a92071df5d16b9a40ac8",
+ "apps/docs/src/content/docs/guides/custom-key-encoders.md": "e48f1768db1c9e8ab3d5915593dc6de9089c35c039fb16e7ca04a4326a4df8bf",
+ "apps/docs/src/content/docs/guides/handle-failures.md": "7bf37fc98c4a4eab109ead80d24febe4dda968267f07e7f3d665297c746a9c2b",
+ "apps/docs/src/content/docs/guides/http-metadata.md": "b0b45e8c3af5ada0d64cf61bd5bca161186a604c30d3e9fc63ba9090c590e542",
+ "apps/docs/src/content/docs/guides/http-queries-and-mutations.md": "23edf1a1c71a29561d9c87cc7fca1f7c8ed370d6e62be5719dcf54d533c420b9",
+ "apps/docs/src/content/docs/guides/hydrate-query-views.md": "d71f573e4c6e6815e51f7a63080b773655f90cf9ef07155d293f1550eac091d4",
+ "apps/docs/src/content/docs/guides/hydrate-unary-data.md": "0cf27b204e709f8a753fd61fd1510073404611e53a9fd6e82e8122af7e68f2fa",
+ "apps/docs/src/content/docs/guides/mutations.md": "773d6720894a83083bcd54adb55b632a9902894165a7c147c1266620774d8f21",
+ "apps/docs/src/content/docs/guides/optimistic-writes.md": "8d5001c0c1caa2f4cc25ce10955791eaef2f032327fc9c8a743173ffd60b68b5",
+ "apps/docs/src/content/docs/guides/pagination.md": "95a82e2cc2a972080152ac0816e06262ad63c7c0a7f9c8a60b3f836a42120a1a",
+ "apps/docs/src/content/docs/guides/queries.md": "6fb845e9d9d86a94b4df323583c9f721c171d135e2cb64f184f8a6fea22350e7",
+ "apps/docs/src/content/docs/guides/query-defaults.md": "74b7f9cd1c29b6bfa3777e8b48cc3dc6319856b48029d052adb4de34a9f5ddaf",
+ "apps/docs/src/content/docs/guides/react-query.md": "d17a75453131d062ea1ca25cdeea9d9d975503d1bfb0be74c90c13ff0708590f",
+ "apps/docs/src/content/docs/guides/refresh-from-events.md": "a8e680ae9060a573336829b94dbf77dd32385671d48cd4aa0f092a1374444cd6",
+ "apps/docs/src/content/docs/guides/retry-queries.md": "4326d4e0cec0ca0067182020f68e4db0f634ecefedcc5cadd0db3e90e3709684",
+ "apps/docs/src/content/docs/guides/solid-query.md": "6ce866f49974edc7f5db579d08134734544de1137d5a9e5efdf49bc62d12b7f2",
+ "apps/docs/src/content/docs/guides/stream-snapshots.md": "91e22e85c11d8822e25e5abb7b872b78f07af79fdb16eb2690baf8226fdbd9f7",
+ "apps/docs/src/content/docs/guides/streaming.md": "2d43cc0ac6f007f31aabfe01200d895827cb14ec1166324eb9661d146cda240a",
+ "apps/docs/src/content/docs/guides/suspense-and-recovery.md": "a5f92087e5006d2162ab623cdc39d98a41e13b5967e7483e3db7fa46e436e730",
+ "apps/docs/src/content/docs/guides/svelte-query.md": "967257cd51f59723bd641c8553a4e50b931258e79f24d60f47fdfb3035ffe6a8",
+ "apps/docs/src/content/docs/guides/switch-cache-owners.md": "cc209f13becec305af60c9f04fe29f85a2ca6db3bc11601cf09083bc2583d198",
+ "apps/docs/src/content/docs/guides/tanstack-start.md": "7ec04e78ab8798f8cd89839f2a07b466f0c9834557126799373940b161a95b0b",
+ "apps/docs/src/content/docs/guides/trace-streams.md": "3e6bcd468881b23957b01e8222b2fd2d36b4de0e79141819234c54795b26f03a",
+ "apps/docs/src/content/docs/guides/vue-query.md": "bd8b50c940d0493780a60ae0cd80fc2843b2ebb22c2d3c9bc70653e0379d4155",
+ "apps/docs/src/content/docs/guides/websocket-clients.md": "1cd31655e433ced7b24795255cb03280b27734eda58afeb9730a42bfad433c43",
+ "apps/docs/src/content/docs/index.mdx": "b5bcd9d26ee0b8ea181b0c063afbae9ee057e31db9a2b3252c13589b5847339a",
+ "apps/docs/src/content/docs/integrations/index.md": "7ee02cd3d7d1d212ac0e539dc6dde5bf928d906797abcac34da1e7ec1352785a",
+ "apps/docs/src/content/docs/reference/browser-and-worker-hosts.md": "70743a4429a39937515c8d5fee79ca75714a92dd526f1093f9fa8ea12fbde984",
+ "apps/docs/src/content/docs/reference/compatibility-and-limits.md": "4f60753887b52c33a47b993f0aaaf75832edaeb09d082f2664e2e5e512e568a3",
+ "apps/docs/src/content/docs/reference/errors.md": "57b90eca4db33880af66063e8211b4a39d0850af811beafc8711bb01860063d5",
+ "apps/docs/src/content/docs/reference/external-http-clients.md": "9bfef63f64b378847d99092f088492f989ba0577810e6aa07bb194d55ca5fcbb",
+ "apps/docs/src/content/docs/reference/factory.md": "fb8e57908ccb82d57b3b29664034b3a210945b9bd39e030cd9613015ea3b0c37",
+ "apps/docs/src/content/docs/reference/generated-builders.md": "0c0406824a2f906ec4d5601ab068d6c1d2b35ce8b9602618f992eff7de8824f2",
+ "apps/docs/src/content/docs/reference/http-builders.md": "153a63a31bdfaa8411a4af067d555e7fe1af037c9d2f798a7f7a21b4e4be0a86",
+ "apps/docs/src/content/docs/reference/http-factory.md": "d40fd0597a9d784e21bf7f80ec9cf56008511f472625e572ffded61db0972f68",
+ "apps/docs/src/content/docs/reference/performance.md": "2f68c31cae28de0a84b1ce77f065481d37899171b78d9593ff65e017ff75d97a",
+ "apps/docs/src/content/docs/reference/public-exports.md": "9550217e7724f7d15542ff83e0a268bfe7274f7af5a4c3440ef0ee418607a6d9",
+ "apps/docs/src/content/docs/reference/type-inference.md": "1edcf7de07709644784a1f7dcc5462f0eb1e01e168f30ba9b1db102ebd424fd6",
+ "docs/adr/0001-target-effect-4-release-candidate.md": "44119ba9104f767c5804c5026c4a21a78a8367f6d9ff5a9035bb3f423969fbb3",
+ "docs/adr/0002-let-call-sites-choose-query-or-mutation.md": "4244d48ff136eea562aa2f94a0b6b1ab58412796f3ece47a3cf5b43f746e11f5",
+ "docs/adr/0003-project-dotted-rpc-tags-into-utility-paths.md": "a99856e94af4004484fed939d46ae4388363031cf396b07f04a92a7119fec2fe",
+ "docs/adr/0004-build-core-shaped-options-and-certify-react-first.md": "0e47069738c3792430c92b396068ac269139356c83738453889517d97e22f190",
+ "docs/adr/0005-preserve-the-cause-in-one-error-wrapper.md": "1e04885542f22f166b5daa913ae2dae121c407baa775a2c4a16590f96857e3fe",
+ "docs/adr/0006-use-canonical-semantic-json-for-payload-keys.md": "694d8665938af25abb91ada71ea9c95cb77dd4ea90019adb2f642e16a88948c7",
+ "docs/adr/0007-keep-the-core-factory-lifecycle-neutral.md": "a83dc0d6061ac0328a3ee6075aa872a55feb4f0154edf6dae964e74276bb15b5",
+ "docs/adr/0008-use-flat-prefix-matchable-key-tuples.md": "7fb791e73e0266afd8583e45059aebcc10bbd9704d625bdefcafec1481a46cf6",
+ "docs/adr/0009-build-an-eager-frozen-utility-tree.md": "bc3b08a3385f1dc8874d81f867f15ef6c30b203c94936fd991d2941fd5bacc27",
+ "docs/adr/0010-reuse-tanstack-query-core-as-a-peer.md": "633a1ce44c8d58b29096f540871b61566352462e1d4bd5335162b3e08652527d",
+ "docs/adr/0012-normalize-undefined-query-success-to-null.md": "5d076f168223f67a205138d3e258f1f3aac9dfe5d607ffe8efd12a71322ef022",
+ "docs/adr/0014-require-query-stable-payload-construction.md": "2f4381fb3e7406304ff3b914db541419f799f8a71d1d527b37a9e971e9949e47",
+ "docs/adr/0015-centralize-the-toolchain-in-vite-plus.md": "d2001383bc0f92363289c04b6b8df26acb5b0f5dfc0163b2a838f2eee8057b75",
+ "docs/adr/0020-generate-accumulated-and-live-stream-queries.md": "5e4f5c92e08ffb769137e930908dded993f928a497b018f9c6e4fd4f12232727",
+ "docs/adr/0021-share-utility-construction-through-private-modules.md": "821720a3eee166d4b7d42b6f5c3906bb29dff339b4815e9ed1c516bc5af66fd4",
+ "docs/adr/0022-add-buffered-http-utilities-with-separate-key-roots.md": "f1fb5d91cd91a70b356bc98b84176920ec822315dbdeaf5e247921853598b62f",
+ "docs/adr/0023-expose-buffered-multipart-http-mutations.md": "b72f20cb513d2a7db94b2dbe27576352048ba22288ad6eac6e80d1a7c81cefb8",
+ "docs/adr/0024-project-http-streams-and-buffered-metadata.md": "2797a5a4a751c5e37c38aa454c14b99ce1615870ffa13cfcedb98cca8a0af633",
+ "docs/adr/0025-use-public-decoded-message-clients-for-server-local-rpc.md": "36df8e1227af22018d5a9063699986ceb8dcfd4c8bb5615aa62557f2ec36e111",
+ "docs/adr/0026-keep-rpc-transport-aggregation-in-the-application.md": "b73af29d8f73a36f61f110ad8778e045d37253fe42a8888883e78089b93e955e",
+ "examples/server/src/commands.ts": "58f415fe0ab9bb0127c96c11ef0540a29b97d231eebd3a487513f0820a46b3d5",
+ "examples/server/src/diagnostic-operations.ts": "ddf8a0f2367b91ca08d6aaaf58380a51b77a5c51a9a85412bd7e7080ff0453ee",
+ "examples/server/src/domain.ts": "c00fced49e54d7bfff9045479e91aabdbd7c0868cc89afe00bae5473b17d2f82",
+ "examples/server/src/http-handlers.ts": "601f37c428015e75e94cb282af356878aa49c887804cc29e2b4f0c1a47ca92f0",
+ "examples/server/src/index.ts": "9e121809a5493c649e61e76fefec52a8c79a394983368060a95dc7000dcedc9a",
+ "examples/server/src/main.ts": "de9520cc16e4bff9d02b8507ee70641936b1287959823429f7759c0f05fdc0a7",
+ "examples/server/src/rpc-handlers.ts": "c2c57eb9a2ca5e602fff9f798c4d5165e91216c5b7e64e0a71220c4ba9316f3d",
+ "examples/server/src/server-local-rpc.ts": "de2a05bba54042f1d2d5781023cb5d20eb63915dd2a52635e9debf83911b5421",
+ "examples/server/src/server.ts": "5c9bbd7131ba3c55bbd61255fa8da8a275fc97412e1c8cb54f063bde517991e9",
+ "examples/server/src/users.ts": "15c363e2162f8dab4da1bfcf6324abbb3dc8ca34a8d8e036eb4db2481fe6be5b",
+ "examples/server/src/web-handler.ts": "2de54d8d2264024887ca63c8c53b20e9f9260ca6605b791d1f91bcea8c8d1b07",
+ "examples/server/tests/fixtures/websocket-server.ts": "b59863766bb60e5fb4de040d7d97ae2e67bca2ec44810ddc577f4cf5cb03129f",
+ "examples/server/tests/http-api.test.ts": "6ad2951b74c45a73ea4980e5da65c7ed4f758ff43db34702f1224de934548bca",
+ "examples/server/tests/rpc-transport-overhead.test.ts": "8d3dd40cfbbd0ce64b74f44f205f7f83163ea08dfc264a6deb1902e96b74a7fb",
+ "examples/server/tests/rpc-websocket-consumer.test.ts": "16253ef720e8a85cb7c583bcf6f9883c5893423d6da952659731e5823fcf0a62",
+ "examples/server/tests/server.test.ts": "44530f1e8b9b67f4d4bd8486c7bd7790240128fb161c1244857eee15c87a068d",
+ "examples/server/tests/web-handler.test.ts": "94d1b28810d908dcec8ca8299e56bb520f93804e8761b4d5e9c828087efae646",
+ "examples/shared/error-description.ts": "374a804cd0daf1dcfdff8b7247194d278cc52fdf3bd0d9b5d2891124b439cf87",
+ "examples/shared/use-slow-query-cancellation.ts": "f6221dc3a725c2f3cb15f41167ab98f8f579f3a0c138cb66cdf3c368b93b996a",
+ "examples/tanstack-start/src/components/effect-error-details.tsx": "a84187a90ebe207f9b8427f43dda44c81f6564821510c8c848ceca0f7d6940af",
+ "examples/tanstack-start/src/lib/api-server.ts": "b678d6edab872786fb92db328f60095d604c8d2f5205c4d4a462c3405a782bad",
+ "examples/tanstack-start/src/lib/application.ts": "7417de76eaf8a1a1cbd8464af6508bc3244a0176941c742e829880670a54ee8a",
+ "examples/tanstack-start/src/lib/query-ssr.ts": "0754abae5faf2f7562e1d86d27df0e14820a5ba9830146690ff1dc9f5beb3ec9",
+ "examples/tanstack-start/src/lib/server-application.ts": "442278fc08c4beb9a69cf1ab7672f661385d9c49998db77ce2870d349ffdc8a1",
+ "examples/tanstack-start/src/lib/server-host.ts": "1682ee37ea7551ec52c9530d6a4b476b967fa0572f5ddc26351ad427ce854e37",
+ "examples/tanstack-start/src/lib/snapshot-preparation.ts": "4321b25d469a6955659e6c7949b22ed78368873af81dd11718f53e02d1a81a2b",
+ "examples/tanstack-start/src/router.tsx": "801aac19cff9a4e2a4acb0823a9ea5c28b4aea9245f7e26cb63548bb5234bd15",
+ "examples/tanstack-start/tests/application.test.ts": "0ce067b4179b050b9daac397128fcd00e8f6d63416e43766ca1e442041f06301",
+ "examples/tanstack-start/tests/async-hydration.test.ts": "1f983917d2a469b83b876e882ad6a2ece4d28d360338ed614232807a168a1620",
+ "examples/tanstack-start/tests/client-navigation.test.tsx": "62af6b9c4ad00e2bd772a0eb75d175e11329079bc787874b0d87e7f22030620e",
+ "examples/tanstack-start/tests/failure-dehydration.test.ts": "b9d135c54e8e70ff454903f8016e6560fabaa487095cb40cb8725ed73577f079",
+ "examples/tanstack-start/tests/server-local.test.ts": "2facfdbf572cf8ed1cf5f6104a503504ab0e979546aca3e28d9dbc853c64c6e5",
+ "examples/tanstack-start/tests/server-render.test.tsx": "77b82127f9e3ddea55b201f7b2080f930ef340269010502f1515f6691ecc4ab2",
+ "examples/vite-react/src/app.tsx": "691f77aee6fb9f2b1f6f9df40a3afcf78f4af2d043d7b379f38c75c647a5f91e",
+ "examples/vite-react/src/components/ui/effect-error-details.tsx": "26a1a4bdb5a6331dca09c3c7764b2ff55431aa18ad6768f82529f8563dc3801a",
+ "examples/vite-react/src/lib/application.ts": "01f8f4f611435708e68d358993971aa9cadb01a2167fdc350a284d7f1ceeb752",
+ "examples/vite-react/src/lib/owner-cache.ts": "3286d0df63d4036c16c572ffd5e113400b455a5ce9f55dfe7859e72b8ae218bb",
+ "examples/vite-react/src/lib/user-writes.ts": "55f2de2f7be68f477665af3f59c93f37994045023014274513404418e0d1b8e8",
+ "examples/vite-react/src/main.tsx": "cdee6ca4095b58e1750015db473bda8651702a8ab32c408fa77961873db0e6fe",
+ "examples/vite-react/tests/app.test.tsx": "ff86b42023eb40658dd6feccbfd1f236a75bf2831f40b02955ebc1306be6329c",
+ "examples/vite-react/tests/commands-ui.test.tsx": "70005a656b9356fce97924dff6d4be82d87893cf48a619c119ad4372843246f8",
+ "examples/vite-react/tests/commands.test.ts": "3e24222572c0f7a4b68cfc4069c545cbebf410cacd0063a328cead9ad5baab08",
+ "examples/vite-react/tests/minimal-setup.test.tsx": "632d9a99695206f7aaddd139b7a2cc5e0d8a79fd991b9a1ccae0118a45460e4f",
+ "examples/vite-react/tests/owner-boundary.test.tsx": "d4ce58a002aac2b8f752936a65495558f89bff145d5cf2556f5c0d9286f8d6b3",
+ "examples/vite-react/tests/owner-cache.test.ts": "8818e30fdd3071a2e5dc2d865161e0d9f40de1ff37813b0a396bb2e83dd08a1d",
+ "examples/vite-react/tests/owner-switch.test.ts": "c997c9758269586591cbf55de4651c64091abc9061b56edb024dcbf9dbaa9c1d",
+ "examples/vite-react/tests/slow-query-cancellation.test.tsx": "d8c054206d3613939b71e390cb37002e7d6385628ca15bc20c4984f100cca779",
+ "examples/vite-react/tests/stream-tracing.test.ts": "0f09b669dc00a66e7db0d947f31daa88862e89cda9877d37caaa72631c1b247c",
+ "examples/vite-react/tests/suspense-recovery.test.tsx": "884e694a2a3ecc0cdd12d3555c953c30c6c7778bc613a78752b2ca27c17c173d",
+ "examples/vite-react/tests/user-writes.test.ts": "3fe07c1fa8deab8c154d30481f7bc6ef77d3a8ed6c3d5e0d3cbfe75574061e33",
+ "package.json": "dc41aa3f5b1633ffb2e6f6a0b7efb4e0119d74b9bc8c0003b1a8ee5fad854782",
+ "pnpm-workspace.yaml": "1e73526ddc3448a43e8cfc77e98bad98d15d0617dc2e8caf98e6d5d43fa90641",
+ "scripts/decode-utf8.mts": "2e90c53e95c22b864a209a87c98084db6ec95e83f842007b21528d286d45c18c",
+ "scripts/measure-construction.mts": "10522cb10ab51fd44d8990896a2a73e8bf4d4cd2646441e958b6180cb1afd147",
+ "scripts/verify-docs-examples.mts": "9ba75dd2952a8ee92995904ce9891b6757b10637a298646b95f9af73d270caf8",
+ "scripts/verify-packed-consumer.mts": null,
+ "skills/effect-api-query/SKILL.md": "41c0a5768977c0e25254f559de4454df7d9dc5fb6075487d65a6a52602b0e7d4",
+ "skills/effect-api-query/references/cache-workflows.md": "61d3d363b410eac3f52273e642ec2924d29e887f365a7c21a965a52deeded0be",
+ "skills/effect-api-query/references/frameworks-and-hosts.md": "e84b9179ca0cba6694200f504923906d78b3b7a305315f5d1453dace854aefb5",
+ "skills/effect-api-query/references/http.md": "4dd64a0fcc036f3ee857ae96d0e0149c729e0ea95dfd79a82a62c76db4619999",
+ "skills/effect-api-query/references/hydration-and-ssr.md": "1a6ba66187a1c786c09eb08dbd1c0f0e7c04e21d3b4787eb534687a67c1a38f0",
+ "skills/effect-api-query/references/query-patterns.md": "2b9ff5a7f9857d00dee85842351bc7ff8d3e88a016e1c0056c2ddb513cf53a64",
+ "skills/effect-api-query/references/rpc.md": "2d2d30f309424f255e3162fd52dbdaf6d3883e40d9eb6f1840eb814424b0abf3",
+ "src/core/inference.ts": "b8345c0961c67ceb41ee18e017302a5ef5d6be91794b861e72bece21ee5e9c30",
+ "src/core/operation.ts": "7dabe4d21070d20534643e5051060c84a09db5a7aa39858e75846043f8a537ea",
+ "src/core/policy.ts": "bebe7a32bb958ba9a1817c6fec6792fd04541f5ae81cd70fa422106ac3cb4073",
+ "src/core/schema-key.ts": "1f7d087793291b9763e82a0188367a9446f92b35bc25d73165b7e4f603e5ce05",
+ "src/core/stream-snapshot.ts": "00bf4855cc745571ce440a9afcf7a52134450de9ced00007e4cd2cdab8e544d1",
+ "src/core/streamed-query.ts": "0c29dd2bbf85ae2b4bda6ee65250f32ee17a5362e7a94f7423a0e457398ae9c4",
+ "src/core/types.ts": "c0904ecc411bd78cb82749f3461f67e78d05239e9e0802daf99f9cca5bf95a63",
+ "src/core/utility-tree.ts": "2a3996f5d49d70838e377af85b01acae43e4e964ae69e2150fad5b43a1069821",
+ "src/core/view-prefix.ts": "35a558e324547cb5a799114b937550704984ceae12c03205df5957adf55d988a",
+ "src/http/create-utils.ts": "785dd9171fd9c6ab7619a9e3728f91a3e9d197c311a3a6c8a6dffc74904a4975",
+ "src/http/errors.ts": "95869413973faefd2958f4e48feada7d5700e3aa0c2545f56a7202c8b9609a46",
+ "src/http/operation.ts": "c7a393845b6ba9d5382c7b697230463be4c78ae99525f923cca6f741ffaf6f3d",
+ "src/http/request.ts": "9d31397ee4241319ae56260c65e7fb4973adcee974b55e43e2895e7524d39180",
+ "src/http/streamed-query.ts": "bdac94b5d016578c249a46f4e1825424d5cf72acc85361e2fd00fda92e15ac5c",
+ "src/http/types.ts": "a638fe517865a1d341c2c974d4774f60cb7c10c0907287c9ec8a7d6f296def48",
+ "src/index.ts": "2dfdc1e9a5994ca3a6d918704ecd57442f4e34831b0cba2da68d4e7cc07810c1",
+ "src/rpc/create-utils.ts": "c0db42f6d9962b6c2e291f2b3d060be16ba7fc93826fa00471db5d82503e27dc",
+ "src/rpc/errors.ts": "7048a786a55f2cd221788485ffa993277f47896110ffac742f74ee077382377e",
+ "src/rpc/operation.ts": "e46cb103c4a79506cecb34c9337640ec9ab917a488e9360c7535d3dad733ebf5",
+ "src/rpc/streamed-query.ts": "bf480b78f9d0e37d7e7b572395f1238e6539d0ba8386b22eb5f8b3c400d1dd0f",
+ "src/rpc/types.ts": "90f4df74680db534f98c72f3bdcb5ae60fb720c45114dfb61a089dd62c1dc1be",
+ "tests/cache-recipes.test.ts": "5d86c8f74e952aa6f614d9ba32b4f2680137d23b696d8c55cd07d0463e5b65b7",
+ "tests/create-http-api-query-utils.test.ts": "c1307dbe52820f44526ec676f0b24e5a0e4635690b548185ceb819050b0e4605",
+ "tests/create-rpc-query-utils-configuration.test.ts": "0e53c59e24291e0424e860b9030c439105a1468e4ba37bf24bef81dd846112e2",
+ "tests/create-rpc-query-utils-execution.test.ts": "05a0de82218666f39cc6ac2d120f2b2e96885e9cfc9323e5ccc658ad996da2c5",
+ "tests/create-rpc-query-utils-keys.test.ts": "c6b6918e08c10f097634179e65d0e8eb481ff6833561b04de8e6a093104fee31",
+ "tests/create-rpc-query-utils-request-options.test.ts": "bcd76859a2830e522bdeb212be70f2e14be3b815da75a5caf3e596fd5fbd13e7",
+ "tests/create-rpc-query-utils-server-local.test.ts": "45ee329a736bcb6b114727ef8874f3f34541ce6dc55d5e13ffc80be9c2af2ddd",
+ "tests/create-rpc-query-utils-stream-baseline.test.ts": "282b7f1e8014159972275599a5c9d60bc689e5c9dd619a4a879cef4afe0edfb0",
+ "tests/create-rpc-query-utils-stream-cache.test.ts": "b97fd6eb63c0e8c023f98a1420555288c3dd2f4ab500b0d3e0b1d3a5c41e1347",
+ "tests/create-rpc-query-utils-stream-hashing.test.ts": "025f15582fe2a667dc6383a406d5b42654ea7634acf3591803d9f379896a69bc",
+ "tests/create-rpc-query-utils-stream-publication.test.ts": "cc3a25d02015b1410a8d1406249a846bf711f7b829fa7fccce1da90e600530d3",
+ "tests/create-rpc-query-utils-streaming.test.ts": "f52f775426bb949910a976150f3650b1dfe7526bcb0bd41ed874f399ec8aef44",
+ "tests/create-rpc-query-utils.test.ts": "035816f190df16fe51539857479a0d8cb9c75b1eb6897110aa07ba6ada33c977",
+ "tests/fixtures/async.ts": "61c314b76032dc197a7568b0602740d06eee0462414516788c699f1a7263114a",
+ "tests/fixtures/docs-websocket-use.ts": "6e2aa0bb7b1a653ffc215bad7a39b9a79aa1a9b3707bb32b1e80f4636faac544",
+ "tests/fixtures/effect-rpc.ts": "8a92d7b5e815012f830b7e87a8492b2680d8a1b8fa866c3db25274458d432745",
+ "tests/fixtures/http-client.ts": "184cef6b4864d32f1225149161e12d4286517a34c74eb0ba0a2437ff5f333891",
+ "tests/fixtures/optimistic-users.ts": "163e6880b076673c7a6c643e95737869cc5415446ba5042b10d3371afd401305",
+ "tests/fixtures/query-cache.ts": "ee6509aac5d0cf4f781652da10c2b1c3501a222ddd9a6b05f447e6a226548071",
+ "tests/fixtures/rpc-transport-queries.ts": "46be1d1e6048d57d83e9ae64b00c8c0c11deec6a67d0d4b115cdc9aac7447158",
+ "tests/fixtures/socket-client.ts": "d2d0a4a31011e2cfeec0e7e7ca996ad752a3a51db5675ac5efce54d284c8db89",
+ "tests/fixtures/user-events.ts": "13d8167b811bec6319de96f7cb50410f586c18cc92677d7fd17488b16d15b329",
+ "tests/fixtures/websocket-checks.ts": "7b8035264ece4e501e829b3e2b755f9d7b17c010ffa1036db6338a368ff6f93c",
+ "tests/http-cached-views.test.ts": "ff5fc7de21d00058fe067bf0655e9e6509bc3d04f26730a89c26c84fd3b477e9",
+ "tests/http-execution.test.ts": "241beae3806d2041c7c8cdd0ae5d4bf5277163e8e4690c1cbe589318db6a7776",
+ "tests/http-hydration.test.ts": "cead9c149e9aecbba7121b4e6bcfa3450368d24e6320ba1b8825545db747b98d",
+ "tests/http-live-query.test.ts": "79df219cb204669520c584123f167479ea3fa514d899897bf2810a04e8e1ca65",
+ "tests/http-multipart.test.ts": "cfda4574a8b10bfcf1b38c060f37d6791d83d94a01640edc8f85c468e45cb3c4",
+ "tests/http-query-options.test.ts": "e6abd4020fb4fd11877802c42d07ffb6f66822120d409c885150e97177769386",
+ "tests/http-semantic-keys.test.ts": "df50b9a0cf6981594100c93ca4283eb8ca11e7aca4db8719b4d7bd9a4333cd16",
+ "tests/http-transport-cancellation.test.ts": "e56f8571f949adc9d44f14b61e20edddb188a9565bf7a585859ffe73a851ac39",
+ "tests/query-policy.test.ts": "6ae9b22f6b171414387a5a9639ca3716ce2d065f3530122c320cebf1bc25066e",
+ "tests/query-view-prefix.test.ts": "162de0fa5f68b1f778f8c0c7201a15dcdd78dce4f107fcd64c1e1a50c733e6fe",
+ "tests/stream-snapshot.test.ts": "86449ef5d0f1baf165a5c973fcd0a190b9fce8ae5b6e8732a4454ab0c9f6c132",
+ "tests/types/docs-functionality.ts": "d638721f8a5f291e30b97229933bbb48dc5a92f677897e330bd1959b35deb8ae",
+ "tests/types/docs-http-quick-start.ts": "5f7eef98be244ea392fc2c5b527858f159a08efebf6f2665725301aa8a910050",
+ "tests/types/docs-hydration-async.ts": "de67135bf3da0dffdac47e9f2e49469edddac3d7d026fbd93d39aea6964c0dd8",
+ "tests/types/docs-hydration-dto.ts": "ebcd5c3895e8fa40bff3b62e8e13213e98a3e1c4796d89979b23ecc64cdc13ff",
+ "tests/types/docs-hydration-rich.ts": "56b35d7bb4a0f0ebc777161beb2e73a19dfc7de4db26fc74e3abab5d164f1402",
+ "tests/types/docs-hydration-views.ts": "08d75fe114e4a682fc0ad62b847898dba270672e0ce6d19a4f4d66cf92f75365",
+ "tests/types/docs-policies.ts": "b52d09f03131797873d73ac73d48639010136673b9ac98b866762099899e79a4",
+ "tests/types/docs-react-entry.ts": "cfe186d60a53553103ef292261b48b09b5094d927b1f198f2d3c8bd6f08325d1",
+ "tests/types/docs-react-setup.tsx": "bf0bfb164818366487ce2742699589c62fee4ec5bcb9e906f7d8c423251ecf65",
+ "tests/types/docs-readme-http.ts": "f15c8d87a1522328bbec1bc81d6e7573d406a88134f37e2dfab4c2e4dfe877d5",
+ "tests/types/docs-readme-rpc.ts": "e41aaf93b7fd61f619a2a3fb1132ffe5c027dfe17040b5ba061fa3591f31c69d",
+ "tests/types/docs-retry.ts": "78c782810b772e152ea0c47074fb2546fed5d397b93b147862644859fd20cc25",
+ "tests/types/docs-rpc-quick-start.ts": "95deee30de122cbaa7b9cb28257c234aa1162a0b549a87cf50a80bd84e871081",
+ "tests/types/docs-stream-snapshot.ts": "bc924cff90a9f9a8e416bf7fbdfedbd607c88e7a678435aaf20ef878862e06ff",
+ "tests/types/docs-stream-tracing.ts": "c839cd8a8d0875ddbe30e6234a0649c82d79f481084e718e5c341f7b4c427198",
+ "tests/types/docs-suspense.tsx": "2adc801083df580498a6cfa78fd6b970eae087c6e2af8601fcae111a53d13f4c",
+ "tests/types/docs-user-events.ts": "87647140d5434b95cc5389b1fea9919f20df7b6fcee4f00565836a4eae549a70",
+ "tests/types/example-owner-contract.ts": "fb10bd087ee582a64806d110404c366cb74e520b0b8cc11701348036b08b9622",
+ "tests/types/helper-contract.ts": "93f5d4276dca08c4848ffe7fccff893081767c4f51e11ec27588caade4999a53",
+ "tests/types/http-contract.ts": "9b6134849353f790a91cfebe955d660a65dc1927ffc00adf471afb7ae84b064d",
+ "tests/types/http-stream-contract.ts": "24031e37ac8cada4b8e9d3b2f4ce6e08448780571d94c8002bd8b267caa320bd",
+ "tests/types/http-type-scale.ts": "b456543b88316a2dd899f929efbffcf514e54e213e109b5f7d52eb785d2255aa",
+ "tests/types/http-view-proof.ts": "f42a1ebf36eeab7a906b722f5d2c2af0aabe8d30ef378fc50386c16d464fb64e",
+ "tests/types/public-contract.ts": "0726d33528f8f08bb907d9cd9c18f2d73d4e5b900c35080a8f176fe9f32b944b",
+ "tests/types/server-local-client-contract.ts": "443a60788ce7d91a77459c99f07d3fc9bf70d5a64a83c05ece5c40cfac63d298",
+ "tests/types/snapshot-contract.ts": "9e6a2edaddb7545f20d351511ed99be2828d4ca56779503bcc443963d8b73716",
+ "tests/types/tanstack-start-contract.ts": "51681e3d0d7504a614d490f18adb6f44db82d34b9d4d7cb9cf941aea33de284f",
+ "tests/types/type-scale.ts": "a9b307c25c72f3c184eabc8e22ddaeea96feb331c0f8d748773d765d358dbfca"
+ },
+ "head": "3e3fd371f097ad7a7f430b73f09c69ef711acff4",
+ "outcome": "no-change",
+ "reason": "The README consolidates existing RPC and HTTP setup into compact concrete examples without changing the supported API, ready-client ownership, runner requirements, cache identity or workflow. Existing shipped RPC/HTTP and framework references already cover these contracts; no guidance rewrite is warranted.",
+ "evidence": [
+ "Reviewed actual diff at HEAD 3e3fd371f097ad7a7f430b73f09c69ef711acff4: README.md, scripts/verify-docs-examples.mts, tests/types/docs-readme-rpc.ts and tests/types/docs-readme-http.ts. No library source, manifest, dependency, export or workflow change remains.",
+ "README now follows the approved purpose/install/RPC/HTTP/capabilities/links outline and uses published-package wording. Concrete service-free contracts accept typed ready clients; client acquisition/lifetime and required execution services remain application-owned. Checked ordinary HttpApiClient.make captures HttpClient during acquisition and returns default service-free Client, consistent with the HTTP snippet.",
+ "vp run --no-cache pack passed ESM/declaration generation, strict publint and Are the Types Wrong. Inspected the local npm archive: effect peer resolves to exactly 4.0.0, Query Core range remains >=5.103.1 <6, root exports point to dist, and all seven shipped skill/reference files are included.",
+ "vp run --no-cache --ignore-depends-on api-types passed every public fixture, including both exact README examples, under TypeScript 7.0.2 and 5.9.3. The pre-existing docs-hydration-views TaggedStruct suggestion is non-failing.",
+ "vp run --no-cache docs-check passed exact snippets and Astro (0 errors/warnings/hints). After final fixture formatting, node scripts/verify-docs-examples.mts passed again. Type-aware lint/typecheck passed all 150 checked files with no errors or warnings; final vp run format passed 304 files and git diff --check passed.",
+ "Exact pushed HEAD 3e3fd371 passed all six CI jobs in run 38161476267: source quality, example builds, documentation, Chromium, Firefox and WebKit. Current uncommitted README/fixture/verifier changes received the separate local checks above; runtime tests were not repeated for this documentation-only change.",
+ "Read the owned skill and affected RPC, HTTP and framework references plus all three planning records. Intent sync reported Nothing to synchronize. No new API recommendation, activation rule, domain task, failure mode or source boundary; fresh consumer/discovery testing was not repeated because shipped guidance is unchanged."
+ ]
+ },
+ "planning:_artifacts": {
+ "fingerprint": "3d7d7aec4b7470c0976ab35090f6642fc8f17eb3c938d52311ada6299a29119c",
+ "snapshot": {
+ "GLOSSARY.md": "ad19a69727108dd047208b6e76e05f5b1d241620ed75cb241a62fb4c068dc792",
+ "README.md": "fd60880b03b69efdd8300aeee473fdf1a5b2894e5f3f1d4a701525a0ac2fa967",
+ "_artifacts/domain_map.yaml": "03379e3cd6338cb4bb20bd15408af2ff86accf9fa009259f715123be50681d3c",
+ "_artifacts/skill_spec.md": "93dbe6009f951ddb49a350b85ce212f1b092bbd381cf2a1425ab3e243200e199",
+ "_artifacts/skill_tree.yaml": "0ef24d94a4bbc5c4b628892a130c2b36a81a16c5705a48e990919b5eec467a47",
+ "apps/docs/src/content/docs/concepts/client-lifecycle.md": "fcbaca84f266060b946eed9cbf9d0b9815352b7b1d6ddaff5803b29484345380",
+ "apps/docs/src/content/docs/concepts/data-normalization.md": "f1505ec3eb35a33fac289706c2cc318a2ffb80555e3302ca102e67e21c9012da",
+ "apps/docs/src/content/docs/concepts/http-utility-tree.md": "ed03938167f31822b76efbeac381fd3f8d297061fe567928ee022f8dbfadb9b4",
+ "apps/docs/src/content/docs/concepts/queries-and-mutations.md": "204141ba9e3b52e8e0b2d994ef4381cfcecf898d0bd011866f8cbfc8e89cb15c",
+ "apps/docs/src/content/docs/concepts/rpc-utility-tree.md": "fd5fcc232279e9577b8b2faf321a85e9a340e6090ea5887bbab208cca2d24a4e",
+ "apps/docs/src/content/docs/concepts/semantic-keys.md": "4fcc7437b4c0698f590926545e41b68eed1094027fb18a8834fb695db63262c6",
+ "apps/docs/src/content/docs/examples.md": "4035adf9d277a7a3d75b22be8147ee6acb3329e6e96ca7c76b9d4fc052758239",
+ "apps/docs/src/content/docs/examples/cancellable-commands.md": "c175cbd7f15b2322b3039a95aba937a440ae4198794195b6db7419b2a3acb245",
+ "apps/docs/src/content/docs/getting-started/compatibility-and-stability.md": "74f9d59c908fe6ab70ccfb8940c1f976e060b38a05cc6bbe75f72403d3b3ed7b",
+ "apps/docs/src/content/docs/getting-started/feature-support.md": "5a6b57b8e539937b203da9bb571d31da2169a014f6f0ee6d0625627a8b0f7525",
+ "apps/docs/src/content/docs/getting-started/http-quick-start.md": "9ac402d68c35a3e8e4d3139ab0424a55395eecd671dd25ba2e942b311230a6ff",
+ "apps/docs/src/content/docs/getting-started/installation.md": "fde89cc5c10d005672db696bdc8016deb42d86977fca1b89cfe6315c760bf2d3",
+ "apps/docs/src/content/docs/getting-started/quick-start.md": "34846f39ac2bc6275920d09f04f1141c2ef8d93688f2d83faaa6e29b3d7ac91a",
+ "apps/docs/src/content/docs/guides/angular-query.md": "82b6cc47488db0b166b0f79597526e26274823b48377482fb52949a00c5a9515",
+ "apps/docs/src/content/docs/guides/cache-filters.md": "ac56ebb6d8949bec515be80850a5386d79eb9dc38533286ad3fa638f82654418",
+ "apps/docs/src/content/docs/guides/cache-management.md": null,
+ "apps/docs/src/content/docs/guides/cancellation.md": "8566563c90d913c4db16435d314eba1ec53d6873b30aa5652097d0994c50cc4c",
+ "apps/docs/src/content/docs/guides/choose-stream-history.md": "6996df3a8b18c4fadbcc76a3635a8a5408f155b4068509d4801b38afa7f22f16",
+ "apps/docs/src/content/docs/guides/conditional-queries.md": "7cc52d18217653c63699e78ecce3efb78c484e57ba75a92071df5d16b9a40ac8",
+ "apps/docs/src/content/docs/guides/custom-key-encoders.md": "e48f1768db1c9e8ab3d5915593dc6de9089c35c039fb16e7ca04a4326a4df8bf",
+ "apps/docs/src/content/docs/guides/handle-failures.md": "7bf37fc98c4a4eab109ead80d24febe4dda968267f07e7f3d665297c746a9c2b",
+ "apps/docs/src/content/docs/guides/http-metadata.md": "b0b45e8c3af5ada0d64cf61bd5bca161186a604c30d3e9fc63ba9090c590e542",
+ "apps/docs/src/content/docs/guides/http-queries-and-mutations.md": "23edf1a1c71a29561d9c87cc7fca1f7c8ed370d6e62be5719dcf54d533c420b9",
+ "apps/docs/src/content/docs/guides/hydrate-query-views.md": "d71f573e4c6e6815e51f7a63080b773655f90cf9ef07155d293f1550eac091d4",
+ "apps/docs/src/content/docs/guides/hydrate-unary-data.md": "0cf27b204e709f8a753fd61fd1510073404611e53a9fd6e82e8122af7e68f2fa",
+ "apps/docs/src/content/docs/guides/mutations.md": "773d6720894a83083bcd54adb55b632a9902894165a7c147c1266620774d8f21",
+ "apps/docs/src/content/docs/guides/optimistic-writes.md": "8d5001c0c1caa2f4cc25ce10955791eaef2f032327fc9c8a743173ffd60b68b5",
+ "apps/docs/src/content/docs/guides/pagination.md": "95a82e2cc2a972080152ac0816e06262ad63c7c0a7f9c8a60b3f836a42120a1a",
+ "apps/docs/src/content/docs/guides/queries.md": "6fb845e9d9d86a94b4df323583c9f721c171d135e2cb64f184f8a6fea22350e7",
+ "apps/docs/src/content/docs/guides/query-defaults.md": "74b7f9cd1c29b6bfa3777e8b48cc3dc6319856b48029d052adb4de34a9f5ddaf",
+ "apps/docs/src/content/docs/guides/react-query.md": "d17a75453131d062ea1ca25cdeea9d9d975503d1bfb0be74c90c13ff0708590f",
+ "apps/docs/src/content/docs/guides/refresh-from-events.md": "a8e680ae9060a573336829b94dbf77dd32385671d48cd4aa0f092a1374444cd6",
+ "apps/docs/src/content/docs/guides/retry-queries.md": "4326d4e0cec0ca0067182020f68e4db0f634ecefedcc5cadd0db3e90e3709684",
+ "apps/docs/src/content/docs/guides/solid-query.md": "6ce866f49974edc7f5db579d08134734544de1137d5a9e5efdf49bc62d12b7f2",
+ "apps/docs/src/content/docs/guides/stream-snapshots.md": "91e22e85c11d8822e25e5abb7b872b78f07af79fdb16eb2690baf8226fdbd9f7",
+ "apps/docs/src/content/docs/guides/streaming.md": "2d43cc0ac6f007f31aabfe01200d895827cb14ec1166324eb9661d146cda240a",
+ "apps/docs/src/content/docs/guides/suspense-and-recovery.md": "a5f92087e5006d2162ab623cdc39d98a41e13b5967e7483e3db7fa46e436e730",
+ "apps/docs/src/content/docs/guides/svelte-query.md": "967257cd51f59723bd641c8553a4e50b931258e79f24d60f47fdfb3035ffe6a8",
+ "apps/docs/src/content/docs/guides/switch-cache-owners.md": "cc209f13becec305af60c9f04fe29f85a2ca6db3bc11601cf09083bc2583d198",
+ "apps/docs/src/content/docs/guides/tanstack-start.md": "7ec04e78ab8798f8cd89839f2a07b466f0c9834557126799373940b161a95b0b",
+ "apps/docs/src/content/docs/guides/trace-streams.md": "3e6bcd468881b23957b01e8222b2fd2d36b4de0e79141819234c54795b26f03a",
+ "apps/docs/src/content/docs/guides/vue-query.md": "bd8b50c940d0493780a60ae0cd80fc2843b2ebb22c2d3c9bc70653e0379d4155",
+ "apps/docs/src/content/docs/guides/websocket-clients.md": "1cd31655e433ced7b24795255cb03280b27734eda58afeb9730a42bfad433c43",
+ "apps/docs/src/content/docs/index.mdx": "b5bcd9d26ee0b8ea181b0c063afbae9ee057e31db9a2b3252c13589b5847339a",
+ "apps/docs/src/content/docs/integrations/index.md": "7ee02cd3d7d1d212ac0e539dc6dde5bf928d906797abcac34da1e7ec1352785a",
+ "apps/docs/src/content/docs/reference/browser-and-worker-hosts.md": "70743a4429a39937515c8d5fee79ca75714a92dd526f1093f9fa8ea12fbde984",
+ "apps/docs/src/content/docs/reference/compatibility-and-limits.md": "4f60753887b52c33a47b993f0aaaf75832edaeb09d082f2664e2e5e512e568a3",
+ "apps/docs/src/content/docs/reference/errors.md": "57b90eca4db33880af66063e8211b4a39d0850af811beafc8711bb01860063d5",
+ "apps/docs/src/content/docs/reference/external-http-clients.md": "9bfef63f64b378847d99092f088492f989ba0577810e6aa07bb194d55ca5fcbb",
+ "apps/docs/src/content/docs/reference/factory.md": "fb8e57908ccb82d57b3b29664034b3a210945b9bd39e030cd9613015ea3b0c37",
+ "apps/docs/src/content/docs/reference/generated-builders.md": "0c0406824a2f906ec4d5601ab068d6c1d2b35ce8b9602618f992eff7de8824f2",
+ "apps/docs/src/content/docs/reference/http-builders.md": "153a63a31bdfaa8411a4af067d555e7fe1af037c9d2f798a7f7a21b4e4be0a86",
+ "apps/docs/src/content/docs/reference/http-factory.md": "d40fd0597a9d784e21bf7f80ec9cf56008511f472625e572ffded61db0972f68",
+ "apps/docs/src/content/docs/reference/performance.md": "2f68c31cae28de0a84b1ce77f065481d37899171b78d9593ff65e017ff75d97a",
+ "apps/docs/src/content/docs/reference/public-exports.md": "9550217e7724f7d15542ff83e0a268bfe7274f7af5a4c3440ef0ee418607a6d9",
+ "apps/docs/src/content/docs/reference/type-inference.md": "1edcf7de07709644784a1f7dcc5462f0eb1e01e168f30ba9b1db102ebd424fd6",
+ "docs/adr/0001-target-effect-4-release-candidate.md": "44119ba9104f767c5804c5026c4a21a78a8367f6d9ff5a9035bb3f423969fbb3",
+ "docs/adr/0002-let-call-sites-choose-query-or-mutation.md": "4244d48ff136eea562aa2f94a0b6b1ab58412796f3ece47a3cf5b43f746e11f5",
+ "docs/adr/0003-project-dotted-rpc-tags-into-utility-paths.md": "a99856e94af4004484fed939d46ae4388363031cf396b07f04a92a7119fec2fe",
+ "docs/adr/0004-build-core-shaped-options-and-certify-react-first.md": "0e47069738c3792430c92b396068ac269139356c83738453889517d97e22f190",
+ "docs/adr/0005-preserve-the-cause-in-one-error-wrapper.md": "1e04885542f22f166b5daa913ae2dae121c407baa775a2c4a16590f96857e3fe",
+ "docs/adr/0006-use-canonical-semantic-json-for-payload-keys.md": "694d8665938af25abb91ada71ea9c95cb77dd4ea90019adb2f642e16a88948c7",
+ "docs/adr/0007-keep-the-core-factory-lifecycle-neutral.md": "a83dc0d6061ac0328a3ee6075aa872a55feb4f0154edf6dae964e74276bb15b5",
+ "docs/adr/0008-use-flat-prefix-matchable-key-tuples.md": "7fb791e73e0266afd8583e45059aebcc10bbd9704d625bdefcafec1481a46cf6",
+ "docs/adr/0009-build-an-eager-frozen-utility-tree.md": "bc3b08a3385f1dc8874d81f867f15ef6c30b203c94936fd991d2941fd5bacc27",
+ "docs/adr/0010-reuse-tanstack-query-core-as-a-peer.md": "633a1ce44c8d58b29096f540871b61566352462e1d4bd5335162b3e08652527d",
+ "docs/adr/0012-normalize-undefined-query-success-to-null.md": "5d076f168223f67a205138d3e258f1f3aac9dfe5d607ffe8efd12a71322ef022",
+ "docs/adr/0014-require-query-stable-payload-construction.md": "2f4381fb3e7406304ff3b914db541419f799f8a71d1d527b37a9e971e9949e47",
+ "docs/adr/0015-centralize-the-toolchain-in-vite-plus.md": "d2001383bc0f92363289c04b6b8df26acb5b0f5dfc0163b2a838f2eee8057b75",
+ "docs/adr/0020-generate-accumulated-and-live-stream-queries.md": "5e4f5c92e08ffb769137e930908dded993f928a497b018f9c6e4fd4f12232727",
+ "docs/adr/0021-share-utility-construction-through-private-modules.md": "821720a3eee166d4b7d42b6f5c3906bb29dff339b4815e9ed1c516bc5af66fd4",
+ "docs/adr/0022-add-buffered-http-utilities-with-separate-key-roots.md": "f1fb5d91cd91a70b356bc98b84176920ec822315dbdeaf5e247921853598b62f",
+ "docs/adr/0023-expose-buffered-multipart-http-mutations.md": "b72f20cb513d2a7db94b2dbe27576352048ba22288ad6eac6e80d1a7c81cefb8",
+ "docs/adr/0024-project-http-streams-and-buffered-metadata.md": "2797a5a4a751c5e37c38aa454c14b99ce1615870ffa13cfcedb98cca8a0af633",
+ "docs/adr/0025-use-public-decoded-message-clients-for-server-local-rpc.md": "36df8e1227af22018d5a9063699986ceb8dcfd4c8bb5615aa62557f2ec36e111",
+ "docs/adr/0026-keep-rpc-transport-aggregation-in-the-application.md": "b73af29d8f73a36f61f110ad8778e045d37253fe42a8888883e78089b93e955e",
+ "examples/server/src/commands.ts": "58f415fe0ab9bb0127c96c11ef0540a29b97d231eebd3a487513f0820a46b3d5",
+ "examples/server/src/diagnostic-operations.ts": "ddf8a0f2367b91ca08d6aaaf58380a51b77a5c51a9a85412bd7e7080ff0453ee",
+ "examples/server/src/domain.ts": "c00fced49e54d7bfff9045479e91aabdbd7c0868cc89afe00bae5473b17d2f82",
+ "examples/server/src/http-handlers.ts": "601f37c428015e75e94cb282af356878aa49c887804cc29e2b4f0c1a47ca92f0",
+ "examples/server/src/index.ts": "9e121809a5493c649e61e76fefec52a8c79a394983368060a95dc7000dcedc9a",
+ "examples/server/src/main.ts": "de9520cc16e4bff9d02b8507ee70641936b1287959823429f7759c0f05fdc0a7",
+ "examples/server/src/rpc-handlers.ts": "c2c57eb9a2ca5e602fff9f798c4d5165e91216c5b7e64e0a71220c4ba9316f3d",
+ "examples/server/src/server-local-rpc.ts": "de2a05bba54042f1d2d5781023cb5d20eb63915dd2a52635e9debf83911b5421",
+ "examples/server/src/server.ts": "5c9bbd7131ba3c55bbd61255fa8da8a275fc97412e1c8cb54f063bde517991e9",
+ "examples/server/src/users.ts": "15c363e2162f8dab4da1bfcf6324abbb3dc8ca34a8d8e036eb4db2481fe6be5b",
+ "examples/server/src/web-handler.ts": "2de54d8d2264024887ca63c8c53b20e9f9260ca6605b791d1f91bcea8c8d1b07",
+ "examples/server/tests/fixtures/websocket-server.ts": "b59863766bb60e5fb4de040d7d97ae2e67bca2ec44810ddc577f4cf5cb03129f",
+ "examples/server/tests/http-api.test.ts": "6ad2951b74c45a73ea4980e5da65c7ed4f758ff43db34702f1224de934548bca",
+ "examples/server/tests/rpc-transport-overhead.test.ts": "8d3dd40cfbbd0ce64b74f44f205f7f83163ea08dfc264a6deb1902e96b74a7fb",
+ "examples/server/tests/rpc-websocket-consumer.test.ts": "16253ef720e8a85cb7c583bcf6f9883c5893423d6da952659731e5823fcf0a62",
+ "examples/server/tests/server.test.ts": "44530f1e8b9b67f4d4bd8486c7bd7790240128fb161c1244857eee15c87a068d",
+ "examples/server/tests/web-handler.test.ts": "94d1b28810d908dcec8ca8299e56bb520f93804e8761b4d5e9c828087efae646",
+ "examples/shared/error-description.ts": "374a804cd0daf1dcfdff8b7247194d278cc52fdf3bd0d9b5d2891124b439cf87",
+ "examples/shared/use-slow-query-cancellation.ts": "f6221dc3a725c2f3cb15f41167ab98f8f579f3a0c138cb66cdf3c368b93b996a",
+ "examples/tanstack-start/src/components/effect-error-details.tsx": "a84187a90ebe207f9b8427f43dda44c81f6564821510c8c848ceca0f7d6940af",
+ "examples/tanstack-start/src/lib/api-server.ts": "b678d6edab872786fb92db328f60095d604c8d2f5205c4d4a462c3405a782bad",
+ "examples/tanstack-start/src/lib/application.ts": "7417de76eaf8a1a1cbd8464af6508bc3244a0176941c742e829880670a54ee8a",
+ "examples/tanstack-start/src/lib/query-ssr.ts": "0754abae5faf2f7562e1d86d27df0e14820a5ba9830146690ff1dc9f5beb3ec9",
+ "examples/tanstack-start/src/lib/server-application.ts": "442278fc08c4beb9a69cf1ab7672f661385d9c49998db77ce2870d349ffdc8a1",
+ "examples/tanstack-start/src/lib/server-host.ts": "1682ee37ea7551ec52c9530d6a4b476b967fa0572f5ddc26351ad427ce854e37",
+ "examples/tanstack-start/src/lib/snapshot-preparation.ts": "4321b25d469a6955659e6c7949b22ed78368873af81dd11718f53e02d1a81a2b",
+ "examples/tanstack-start/src/router.tsx": "801aac19cff9a4e2a4acb0823a9ea5c28b4aea9245f7e26cb63548bb5234bd15",
+ "examples/tanstack-start/tests/application.test.ts": "0ce067b4179b050b9daac397128fcd00e8f6d63416e43766ca1e442041f06301",
+ "examples/tanstack-start/tests/async-hydration.test.ts": "1f983917d2a469b83b876e882ad6a2ece4d28d360338ed614232807a168a1620",
+ "examples/tanstack-start/tests/client-navigation.test.tsx": "62af6b9c4ad00e2bd772a0eb75d175e11329079bc787874b0d87e7f22030620e",
+ "examples/tanstack-start/tests/failure-dehydration.test.ts": "b9d135c54e8e70ff454903f8016e6560fabaa487095cb40cb8725ed73577f079",
+ "examples/tanstack-start/tests/server-local.test.ts": "2facfdbf572cf8ed1cf5f6104a503504ab0e979546aca3e28d9dbc853c64c6e5",
+ "examples/tanstack-start/tests/server-render.test.tsx": "77b82127f9e3ddea55b201f7b2080f930ef340269010502f1515f6691ecc4ab2",
+ "examples/vite-react/src/app.tsx": "691f77aee6fb9f2b1f6f9df40a3afcf78f4af2d043d7b379f38c75c647a5f91e",
+ "examples/vite-react/src/components/ui/effect-error-details.tsx": "26a1a4bdb5a6331dca09c3c7764b2ff55431aa18ad6768f82529f8563dc3801a",
+ "examples/vite-react/src/lib/application.ts": "01f8f4f611435708e68d358993971aa9cadb01a2167fdc350a284d7f1ceeb752",
+ "examples/vite-react/src/lib/owner-cache.ts": "3286d0df63d4036c16c572ffd5e113400b455a5ce9f55dfe7859e72b8ae218bb",
+ "examples/vite-react/src/lib/user-writes.ts": "55f2de2f7be68f477665af3f59c93f37994045023014274513404418e0d1b8e8",
+ "examples/vite-react/src/main.tsx": "cdee6ca4095b58e1750015db473bda8651702a8ab32c408fa77961873db0e6fe",
+ "examples/vite-react/tests/app.test.tsx": "ff86b42023eb40658dd6feccbfd1f236a75bf2831f40b02955ebc1306be6329c",
+ "examples/vite-react/tests/commands-ui.test.tsx": "70005a656b9356fce97924dff6d4be82d87893cf48a619c119ad4372843246f8",
+ "examples/vite-react/tests/commands.test.ts": "3e24222572c0f7a4b68cfc4069c545cbebf410cacd0063a328cead9ad5baab08",
+ "examples/vite-react/tests/minimal-setup.test.tsx": "632d9a99695206f7aaddd139b7a2cc5e0d8a79fd991b9a1ccae0118a45460e4f",
+ "examples/vite-react/tests/owner-boundary.test.tsx": "d4ce58a002aac2b8f752936a65495558f89bff145d5cf2556f5c0d9286f8d6b3",
+ "examples/vite-react/tests/owner-cache.test.ts": "8818e30fdd3071a2e5dc2d865161e0d9f40de1ff37813b0a396bb2e83dd08a1d",
+ "examples/vite-react/tests/owner-switch.test.ts": "c997c9758269586591cbf55de4651c64091abc9061b56edb024dcbf9dbaa9c1d",
+ "examples/vite-react/tests/slow-query-cancellation.test.tsx": "d8c054206d3613939b71e390cb37002e7d6385628ca15bc20c4984f100cca779",
+ "examples/vite-react/tests/stream-tracing.test.ts": "0f09b669dc00a66e7db0d947f31daa88862e89cda9877d37caaa72631c1b247c",
+ "examples/vite-react/tests/suspense-recovery.test.tsx": "884e694a2a3ecc0cdd12d3555c953c30c6c7778bc613a78752b2ca27c17c173d",
+ "examples/vite-react/tests/user-writes.test.ts": "3fe07c1fa8deab8c154d30481f7bc6ef77d3a8ed6c3d5e0d3cbfe75574061e33",
+ "package.json": "dc41aa3f5b1633ffb2e6f6a0b7efb4e0119d74b9bc8c0003b1a8ee5fad854782",
+ "pnpm-workspace.yaml": "1e73526ddc3448a43e8cfc77e98bad98d15d0617dc2e8caf98e6d5d43fa90641",
+ "scripts/decode-utf8.mts": "2e90c53e95c22b864a209a87c98084db6ec95e83f842007b21528d286d45c18c",
+ "scripts/measure-construction.mts": "10522cb10ab51fd44d8990896a2a73e8bf4d4cd2646441e958b6180cb1afd147",
+ "scripts/verify-docs-examples.mts": "9ba75dd2952a8ee92995904ce9891b6757b10637a298646b95f9af73d270caf8",
+ "scripts/verify-packed-consumer.mts": null,
+ "skills/effect-api-query/SKILL.md": "41c0a5768977c0e25254f559de4454df7d9dc5fb6075487d65a6a52602b0e7d4",
+ "skills/effect-api-query/references/cache-workflows.md": "61d3d363b410eac3f52273e642ec2924d29e887f365a7c21a965a52deeded0be",
+ "skills/effect-api-query/references/frameworks-and-hosts.md": "e84b9179ca0cba6694200f504923906d78b3b7a305315f5d1453dace854aefb5",
+ "skills/effect-api-query/references/http.md": "4dd64a0fcc036f3ee857ae96d0e0149c729e0ea95dfd79a82a62c76db4619999",
+ "skills/effect-api-query/references/hydration-and-ssr.md": "1a6ba66187a1c786c09eb08dbd1c0f0e7c04e21d3b4787eb534687a67c1a38f0",
+ "skills/effect-api-query/references/query-patterns.md": "2b9ff5a7f9857d00dee85842351bc7ff8d3e88a016e1c0056c2ddb513cf53a64",
+ "skills/effect-api-query/references/rpc.md": "2d2d30f309424f255e3162fd52dbdaf6d3883e40d9eb6f1840eb814424b0abf3",
+ "src/core/inference.ts": "b8345c0961c67ceb41ee18e017302a5ef5d6be91794b861e72bece21ee5e9c30",
+ "src/core/operation.ts": "7dabe4d21070d20534643e5051060c84a09db5a7aa39858e75846043f8a537ea",
+ "src/core/policy.ts": "bebe7a32bb958ba9a1817c6fec6792fd04541f5ae81cd70fa422106ac3cb4073",
+ "src/core/schema-key.ts": "1f7d087793291b9763e82a0188367a9446f92b35bc25d73165b7e4f603e5ce05",
+ "src/core/stream-snapshot.ts": "00bf4855cc745571ce440a9afcf7a52134450de9ced00007e4cd2cdab8e544d1",
+ "src/core/streamed-query.ts": "0c29dd2bbf85ae2b4bda6ee65250f32ee17a5362e7a94f7423a0e457398ae9c4",
+ "src/core/types.ts": "c0904ecc411bd78cb82749f3461f67e78d05239e9e0802daf99f9cca5bf95a63",
+ "src/core/utility-tree.ts": "2a3996f5d49d70838e377af85b01acae43e4e964ae69e2150fad5b43a1069821",
+ "src/core/view-prefix.ts": "35a558e324547cb5a799114b937550704984ceae12c03205df5957adf55d988a",
+ "src/http/create-utils.ts": "785dd9171fd9c6ab7619a9e3728f91a3e9d197c311a3a6c8a6dffc74904a4975",
+ "src/http/errors.ts": "95869413973faefd2958f4e48feada7d5700e3aa0c2545f56a7202c8b9609a46",
+ "src/http/operation.ts": "c7a393845b6ba9d5382c7b697230463be4c78ae99525f923cca6f741ffaf6f3d",
+ "src/http/request.ts": "9d31397ee4241319ae56260c65e7fb4973adcee974b55e43e2895e7524d39180",
+ "src/http/streamed-query.ts": "bdac94b5d016578c249a46f4e1825424d5cf72acc85361e2fd00fda92e15ac5c",
+ "src/http/types.ts": "a638fe517865a1d341c2c974d4774f60cb7c10c0907287c9ec8a7d6f296def48",
+ "src/index.ts": "2dfdc1e9a5994ca3a6d918704ecd57442f4e34831b0cba2da68d4e7cc07810c1",
+ "src/rpc/create-utils.ts": "c0db42f6d9962b6c2e291f2b3d060be16ba7fc93826fa00471db5d82503e27dc",
+ "src/rpc/errors.ts": "7048a786a55f2cd221788485ffa993277f47896110ffac742f74ee077382377e",
+ "src/rpc/operation.ts": "e46cb103c4a79506cecb34c9337640ec9ab917a488e9360c7535d3dad733ebf5",
+ "src/rpc/streamed-query.ts": "bf480b78f9d0e37d7e7b572395f1238e6539d0ba8386b22eb5f8b3c400d1dd0f",
+ "src/rpc/types.ts": "90f4df74680db534f98c72f3bdcb5ae60fb720c45114dfb61a089dd62c1dc1be",
+ "tests/cache-recipes.test.ts": "5d86c8f74e952aa6f614d9ba32b4f2680137d23b696d8c55cd07d0463e5b65b7",
+ "tests/create-http-api-query-utils.test.ts": "c1307dbe52820f44526ec676f0b24e5a0e4635690b548185ceb819050b0e4605",
+ "tests/create-rpc-query-utils-configuration.test.ts": "0e53c59e24291e0424e860b9030c439105a1468e4ba37bf24bef81dd846112e2",
+ "tests/create-rpc-query-utils-execution.test.ts": "05a0de82218666f39cc6ac2d120f2b2e96885e9cfc9323e5ccc658ad996da2c5",
+ "tests/create-rpc-query-utils-keys.test.ts": "c6b6918e08c10f097634179e65d0e8eb481ff6833561b04de8e6a093104fee31",
+ "tests/create-rpc-query-utils-request-options.test.ts": "bcd76859a2830e522bdeb212be70f2e14be3b815da75a5caf3e596fd5fbd13e7",
+ "tests/create-rpc-query-utils-server-local.test.ts": "45ee329a736bcb6b114727ef8874f3f34541ce6dc55d5e13ffc80be9c2af2ddd",
+ "tests/create-rpc-query-utils-stream-baseline.test.ts": "282b7f1e8014159972275599a5c9d60bc689e5c9dd619a4a879cef4afe0edfb0",
+ "tests/create-rpc-query-utils-stream-cache.test.ts": "b97fd6eb63c0e8c023f98a1420555288c3dd2f4ab500b0d3e0b1d3a5c41e1347",
+ "tests/create-rpc-query-utils-stream-hashing.test.ts": "025f15582fe2a667dc6383a406d5b42654ea7634acf3591803d9f379896a69bc",
+ "tests/create-rpc-query-utils-stream-publication.test.ts": "cc3a25d02015b1410a8d1406249a846bf711f7b829fa7fccce1da90e600530d3",
+ "tests/create-rpc-query-utils-streaming.test.ts": "f52f775426bb949910a976150f3650b1dfe7526bcb0bd41ed874f399ec8aef44",
+ "tests/create-rpc-query-utils.test.ts": "035816f190df16fe51539857479a0d8cb9c75b1eb6897110aa07ba6ada33c977",
+ "tests/fixtures/async.ts": "61c314b76032dc197a7568b0602740d06eee0462414516788c699f1a7263114a",
+ "tests/fixtures/docs-websocket-use.ts": "6e2aa0bb7b1a653ffc215bad7a39b9a79aa1a9b3707bb32b1e80f4636faac544",
+ "tests/fixtures/effect-rpc.ts": "8a92d7b5e815012f830b7e87a8492b2680d8a1b8fa866c3db25274458d432745",
+ "tests/fixtures/http-client.ts": "184cef6b4864d32f1225149161e12d4286517a34c74eb0ba0a2437ff5f333891",
+ "tests/fixtures/optimistic-users.ts": "163e6880b076673c7a6c643e95737869cc5415446ba5042b10d3371afd401305",
+ "tests/fixtures/query-cache.ts": "ee6509aac5d0cf4f781652da10c2b1c3501a222ddd9a6b05f447e6a226548071",
+ "tests/fixtures/rpc-transport-queries.ts": "46be1d1e6048d57d83e9ae64b00c8c0c11deec6a67d0d4b115cdc9aac7447158",
+ "tests/fixtures/socket-client.ts": "d2d0a4a31011e2cfeec0e7e7ca996ad752a3a51db5675ac5efce54d284c8db89",
+ "tests/fixtures/user-events.ts": "13d8167b811bec6319de96f7cb50410f586c18cc92677d7fd17488b16d15b329",
+ "tests/fixtures/websocket-checks.ts": "7b8035264ece4e501e829b3e2b755f9d7b17c010ffa1036db6338a368ff6f93c",
+ "tests/http-cached-views.test.ts": "ff5fc7de21d00058fe067bf0655e9e6509bc3d04f26730a89c26c84fd3b477e9",
+ "tests/http-execution.test.ts": "241beae3806d2041c7c8cdd0ae5d4bf5277163e8e4690c1cbe589318db6a7776",
+ "tests/http-hydration.test.ts": "cead9c149e9aecbba7121b4e6bcfa3450368d24e6320ba1b8825545db747b98d",
+ "tests/http-live-query.test.ts": "79df219cb204669520c584123f167479ea3fa514d899897bf2810a04e8e1ca65",
+ "tests/http-multipart.test.ts": "cfda4574a8b10bfcf1b38c060f37d6791d83d94a01640edc8f85c468e45cb3c4",
+ "tests/http-query-options.test.ts": "e6abd4020fb4fd11877802c42d07ffb6f66822120d409c885150e97177769386",
+ "tests/http-semantic-keys.test.ts": "df50b9a0cf6981594100c93ca4283eb8ca11e7aca4db8719b4d7bd9a4333cd16",
+ "tests/http-transport-cancellation.test.ts": "e56f8571f949adc9d44f14b61e20edddb188a9565bf7a585859ffe73a851ac39",
+ "tests/query-policy.test.ts": "6ae9b22f6b171414387a5a9639ca3716ce2d065f3530122c320cebf1bc25066e",
+ "tests/query-view-prefix.test.ts": "162de0fa5f68b1f778f8c0c7201a15dcdd78dce4f107fcd64c1e1a50c733e6fe",
+ "tests/stream-snapshot.test.ts": "86449ef5d0f1baf165a5c973fcd0a190b9fce8ae5b6e8732a4454ab0c9f6c132",
+ "tests/types/docs-functionality.ts": "d638721f8a5f291e30b97229933bbb48dc5a92f677897e330bd1959b35deb8ae",
+ "tests/types/docs-http-quick-start.ts": "5f7eef98be244ea392fc2c5b527858f159a08efebf6f2665725301aa8a910050",
+ "tests/types/docs-hydration-async.ts": "de67135bf3da0dffdac47e9f2e49469edddac3d7d026fbd93d39aea6964c0dd8",
+ "tests/types/docs-hydration-dto.ts": "ebcd5c3895e8fa40bff3b62e8e13213e98a3e1c4796d89979b23ecc64cdc13ff",
+ "tests/types/docs-hydration-rich.ts": "56b35d7bb4a0f0ebc777161beb2e73a19dfc7de4db26fc74e3abab5d164f1402",
+ "tests/types/docs-hydration-views.ts": "08d75fe114e4a682fc0ad62b847898dba270672e0ce6d19a4f4d66cf92f75365",
+ "tests/types/docs-policies.ts": "b52d09f03131797873d73ac73d48639010136673b9ac98b866762099899e79a4",
+ "tests/types/docs-react-entry.ts": "cfe186d60a53553103ef292261b48b09b5094d927b1f198f2d3c8bd6f08325d1",
+ "tests/types/docs-react-setup.tsx": "bf0bfb164818366487ce2742699589c62fee4ec5bcb9e906f7d8c423251ecf65",
+ "tests/types/docs-readme-http.ts": "f15c8d87a1522328bbec1bc81d6e7573d406a88134f37e2dfab4c2e4dfe877d5",
+ "tests/types/docs-readme-rpc.ts": "e41aaf93b7fd61f619a2a3fb1132ffe5c027dfe17040b5ba061fa3591f31c69d",
+ "tests/types/docs-retry.ts": "78c782810b772e152ea0c47074fb2546fed5d397b93b147862644859fd20cc25",
+ "tests/types/docs-rpc-quick-start.ts": "95deee30de122cbaa7b9cb28257c234aa1162a0b549a87cf50a80bd84e871081",
+ "tests/types/docs-stream-snapshot.ts": "bc924cff90a9f9a8e416bf7fbdfedbd607c88e7a678435aaf20ef878862e06ff",
+ "tests/types/docs-stream-tracing.ts": "c839cd8a8d0875ddbe30e6234a0649c82d79f481084e718e5c341f7b4c427198",
+ "tests/types/docs-suspense.tsx": "2adc801083df580498a6cfa78fd6b970eae087c6e2af8601fcae111a53d13f4c",
+ "tests/types/docs-user-events.ts": "87647140d5434b95cc5389b1fea9919f20df7b6fcee4f00565836a4eae549a70",
+ "tests/types/example-owner-contract.ts": "fb10bd087ee582a64806d110404c366cb74e520b0b8cc11701348036b08b9622",
+ "tests/types/helper-contract.ts": "93f5d4276dca08c4848ffe7fccff893081767c4f51e11ec27588caade4999a53",
+ "tests/types/http-contract.ts": "9b6134849353f790a91cfebe955d660a65dc1927ffc00adf471afb7ae84b064d",
+ "tests/types/http-stream-contract.ts": "24031e37ac8cada4b8e9d3b2f4ce6e08448780571d94c8002bd8b267caa320bd",
+ "tests/types/http-type-scale.ts": "b456543b88316a2dd899f929efbffcf514e54e213e109b5f7d52eb785d2255aa",
+ "tests/types/http-view-proof.ts": "f42a1ebf36eeab7a906b722f5d2c2af0aabe8d30ef378fc50386c16d464fb64e",
+ "tests/types/public-contract.ts": "0726d33528f8f08bb907d9cd9c18f2d73d4e5b900c35080a8f176fe9f32b944b",
+ "tests/types/server-local-client-contract.ts": "443a60788ce7d91a77459c99f07d3fc9bf70d5a64a83c05ece5c40cfac63d298",
+ "tests/types/snapshot-contract.ts": "9e6a2edaddb7545f20d351511ed99be2828d4ca56779503bcc443963d8b73716",
+ "tests/types/tanstack-start-contract.ts": "51681e3d0d7504a614d490f18adb6f44db82d34b9d4d7cb9cf941aea33de284f",
+ "tests/types/type-scale.ts": "a9b307c25c72f3c184eabc8e22ddaeea96feb331c0f8d748773d765d358dbfca"
+ },
+ "head": "3e3fd371f097ad7a7f430b73f09c69ef711acff4",
+ "outcome": "no-change",
+ "reason": "All three planning records remain accurate: domain_map.yaml retains the existing contract-query tasks, ownership boundaries and failure modes; skill_spec.md retains the same supported guidance and documented validation approach; skill_tree.yaml already maps README.md, scripts/*.mts and tests/**/*.ts. The README rewrite and its two compiler fixtures add no domain task, skill identity, recommendation or source boundary. Preserve the accurate records without a no-op history entry.",
+ "evidence": [
+ "Reviewed actual diff at HEAD 3e3fd371f097ad7a7f430b73f09c69ef711acff4: README.md, scripts/verify-docs-examples.mts, tests/types/docs-readme-rpc.ts and tests/types/docs-readme-http.ts. No library source, manifest, dependency, export or workflow change remains.",
+ "README now follows the approved purpose/install/RPC/HTTP/capabilities/links outline and uses published-package wording. Concrete service-free contracts accept typed ready clients; client acquisition/lifetime and required execution services remain application-owned. Checked ordinary HttpApiClient.make captures HttpClient during acquisition and returns default service-free Client, consistent with the HTTP snippet.",
+ "vp run --no-cache pack passed ESM/declaration generation, strict publint and Are the Types Wrong. Inspected the local npm archive: effect peer resolves to exactly 4.0.0, Query Core range remains >=5.103.1 <6, root exports point to dist, and all seven shipped skill/reference files are included.",
+ "vp run --no-cache --ignore-depends-on api-types passed every public fixture, including both exact README examples, under TypeScript 7.0.2 and 5.9.3. The pre-existing docs-hydration-views TaggedStruct suggestion is non-failing.",
+ "vp run --no-cache docs-check passed exact snippets and Astro (0 errors/warnings/hints). After final fixture formatting, node scripts/verify-docs-examples.mts passed again. Type-aware lint/typecheck passed all 150 checked files with no errors or warnings; final vp run format passed 304 files and git diff --check passed.",
+ "Exact pushed HEAD 3e3fd371 passed all six CI jobs in run 38161476267: source quality, example builds, documentation, Chromium, Firefox and WebKit. Current uncommitted README/fixture/verifier changes received the separate local checks above; runtime tests were not repeated for this documentation-only change.",
+ "Read the owned skill and affected RPC, HTTP and framework references plus all three planning records. Intent sync reported Nothing to synchronize. No new API recommendation, activation rule, domain task, failure mode or source boundary; fresh consumer/discovery testing was not repeated because shipped guidance is unchanged."
+ ]
+ },
+ "source:vite.config.ts": {
+ "fingerprint": "d885254315a5839e36915d10374a35265c0f825afe512387bf51a6bb002e42f4",
+ "snapshot": {
+ "vite.config.ts": "190a7356392a101b3a02ff18f894ad414389c73a9b5bdfea566b4b88094ff9e2"
+ },
+ "head": "8f4723c40f217b9ba82e8247d9147c143782538c",
+ "outcome": "no-change",
+ "reason": "Extend the existing structural conditional-type lint treatment to the new inference/policy modules and make all Fallow analyses bypass their stale cache. Repository tooling configuration does not introduce a library-consumer workflow.",
+ "evidence": [
+ "Type-aware lint passed with no warnings/errors. Both fresh Fallow dead-code modes passed; semantic near-duplicate and health reporting remain enabled."
+ ]
+ },
+ "source:.github/workflows/release.yml": {
+ "fingerprint": "020cfeccbebeae32db3a779d8983c0151eb4d8b91405ae20716a365effb40382",
+ "snapshot": {
+ ".github/workflows/release.yml": "17d01b72d314722784ea0d032426ca55b1860629234adfcc0f1c72c279b95b2b"
+ },
+ "head": "f3ba2a62cdb0b28eaa6e592b010bb6879466cda2",
+ "outcome": "no-change",
+ "reason": "Every main push and manual run invokes shared validation once. Pending changesets still create a version PR on main; publication still requires publish mode, a main push, completed validation and native Changesets packing. These are release orchestration changes.",
+ "evidence": [
+ "Diff reviewed against f3ba2a62cdb0b28eaa6e592b010bb6879466cda2; actual PR base 5b91ddb1de13970365669c887b9d767ea417fbd4. Public library source, compiler fixtures, runtime cases, README, documentation pages and skills were not changed in this batch.",
+ "Native uncached typecheck passed 141 files and native pack attw/publint. Scoped native format passed seven affected configuration files; final YAML parsed and browser/trigger/publication prerequisite expressions were inspected.",
+ "Four existing application Chromium acceptance cases and all seven existing documentation Chromium cases passed against prepared outputs. Their preview logs contain no pack or build invocation. Hosted docs Playwright list mode listed seven cases without building a local site. Receipts: /tmp/effect-api-query-ci-audit/.",
+ "All three shared planning documents were read: _artifacts/domain_map.yaml retains the same ten consumer tasks/failure modes, _artifacts/skill_spec.md retains accurate source-backed coverage and boundaries, and _artifacts/skill_tree.yaml retains the same owned skill, six references, source mappings, prerequisites and distribution. CI-only orchestration requires no guidance or planning rewrite.",
+ "The first hosted run of artifact reuse and the reusable release/deployment workflows remains unverified locally. No package publication or Pages deployment was performed."
+ ]
+ },
+ "source:e2e/browser-test-config.ts": {
+ "fingerprint": "7f044710dcd47c87c51384327d1e78696cd6286d91a3d102a8345096303f507b",
+ "snapshot": {
+ "e2e/browser-test-config.ts": "d2678060fc23a55740e276b850a918f5f2847e0b4208135ff9fcacea5f8b7186"
+ },
+ "head": "4ea1e4329da229c4c9853ddc2f6a50a6309afe9e",
+ "outcome": "no-change",
+ "reason": "Config reads preserve missing versus empty CI values and the existing browser project, retry and reporter behavior. This repository-only configuration adds no library capability or developer guidance task.",
+ "evidence": [
+ "Base 4ea1e4329da229c4c9853ddc2f6a50a6309afe9e; actual changed sources and native review fingerprints in this report.",
+ "Uncached typecheck: 135 files, zero lint/type errors; strict Effect diagnostics:146 files, zero diagnostics; runtime:262 tests/34 files and both server compilers.",
+ "Fresh packed-package matrix:26 compiler validations,21 runtime fixtures per peer,4 frameworks,12 diagnostic cells,18 construction cases and6 bundles. Selected archive SHA512 437c863fbae5d097d5947330524c004f1bf10e33cb1334fc245818be36ccd1d969458c7ba1a0eb135326f4f7c4030cb22518bc8aa08d8b03e8d543353f9b2876.",
+ "Chromium/Firefox packed Window/Worker:4 tests pass; native app/docs production builds and docs parity pass.",
+ "Finite command probes:11 real-host cases pass, every owned child exits and temp directory is removed; six actual bundle gzip outputs match complete prior native level9 bytes and exclude platform-node.",
+ "Fallow, formatting and native skills validation pass. Native sync reports nothing to synchronize; guidance and all three planning documents remain byte-identical to the reviewed base. Root owns final managed all-engine and Release provenance acceptance."
+ ]
+ },
+ "source:e2e/packed-hosts.spec.ts": {
+ "fingerprint": "9e9ba0561b6bff5e039ac0ec9e15bb8d5f72faa9018ed33ed778f56ddc062a56",
+ "snapshot": {
+ "e2e/packed-hosts.spec.ts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: e2e/packed-hosts.spec.ts."
+ ]
+ },
+ "source:playwright.docs.config.ts": {
+ "fingerprint": "f66c846d0924902b33bbc055ad0972bff368f4d48059f552f48a5096ae3be496",
+ "snapshot": {
+ "playwright.docs.config.ts": "3578d202bd05154db9e17f412fad7e2a7bfd707e1ea997fa0017cf5693498181"
+ },
+ "head": "f3ba2a62cdb0b28eaa6e592b010bb6879466cda2",
+ "outcome": "no-change",
+ "reason": "The local documentation preview serves its prepared site. The native docs-e2e task owns the local build, and hosted DOCS_BASE_URL checks still omit a local server and build. Existing documentation acceptance cases are unchanged.",
+ "evidence": [
+ "Diff reviewed against f3ba2a62cdb0b28eaa6e592b010bb6879466cda2; actual PR base 5b91ddb1de13970365669c887b9d767ea417fbd4. Public library source, compiler fixtures, runtime cases, README, documentation pages and skills were not changed in this batch.",
+ "Native uncached typecheck passed 141 files and native pack attw/publint. Scoped native format passed seven affected configuration files; final YAML parsed and browser/trigger/publication prerequisite expressions were inspected.",
+ "Four existing application Chromium acceptance cases and all seven existing documentation Chromium cases passed against prepared outputs. Their preview logs contain no pack or build invocation. Hosted docs Playwright list mode listed seven cases without building a local site. Receipts: /tmp/effect-api-query-ci-audit/.",
+ "All three shared planning documents were read: _artifacts/domain_map.yaml retains the same ten consumer tasks/failure modes, _artifacts/skill_spec.md retains accurate source-backed coverage and boundaries, and _artifacts/skill_tree.yaml retains the same owned skill, six references, source mappings, prerequisites and distribution. CI-only orchestration requires no guidance or planning rewrite.",
+ "The first hosted run of artifact reuse and the reusable release/deployment workflows remains unverified locally. No package publication or Pages deployment was performed."
+ ]
+ },
+ "source:tsconfig.json": {
+ "fingerprint": "4510191ccaa7f398708c42a16396f32bc93ebd0e26aa135cf5ea31c8f960dfd1",
+ "snapshot": {
+ "tsconfig.json": "ff3d1a4b82baaeddec55b77e8ab6add92256f4f1fef34d7968b5977d16608c12"
+ },
+ "head": "8f4723c40f217b9ba82e8247d9147c143782538c",
+ "outcome": "no-change",
+ "reason": "Root checking now includes TSX fixtures and adds the two new RPC-behavior tests to the existing narrow unstable-Effect-API allowlist. Library runtime/type semantics are documented in the owned skill; this checker configuration adds no consumer-facing API.",
+ "evidence": [
+ "Type-aware check passed; strict Effect diagnostics checked 177 files with 0 errors and 0 warnings."
+ ]
+ },
+ "source:.fallowrc.jsonc": {
+ "fingerprint": "c88901fb689b35dfb47eaedffd2c4e1477db5d6bdb4d4de7a3a0bb75d59333c4",
+ "snapshot": {
+ ".fallowrc.jsonc": "3ae2a2ff3c65e543550b35c15d620bc532f454e8d27ecaa8a88b007e7c46604e"
+ },
+ "head": "d870776a5f37835467beb611c6ca6a51fe3933eb",
+ "outcome": "no-change",
+ "reason": "Correct the known source-only example ownership limitation with an exact React ignoreDependencies entry. Fallow attributes examples/shared to the root manifest, where React is a development dependency, while both private applications declare React at runtime and the root package files allowlist excludes examples. This does not make React a library runtime dependency, exclude shared code from analysis or suppress duplicate groups. No consumer guidance change follows.",
+ "evidence": [
+ "Compared the task working tree with d870776a5f37835467beb611c6ca6a51fe3933eb; three independent architecture passes and an additional independent check of the final diff found no remaining actionable findings.",
+ "Full runtime suite passed: 506 tests in 46 files, including 5 new hook-lifetime cases for RPC/HTTP operation isolation, pending status cancellation and post-await retired-owner guards. Independent pass 2 additionally verified 191 snapshot/lifecycle/hash cases.",
+ "Direct vp pack passed declaration emission, attw and publint. Published-contract fixtures passed installed TypeScript 7.0.2 and 5.9.3. Full type-aware lint passed with no errors or warnings; strict Effect diagnostics passed with 0 errors and 0 warnings (one pre-existing suggestion).",
+ "Both example application builds passed. Expanded shared CSS has exactly the original rules for both apps, ignoring whitespace. Documentation snippet and Astro checks passed.",
+ "All four uncached Fallow analyses passed: both dead-code modes have no issues, semantic near-duplicate groups decreased from 67 to 61. Existing workspace-discovery advisory for the explicitly excluded source-only shared examples remains visible.",
+ "The native task supervisor sometimes fails with spawn EBUSY or sandbox process initialization errors; identical installed commands ran directly after completing their package prerequisites. No checks or source rules were bypassed to obtain these results.",
+ "No shipped guidance, activation description or public interface changed. Fresh consumer and discovery sessions were not repeated for this internal refactor; executable published-contract and rendered-application checks provide this batch evidence."
+ ]
+ },
+ "source:.github/workflows/ci.yml": {
+ "fingerprint": "cad5322457ab5941301e112617a26aee236fcae470a54f43881271389af5e9cf",
+ "snapshot": {
+ ".github/workflows/ci.yml": "91175ea9b646dbacc092ab0860a721331cdc4e312bc5f3b41fd3c6f8e0201f04"
+ },
+ "head": "f3ba2a62cdb0b28eaa6e592b010bb6879466cda2",
+ "outcome": "no-change",
+ "reason": "Source formatting, skills, typed lint, compiler fixtures, Effect diagnostics, Fallow and runtime checks remain. Successful example and documentation builds feed the same three browser projects through current-run artifacts. This changes CI scheduling and reuse, not library behavior or consumer tasks.",
+ "evidence": [
+ "Diff reviewed against f3ba2a62cdb0b28eaa6e592b010bb6879466cda2; actual PR base 5b91ddb1de13970365669c887b9d767ea417fbd4. Public library source, compiler fixtures, runtime cases, README, documentation pages and skills were not changed in this batch.",
+ "Native uncached typecheck passed 141 files and native pack attw/publint. Scoped native format passed seven affected configuration files; final YAML parsed and browser/trigger/publication prerequisite expressions were inspected.",
+ "Four existing application Chromium acceptance cases and all seven existing documentation Chromium cases passed against prepared outputs. Their preview logs contain no pack or build invocation. Hosted docs Playwright list mode listed seven cases without building a local site. Receipts: /tmp/effect-api-query-ci-audit/.",
+ "All three shared planning documents were read: _artifacts/domain_map.yaml retains the same ten consumer tasks/failure modes, _artifacts/skill_spec.md retains accurate source-backed coverage and boundaries, and _artifacts/skill_tree.yaml retains the same owned skill, six references, source mappings, prerequisites and distribution. CI-only orchestration requires no guidance or planning rewrite.",
+ "The first hosted run of artifact reuse and the reusable release/deployment workflows remains unverified locally. No package publication or Pages deployment was performed."
+ ]
+ },
+ "source:tests/packed-consumer/construction-baseline.mts": {
+ "fingerprint": "2db4e2c633021aa1fb6f3dbbb8b394c86022069f2f9655073cfc72e6f8a47c3e",
+ "snapshot": {
+ "tests/packed-consumer/construction-baseline.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/construction-baseline.mts."
+ ]
+ },
+ "source:tests/packed-consumer/defaults-runtime.mts": {
+ "fingerprint": "5ec112a9737bc4e08d284035605f377997cbf9629e448601e41b2c678f55f34b",
+ "snapshot": {
+ "tests/packed-consumer/defaults-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/defaults-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/events-runtime.mts": {
+ "fingerprint": "b4e841203f2c682e2c21756041e977df85a95ae4ee572fd50cdd1d7b905d1b2f",
+ "snapshot": {
+ "tests/packed-consumer/events-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/events-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/filter-runtime.mts": {
+ "fingerprint": "9da257cfe3f1b140fd6b7e986b0e6858a4482fcf9358481c808ec02ddc8fee9a",
+ "snapshot": {
+ "tests/packed-consumer/filter-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/filter-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/hashing-runtime.mts": {
+ "fingerprint": "a1facbc16a85798759d9b043d7430b85c737c453636250f2601fa3025a7777b2",
+ "snapshot": {
+ "tests/packed-consumer/hashing-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/hashing-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/hosts/index.html": {
+ "fingerprint": "c1e73f22bfc41d87b6da1dedf8fdfda3a1672a66bd3dcaed74f7304171ad0771",
+ "snapshot": {
+ "tests/packed-consumer/hosts/index.html": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/hosts/index.html."
+ ]
+ },
+ "source:tests/packed-consumer/http-etag-recipe.mts": {
+ "fingerprint": "6221d54620d4050f75a5eb0f740d8372c666aef38889e5cbe51f803f59352208",
+ "snapshot": {
+ "tests/packed-consumer/http-etag-recipe.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/http-etag-recipe.mts."
+ ]
+ },
+ "source:tests/packed-consumer/http-live-runtime.mts": {
+ "fingerprint": "d5bd5bc8ddeb7894dc01727f4a67df765c82abc3f1d9d011d8461188e6f1c7ef",
+ "snapshot": {
+ "tests/packed-consumer/http-live-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/http-live-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/http-metadata-runtime.mts": {
+ "fingerprint": "6bfcd0fe37114c6de756518a4c159ee72bc657bea8b5e11b183d5e1e2fa4bc61",
+ "snapshot": {
+ "tests/packed-consumer/http-metadata-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/http-metadata-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/http-runtime.mts": {
+ "fingerprint": "b47aa78c183c3d0fc93665760cc56b982a0e20271d3bd282c87f480fe37dfd2f",
+ "snapshot": {
+ "tests/packed-consumer/http-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/http-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/http-stream-runtime.mts": {
+ "fingerprint": "ef685c9517a31d78c728d40668620a77cd6a5f24885c35b3ed96a3d1583f581c",
+ "snapshot": {
+ "tests/packed-consumer/http-stream-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/http-stream-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/hydration-runtime.mts": {
+ "fingerprint": "5ab1a94b3756217c9a994b11cf3e3762649ae2859ed9bcbd1fe6ac35e889b303",
+ "snapshot": {
+ "tests/packed-consumer/hydration-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/hydration-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/hydration-views-runtime.mts": {
+ "fingerprint": "077263ad073837a5f9169898e7edcf32c2ea2dedfc8b7ae2d8322d31b93038a1",
+ "snapshot": {
+ "tests/packed-consumer/hydration-views-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/hydration-views-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/openapi-generate.mjs": {
+ "fingerprint": "7b87bbea6ce7e695fe4efd6728dac46268db7ae6df87cfc73f9311d321eea024",
+ "snapshot": {
+ "tests/packed-consumer/openapi-generate.mjs": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/openapi-generate.mjs."
+ ]
+ },
+ "source:tests/packed-consumer/openapi-runtime.mts": {
+ "fingerprint": "5ba484af38a27be547136319447d880647f407e16369ab572508e311e3cb0f4f",
+ "snapshot": {
+ "tests/packed-consumer/openapi-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/openapi-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/optimistic-runtime.mts": {
+ "fingerprint": "c88cb433ff279a599f068dfe5e9f8c619b18725bb1f8242f736b2ff85ee0c2cb",
+ "snapshot": {
+ "tests/packed-consumer/optimistic-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/optimistic-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/owner-cache-runtime.mts": {
+ "fingerprint": "6d7531302af18cd77d98144494cfba587a9df2f235b6cc8b7abfbba35bf2f954",
+ "snapshot": {
+ "tests/packed-consumer/owner-cache-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/owner-cache-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/retry-runtime.mts": {
+ "fingerprint": "d5cf2283a0e6d6bce385b062c75c6381096b3b7581f206255a406473076dc87a",
+ "snapshot": {
+ "tests/packed-consumer/retry-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/retry-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/runtime.mts": {
+ "fingerprint": "052904fd6d20ba06c524d632b3034e375ad01fa986e11d40b2eaa9768063788b",
+ "snapshot": {
+ "tests/packed-consumer/runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/snapshot-runtime.mts": {
+ "fingerprint": "8259933d616d9d06402538b9103d65cd7a5b3885368ad3e938270fccb0240ab9",
+ "snapshot": {
+ "tests/packed-consumer/snapshot-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/snapshot-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/start-ssr-runtime.mts": {
+ "fingerprint": "112e744ec9746a23719715bbbeb14c7defa2a0bda1cd658d2f15e059ba84b365",
+ "snapshot": {
+ "tests/packed-consumer/start-ssr-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/start-ssr-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/stream-cause-runtime.mts": {
+ "fingerprint": "771bc77ee9ebaddfcbf0faab92e6081090c2d500638efe7b261b52bcd72b5e4c",
+ "snapshot": {
+ "tests/packed-consumer/stream-cause-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/stream-cause-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/stream-policy-runtime.mts": {
+ "fingerprint": "f427fd75c4d9ea5ce8b2bf079639a480d5c3f075d84295afe70ea57d7fdfba40",
+ "snapshot": {
+ "tests/packed-consumer/stream-policy-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/stream-policy-runtime.mts."
+ ]
+ },
+ "source:tests/packed-consumer/svelte-consumer.svelte": {
+ "fingerprint": "7318224e4fb8906d47fdad76f628ae164bd4f971d95044fb39e7ca64de2ffedc",
+ "snapshot": {
+ "tests/packed-consumer/svelte-consumer.svelte": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/svelte-consumer.svelte."
+ ]
+ },
+ "source:tests/packed-consumer/tsconfig.contract-baseline.json": {
+ "fingerprint": "7220c01ba1fb0f402db20171b85a28cc7f7b42772fd77103cef737e651268e48",
+ "snapshot": {
+ "tests/packed-consumer/tsconfig.contract-baseline.json": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/tsconfig.contract-baseline.json."
+ ]
+ },
+ "source:tests/packed-consumer/tsconfig.http-baseline.json": {
+ "fingerprint": "2b8d1e5386292abd98a887d9d9301473b459f07afa432f7b205f72dc4468a950",
+ "snapshot": {
+ "tests/packed-consumer/tsconfig.http-baseline.json": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/tsconfig.http-baseline.json."
+ ]
+ },
+ "source:tests/packed-consumer/tsconfig.json": {
+ "fingerprint": "b2dc5cd5cfe3037f52b6ea99dafb1e44fc9883618d8185c21f2c4e615d26e774",
+ "snapshot": {
+ "tests/packed-consumer/tsconfig.json": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/tsconfig.json."
+ ]
+ },
+ "source:tests/packed-consumer/tsconfig.openapi.json": {
+ "fingerprint": "8f8116d97024d0a2e05767869a9e233ab1e221d84aff665370f3c06aea3c0048",
+ "snapshot": {
+ "tests/packed-consumer/tsconfig.openapi.json": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/tsconfig.openapi.json."
+ ]
+ },
+ "source:tests/packed-consumer/tsconfig.rpc-baseline.json": {
+ "fingerprint": "cdbbc17ee54aa1ab6ae0ef187a00bd76e81bc26cc75aefcebd4d4d9585d49376",
+ "snapshot": {
+ "tests/packed-consumer/tsconfig.rpc-baseline.json": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/tsconfig.rpc-baseline.json."
+ ]
+ },
+ "source:tests/packed-consumer/tsconfig.svelte-angular.json": {
+ "fingerprint": "21e4f12b9c6e725ca94bffc649c26f5b8a125e343efc9c67ec54ac5b0eb026c3",
+ "snapshot": {
+ "tests/packed-consumer/tsconfig.svelte-angular.json": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/tsconfig.svelte-angular.json."
+ ]
+ },
+ "source:tests/packed-consumer/tsconfig.tanstack-start.json": {
+ "fingerprint": "99299e38f61454d0bf1f46cdbd4b1803bad701672db87f21daf4dadaf0a50e2a",
+ "snapshot": {
+ "tests/packed-consumer/tsconfig.tanstack-start.json": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/tsconfig.tanstack-start.json."
+ ]
+ },
+ "source:tests/packed-consumer/tsconfig.vue-solid.json": {
+ "fingerprint": "e41810781fe3686f468994808ecc088eefde747465d8536a86d51cd460faacd5",
+ "snapshot": {
+ "tests/packed-consumer/tsconfig.vue-solid.json": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/tsconfig.vue-solid.json."
+ ]
+ },
+ "source:tests/packed-consumer/websocket-runtime.mts": {
+ "fingerprint": "772eebcc6b477be6542761906cfbda3a7a6d5784feb37b0bc87fa3dc2e78ef02",
+ "snapshot": {
+ "tests/packed-consumer/websocket-runtime.mts": null
+ },
+ "head": "1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d",
+ "outcome": "no-change",
+ "reason": "This retired installed-consumer runtime, isolated compiler configuration or dedicated packed-host control was deleted under the revised scope. Only uncovered cache/stream/metadata/snapshot and recipe behavior remains in ordinary public-factory/source tests or explicit public compiler fixtures; existing application coverage remains. This maintenance removal does not require an independent skill, and certification claims were removed from the existing guidance.",
+ "evidence": [
+ "Base 1e235b1b5f4e4f6d6d34ce397ad0b573e6c5392d; vp run --no-cache quality passed: 38 files, 283 runtime tests, strict public and server-local fixtures on TS 7.0.2 and TS 5.9.3, native pack/attw/publint, Effect diagnostics and Fallow audits. Both example builds and docs-build passed (44 pages; docs parity and Astro diagnostics). Existing docs-e2e passed 14 Chromium/Firefox tests. Native skills-check validated the owned skill. Native source construction-baseline passed. Logs are under /tmp/effect-api-query-implementation/notes/131-*. No fresh independent consumer session ran for this reference/source-mapping update; retired installation/certification matrices were not repeated. The optional generic skill-creator validator rejected the existing Intent sources frontmatter field; native Intent validation passed and its required schema is preserved. Reviewed item: tests/packed-consumer/websocket-runtime.mts."
+ ]
+ },
+ "source:tests/types/tsconfig.json": {
+ "fingerprint": "55296b76472fc89b595c0e128351e9d78442d16f2ecd2afc05a11e3ae571ee2c",
+ "snapshot": {
+ "tests/types/tsconfig.json": "51166cc8bcc26b942f97c738c0104a4bf866880807763218f2409242c4de4df5"
+ },
+ "head": "8f4723c40f217b9ba82e8247d9147c143782538c",
+ "outcome": "no-change",
+ "reason": "Include TSX documentation fixtures in the existing published-type test seam. This preserves the compiler contract and adds validation for application React setup/recovery; the recommendation lives in the existing framework reference.",
+ "evidence": [
+ "Both published compiler suites passed including docs-react-setup.tsx, docs-suspense.tsx and docs-react-entry.ts."
+ ]
+ },
+ "source:apps/docs/astro.config.mjs": {
+ "fingerprint": "b235762ea71837b6baccbfcaa7064ba8bdf99fc1f45eb6ca6e70b31d209f970e",
+ "snapshot": {
+ "apps/docs/astro.config.mjs": null
+ },
+ "head": "2e4ecf18e93a4ee086d74102c3addb5e2029be56",
+ "outcome": "no-change",
+ "reason": "The authored JavaScript config is removed in favor of astro.config.mts, with the same imports, JSON import attribute, and complete Astro/Starlight configuration. Only the redundant JavaScript ts-check directive disappears. Removing the old path lets installed Astro discover the .mts file; no runtime setting, public API, recipe or support claim changes, so shipped guidance and planning remain accurate.",
+ "evidence": [
+ "Author base 2e4ecf18e93a4ee086d74102c3addb5e2029be56. Rename apps/docs/astro.config.mjs to astro.config.mts, remove ts-check directive, and update only .fallowrc.jsonc ignoreExports path. Installed loader evidence: apps/docs/node_modules/astro/dist/core/config/config.js configPaths contains astro.config.mts.",
+ "vp run format apps/docs/astro.config.mts .fallowrc.jsonc passed. vp run fallow passed entry/production dead-code checks, duplicates task, and health threshold. vp run docs-build passed Astro check with zero errors/warnings/hints and build of 44 pages with valid internal links; unchanged documentation example parity was a native cache hit. Logs: /tmp/effect-api-query-implementation/notes/astro-mts-*.log.",
+ "Read _artifacts/domain_map.yaml, skill_spec.md, and skill_tree.yaml: existing library task/seam/ownership coverage and source globs remain accurate; no library behavior, guidance, dependency or installation change. Native sync changed nothing; review reports no owned skill/planning drift. No new independent consumer or browser execution is needed for this repository config rename."
+ ]
+ },
+ "source:apps/docs/astro.config.mts": {
+ "fingerprint": "e1ae593a08076f6fb1f8983a51a3b0c86481cbaae724a46b4389f4352aaae46c",
+ "snapshot": {
+ "apps/docs/astro.config.mts": "9f435fd3765c6119a92beee7b6cb504eb6594afc8c1b4af018cf8254eb936ffc"
+ },
+ "head": "8f4723c40f217b9ba82e8247d9147c143782538c",
+ "outcome": "updated",
+ "reason": "Navigation now leads with HTTP API and RPC setup/contract/factory/builder choices, then shared Library, native Integrations, complete Examples and shared API Reference. Existing skill pointers were updated for folded React setup, cache consolidation, inference and command examples; no additional skill is needed.",
+ "evidence": [
+ "56-page Astro build and link validation passed; corrected the generated integrations landing slug to integrations.",
+ "All 7 Chromium docs tests passed, covering navigation, search, canonical repository links, icons, registry behavior and generated LLM docs. Collaborative preview confirmed both adapter choices and the RPC route. Firefox/WebKit browser tests could not launch because their executables are not installed."
+ ]
+ },
+ "source:docs/adr/0016-automate-releases-with-changesets.md": {
+ "fingerprint": "6ef98996d907f829fdbb01507863ffb03582e7a4ce75f2739bb5a29f2fac03bf",
+ "snapshot": {
+ "docs/adr/0016-automate-releases-with-changesets.md": "35b5cdc29855b561c502d4bc5de33bbbbdd757ff69be55f13808d24176d5c67e"
+ },
+ "head": "6893603eab70bd9d67e9848414eccc8a3421d870",
+ "outcome": "no-change",
+ "reason": "The ADR distinguishes initial unpublished candidate preparation from post-publication Changesets and preserves main-only trusted publishing. This release decision changes neither public integrations nor the existing framework/host and runtime ownership guidance.",
+ "evidence": [
+ "Reviewed the complete ADR diff from 5b91ddb to 6893603.",
+ "Release run 38085762195 validated and packed the exact 6893603 candidate; publishing and deployment were skipped as intended.",
+ "Current batch: scoped vp run format, native vp run skills-check, and installed YAML parsing passed; vp exec intent maintainer sync reported nothing to synchronize."
+ ]
+ },
+ "source:docs/adr/0017-quarantine-new-dependency-releases-for-seven-days.md": {
+ "fingerprint": "4be5f1ac6db00f4e928006c3e6230947279e5df2ecc5203eb48d4c96a490607a",
+ "snapshot": {
+ "docs/adr/0017-quarantine-new-dependency-releases-for-seven-days.md": "683309834b8c9e15b801ff9a7e640a6facf47a26690765deaf7a5e0a540dcef6"
+ },
+ "head": "6893603eab70bd9d67e9848414eccc8a3421d870",
+ "outcome": "no-change",
+ "reason": "The ADR makes missing publication times fail closed and applies the same strict age policy to isolated consumers and frozen installs. Existing consumer API guidance and qualified dependency versions remain accurate; no new integration task is introduced.",
+ "evidence": [
+ "Reviewed the complete ADR diff from 5b91ddb to 6893603; pnpm-workspace.yaml policy remains unchanged.",
+ "Native eligible Intent 0.5.3 upgrade and isolated Skills CLI 1.7.0 install succeeded under minimumReleaseAge:10080, Strict:true, IgnoreMissingTime:false, trustLockfile:false without exceptions.",
+ "Current batch: scoped vp run format, native vp run skills-check, and installed YAML parsing passed; vp exec intent maintainer sync reported nothing to synchronize."
+ ]
+ },
+ "source:e2e/tanstack-start.spec.ts": {
+ "fingerprint": "326d8bf63a3852af4e5b276be477e3af235569ab15d12ed975e65c1507baed43",
+ "snapshot": {
+ "e2e/tanstack-start.spec.ts": "ea1e5469e782796d5ab68b443b6d21bd460691d413ba15bb83fae5024fd1981e"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed private narrative and assertion commentary while retaining functional tool directives and the existing runtime behavior. The affected example or test continues to use the documented query, ownership and cancellation workflow; no additional skill task is needed.",
+ "evidence": [
+ "Reviewed the actual diff and current source at e2e/tanstack-start.spec.ts against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:e2e/vite-react.spec.ts": {
+ "fingerprint": "cb02aba2d2d073025a375e34532f922c265466c21416ffa95a64a605afdb252e",
+ "snapshot": {
+ "e2e/vite-react.spec.ts": "e730e19cebf8ac11895bff4b466e9882f707666d1417ff6aaaef2df78aa30f64"
+ },
+ "head": "6893603eab70bd9d67e9848414eccc8a3421d870",
+ "outcome": "no-change",
+ "reason": "The pagehide storage-failure case verifies one handled disposal rejection, resource cleanup, and no page error. Existing cache-owner guidance already tells lifecycle callbacks to handle rejected disposal while completing cleanup.",
+ "evidence": [
+ "Reviewed the complete test diff from 5b91ddb to 6893603 against the disposal policy in skills/effect-api-query/references/cache-workflows.md.",
+ "Source 6893603: CI 38085762210 passed source quality, both example builds, documentation, and Chromium/Firefox/WebKit acceptance; saved final-mts-ci.json and final-mts-ci.log."
+ ]
+ },
+ "source:examples/tanstack-start/src/routes/index.tsx": {
+ "fingerprint": "a04a3037d3d997eff9b0aa1ec7c5915f79c7d28dcfbea1588338553b3e41d733",
+ "snapshot": {
+ "examples/tanstack-start/src/routes/index.tsx": "3118b095cfdde95ce04dd63f92a5213007e052d2fa0886ca0966ec0e7d6afcca"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Count loaded users directly across pages without allocating a flattened array; query data, ownership and displayed counts are unchanged, and existing framework guidance remains accurate.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/tanstack-start/src/routes/index.tsx against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/vite-react/src/components/sections/commands-section.tsx": {
+ "fingerprint": "59bb7e6fcf3553d5b5fc3b98b159aef67071397c70ad59892a746f826d74194d",
+ "snapshot": {
+ "examples/vite-react/src/components/sections/commands-section.tsx": "990c75cdfacc4391267e8b25948cddf12a0ae241a5444f02685c8f84a9f2aa39"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "updated",
+ "reason": "Command starts can retry after failed transport and reconcile accepted operations through status polling. The cancellation guide now covers this behavior and same-ID retries.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/vite-react/src/components/sections/commands-section.tsx against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/vite-react/src/components/sections/diagnostics-section.tsx": {
+ "fingerprint": "869448ce3494e402e1b55144b195d6d2c1c6b50fab1229e7e2080c3392a6e8c1",
+ "snapshot": {
+ "examples/vite-react/src/components/sections/diagnostics-section.tsx": "d1ee213fd9ddac0b8f6be014a73bc14451ff71275d2f3c630e559f38462e416b"
+ },
+ "head": "d870776a5f37835467beb611c6ca6a51fe3933eb",
+ "outcome": "no-change",
+ "reason": "Update direct example imports to the shared cancellation module, preserving rendered diagnostics and HTTP routes. Both application runtime suites and builds pass. This wiring adds no new library-consumer workflow and leaves existing guidance accurate.",
+ "evidence": [
+ "Compared the task working tree with d870776a5f37835467beb611c6ca6a51fe3933eb; three independent architecture passes and an additional independent check of the final diff found no remaining actionable findings.",
+ "Full runtime suite passed: 506 tests in 46 files, including 5 new hook-lifetime cases for RPC/HTTP operation isolation, pending status cancellation and post-await retired-owner guards. Independent pass 2 additionally verified 191 snapshot/lifecycle/hash cases.",
+ "Direct vp pack passed declaration emission, attw and publint. Published-contract fixtures passed installed TypeScript 7.0.2 and 5.9.3. Full type-aware lint passed with no errors or warnings; strict Effect diagnostics passed with 0 errors and 0 warnings (one pre-existing suggestion).",
+ "Both example application builds passed. Expanded shared CSS has exactly the original rules for both apps, ignoring whitespace. Documentation snippet and Astro checks passed.",
+ "All four uncached Fallow analyses passed: both dead-code modes have no issues, semantic near-duplicate groups decreased from 67 to 61. Existing workspace-discovery advisory for the explicitly excluded source-only shared examples remains visible.",
+ "The native task supervisor sometimes fails with spawn EBUSY or sandbox process initialization errors; identical installed commands ran directly after completing their package prerequisites. No checks or source rules were bypassed to obtain these results.",
+ "No shipped guidance, activation description or public interface changed. Fresh consumer and discovery sessions were not repeated for this internal refactor; executable published-contract and rendered-application checks provide this batch evidence."
+ ]
+ },
+ "source:examples/vite-react/src/components/sections/http-section.tsx": {
+ "fingerprint": "d7fab68b2be0d629142416ac457ca5e5c0927e93cf3fd1b9f8e07116dd582778",
+ "snapshot": {
+ "examples/vite-react/src/components/sections/http-section.tsx": "a705dee9fd6b87071c37e718d86183e7376690826f085a1e19814a9b1eb14563"
+ },
+ "head": "d870776a5f37835467beb611c6ca6a51fe3933eb",
+ "outcome": "no-change",
+ "reason": "Update direct example imports to the shared cancellation module, preserving rendered diagnostics and HTTP routes. Both application runtime suites and builds pass. This wiring adds no new library-consumer workflow and leaves existing guidance accurate.",
+ "evidence": [
+ "Compared the task working tree with d870776a5f37835467beb611c6ca6a51fe3933eb; three independent architecture passes and an additional independent check of the final diff found no remaining actionable findings.",
+ "Full runtime suite passed: 506 tests in 46 files, including 5 new hook-lifetime cases for RPC/HTTP operation isolation, pending status cancellation and post-await retired-owner guards. Independent pass 2 additionally verified 191 snapshot/lifecycle/hash cases.",
+ "Direct vp pack passed declaration emission, attw and publint. Published-contract fixtures passed installed TypeScript 7.0.2 and 5.9.3. Full type-aware lint passed with no errors or warnings; strict Effect diagnostics passed with 0 errors and 0 warnings (one pre-existing suggestion).",
+ "Both example application builds passed. Expanded shared CSS has exactly the original rules for both apps, ignoring whitespace. Documentation snippet and Astro checks passed.",
+ "All four uncached Fallow analyses passed: both dead-code modes have no issues, semantic near-duplicate groups decreased from 67 to 61. Existing workspace-discovery advisory for the explicitly excluded source-only shared examples remains visible.",
+ "The native task supervisor sometimes fails with spawn EBUSY or sandbox process initialization errors; identical installed commands ran directly after completing their package prerequisites. No checks or source rules were bypassed to obtain these results.",
+ "No shipped guidance, activation description or public interface changed. Fresh consumer and discovery sessions were not repeated for this internal refactor; executable published-contract and rendered-application checks provide this batch evidence."
+ ]
+ },
+ "source:examples/vite-react/src/components/sections/mutations-section.tsx": {
+ "fingerprint": "d8883900b79077c3da3a9567125caa509d1982a184fe0d5c1ccafb5b5514e4e1",
+ "snapshot": {
+ "examples/vite-react/src/components/sections/mutations-section.tsx": "c2bf278014950f0e4a8d66d0cf397811858fae00f8284cb1ed01168c766a7b6a"
+ },
+ "head": "6893603eab70bd9d67e9848414eccc8a3421d870",
+ "outcome": "no-change",
+ "reason": "Seed/reset mutations enter the application tracker while existing application-owned invalidation remains in place. Existing guidance already requires every participating write and reconciliation to follow the owner lifecycle.",
+ "evidence": [
+ "Reviewed the complete component diff from 5b91ddb to 6893603 and skills/effect-api-query/references/cache-workflows.md.",
+ "Source 6893603: CI 38085762210 passed source quality, both example builds, documentation, and Chromium/Firefox/WebKit acceptance; saved final-mts-ci.json and final-mts-ci.log."
+ ]
+ },
+ "source:examples/vite-react/src/components/users/create-user-form.tsx": {
+ "fingerprint": "1768011de182927bc8d5a0341f65f7e323cfccf6f76152578bc25d877a54ded3",
+ "snapshot": {
+ "examples/vite-react/src/components/users/create-user-form.tsx": "1c89f7235da5c16d6a2f3c3dc0bf81d33234a8d65c1e2c687e54255b10017690"
+ },
+ "head": "6893603eab70bd9d67e9848414eccc8a3421d870",
+ "outcome": "no-change",
+ "reason": "Creation delegates to the shared RPC write coordinator instead of invalidating from the form. Existing optimistic-write guidance already assigns entity reservation, commit, rollback, and final reconciliation to application-owned actions.",
+ "evidence": [
+ "Reviewed the complete component diff from 5b91ddb to 6893603 against skills/effect-api-query/references/cache-workflows.md.",
+ "Source 6893603: CI 38085762210 passed source quality, both example builds, documentation, and Chromium/Firefox/WebKit acceptance; saved final-mts-ci.json and final-mts-ci.log."
+ ]
+ },
+ "source:examples/vite-react/src/components/users/user-list.tsx": {
+ "fingerprint": "74b615716653bc7b6ce5ec65939f0e0749bf3a7c470c9635c42878bc7af3d789",
+ "snapshot": {
+ "examples/vite-react/src/components/users/user-list.tsx": "4bff61d9e094f94f720f1351d206bf3d2d31fb9a8c0d0f3cdec904db701c434a"
+ },
+ "head": "6893603eab70bd9d67e9848414eccc8a3421d870",
+ "outcome": "no-change",
+ "reason": "Deletion delegates to the shared RPC write coordinator; pending temporary users display their state and cannot be deleted. Existing guidance already allocates temporary IDs per write and preserves neighboring optimistic entities, with no public API change.",
+ "evidence": [
+ "Reviewed the complete component diff from 5b91ddb to 6893603 against skills/effect-api-query/references/cache-workflows.md.",
+ "Source 6893603: CI 38085762210 passed source quality, both example builds, documentation, and Chromium/Firefox/WebKit acceptance; saved final-mts-ci.json and final-mts-ci.log."
+ ]
+ },
+ "source:examples/vite-react/src/hooks/use-slow-query-cancellation.ts": {
+ "fingerprint": "4379124e7714fde864a91ac03391a2ebb94f8aa1cea77fab0c2b170ea40cc24f",
+ "snapshot": {
+ "examples/vite-react/src/hooks/use-slow-query-cancellation.ts": null
+ },
+ "head": "d870776a5f37835467beb611c6ca6a51fe3933eb",
+ "outcome": "no-change",
+ "reason": "Delete duplicate application hooks in favor of the shared diagnostics-only module. The same start/cancel interface, independent operation IDs and server interruption checks remain; exact per-hook unmount cleanup and post-await owner guards now apply consistently to both applications. The existing shipped cleanup/owner guidance already recommends these rules, so no guidance edit or compatibility wrapper is needed.",
+ "evidence": [
+ "Compared the task working tree with d870776a5f37835467beb611c6ca6a51fe3933eb; three independent architecture passes and an additional independent check of the final diff found no remaining actionable findings.",
+ "Full runtime suite passed: 506 tests in 46 files, including 5 new hook-lifetime cases for RPC/HTTP operation isolation, pending status cancellation and post-await retired-owner guards. Independent pass 2 additionally verified 191 snapshot/lifecycle/hash cases.",
+ "Direct vp pack passed declaration emission, attw and publint. Published-contract fixtures passed installed TypeScript 7.0.2 and 5.9.3. Full type-aware lint passed with no errors or warnings; strict Effect diagnostics passed with 0 errors and 0 warnings (one pre-existing suggestion).",
+ "Both example application builds passed. Expanded shared CSS has exactly the original rules for both apps, ignoring whitespace. Documentation snippet and Astro checks passed.",
+ "All four uncached Fallow analyses passed: both dead-code modes have no issues, semantic near-duplicate groups decreased from 67 to 61. Existing workspace-discovery advisory for the explicitly excluded source-only shared examples remains visible.",
+ "The native task supervisor sometimes fails with spawn EBUSY or sandbox process initialization errors; identical installed commands ran directly after completing their package prerequisites. No checks or source rules were bypassed to obtain these results.",
+ "No shipped guidance, activation description or public interface changed. Fresh consumer and discovery sessions were not repeated for this internal refactor; executable published-contract and rendered-application checks provide this batch evidence."
+ ]
+ },
+ "source:tests/fixtures/tsconfig.server-local.json": {
+ "fingerprint": "3531d0da011912efd6ff745f45fd9407badcf84d19257252d43c3d13679a32aa",
+ "snapshot": {
+ "tests/fixtures/tsconfig.server-local.json": "870aa1b0555c672cc89142854f6f4328dd718272abc78d1efa28a01d878e949f"
+ },
+ "head": "6893603eab70bd9d67e9848414eccc8a3421d870",
+ "outcome": "no-change",
+ "reason": "The added compiler configuration scopes the existing server-local RPC contract fixture under ordinary repository type checks. It changes validation placement without changing an exported type or introducing a consumer recipe.",
+ "evidence": [
+ "Reviewed the seven-line configuration and its server-local RPC/type-contract includes from 5b91ddb to 6893603.",
+ "Source-quality CI 38085762210 ran the native test prerequisite that checks this fixture with both configured TypeScript versions; saved final-mts-ci.log.",
+ "Current batch: scoped vp run format, native vp run skills-check, and installed YAML parsing passed; vp exec intent maintainer sync reported nothing to synchronize."
+ ]
+ },
+ "source:tests/packed-consumer/tsconfig.type-scale.json": {
+ "fingerprint": "ed8ba74d56e70784820e5369ead1b0aea87da056caffeb5e61daeb4c68c55b4d",
+ "snapshot": {
+ "tests/packed-consumer/tsconfig.type-scale.json": null
+ },
+ "head": "6893603eab70bd9d67e9848414eccc8a3421d870",
+ "outcome": "no-change",
+ "reason": "Removing the redundant packed-consumer compiler configuration leaves type-scale coverage in ordinary repository fixtures. Existing guidance already bounds measurements to their fixtures and makes no installed-consumer budget claim.",
+ "evidence": [
+ "Reviewed the deleted configuration from 5b91ddb to 6893603 and the retained tests/types fixtures plus _artifacts/skill_spec.md measurement boundary.",
+ "Source 6893603: CI 38085762210 passed source quality, both example builds, documentation, and Chromium/Firefox/WebKit acceptance; saved final-mts-ci.json and final-mts-ci.log.",
+ "Current batch: scoped vp run format, native vp run skills-check, and installed YAML parsing passed; vp exec intent maintainer sync reported nothing to synchronize."
+ ]
+ },
+ "source:examples/vite-react/src/components/ui/effect-error-details.tsx": {
+ "fingerprint": "82dda7c7b3d779819cd09ae80a8ac64320f96db657f3ec5a1fd41838dd7ca064",
+ "snapshot": {
+ "examples/vite-react/src/components/ui/effect-error-details.tsx": "da7e89579ebd7bc6d56d4dde19ea871673f6f441452d9ba6786e41956be66a1f"
+ },
+ "head": "bf38d8556744d8e45d459208cab6fe9d1b78b356",
+ "outcome": "no-change",
+ "reason": "A private class-name constant replaces two identical alert style strings; rendered error labels, Cause detail and alert semantics are unchanged. This presentation-only deduplication does not change any developer integration task or shipped guidance.",
+ "evidence": [
+ "Reviewed both render branches and their bf38d855 diff. Final uncached typecheck passes 140 files; scoped formatting passed. No application-wide UI sharing or dependency change."
+ ]
+ },
+ "source:apps/docs/public/package-version.js": {
+ "fingerprint": "22bfa3892fa1b85ae21f2c484fa190b10dd35556e9a47ed5b39eb8c6d3bcd551",
+ "snapshot": {
+ "apps/docs/public/package-version.js": "f88677a24f7a65061aa41cabde4f6727a9f4c52adfac5ac4fde2b478909c3dc0"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed fallback implementation commentary; a failed registry request still retains the build version. Chromium covers unpublished, failed and invalid responses, so existing user-facing guidance remains accurate.",
+ "evidence": [
+ "Reviewed the actual diff and current source at apps/docs/public/package-version.js against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:docs/adr/0013-use-a-vite-plus-workspace-with-a-root-package.md": {
+ "fingerprint": "c18a01558cba99c73dd6bbc8381e3243a4a2f324069d47f6217c11a424cd615e",
+ "snapshot": {
+ "docs/adr/0013-use-a-vite-plus-workspace-with-a-root-package.md": "7617802c14fd07b0e147f8168381285b078eb752fbf9981848cbfe86e1f7792a"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed obsolete beta and editor-detail wording while preserving the native Vite+ workspace decision; no consumer instruction changes.",
+ "evidence": [
+ "Reviewed the actual diff and current source at docs/adr/0013-use-a-vite-plus-workspace-with-a-root-package.md against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:e2e-docs/docs.spec.ts": {
+ "fingerprint": "1bb9637253ced30e78b9e2530a30af302dded927e1cc35c2ec2680f745b889a8",
+ "snapshot": {
+ "e2e-docs/docs.spec.ts": "b07fcf2f43cd972a823ff6f8c564a595f57af84e057326b72262e4e169f677cb"
+ },
+ "head": "8f4723c40f217b9ba82e8247d9147c143782538c",
+ "outcome": "no-change",
+ "reason": "The repository browser test follows the revised HTTP API/RPC entry actions and navigates generated sidebar links, including policies, inference and React setup. Its old compiler-fixture prerequisite link assertion was removed because ready-client setup is now shown directly in the docs; this adds validation rather than a shipped developer task.",
+ "evidence": [
+ "All 7 Chromium docs tests passed against the Astro preview; both generated LLM documents resolve their internal links. Type-aware lint and formatting passed."
+ ]
+ },
+ "source:e2e/conditional-query.spec.ts": {
+ "fingerprint": "6f0ab418799c94ae6ba540a6e12ca8a3115a5335418ee92b73af61b68e64798c",
+ "snapshot": {
+ "e2e/conditional-query.spec.ts": "cbcf8bd4084cada24635c7839a5bdf83e59115ad1175134d5d65eb37f0dcffa4"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed private narrative and assertion commentary while retaining functional tool directives and the existing runtime behavior. The affected example or test continues to use the documented query, ownership and cancellation workflow; no additional skill task is needed.",
+ "evidence": [
+ "Reviewed the actual diff and current source at e2e/conditional-query.spec.ts against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:e2e/example-application.ts": {
+ "fingerprint": "7aa0cef9f7e89bc6264535884d5e3d1bcd4bafdd701b3d78124768b1cd82f262",
+ "snapshot": {
+ "e2e/example-application.ts": "3ce3024b409c7c28e9e159fce2b724009dd846fbe6fba75ef3d7ab95dc507e99"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed private narrative and assertion commentary while retaining functional tool directives and the existing runtime behavior. The affected example or test continues to use the documented query, ownership and cancellation workflow; no additional skill task is needed.",
+ "evidence": [
+ "Reviewed the actual diff and current source at e2e/example-application.ts against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/contracts/src/client.ts": {
+ "fingerprint": "edb8d760d8523f285a099edd65375f23a0bcab7321cddef564acd58d89f43241",
+ "snapshot": {
+ "examples/contracts/src/client.ts": "f645f690571d6f8d571ec8496607778c423fbc4b45848bf3cf725739e981953e"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed private narrative and assertion commentary while retaining functional tool directives and the existing runtime behavior. The affected example or test continues to use the documented query, ownership and cancellation workflow; no additional skill task is needed.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/contracts/src/client.ts against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/contracts/src/contracts.ts": {
+ "fingerprint": "347cc797a64e13c1476d2f2aaa027a5a23f6ea56d9695b88750fe83b1c3c5ed9",
+ "snapshot": {
+ "examples/contracts/src/contracts.ts": "11ba2f683cfeaa16947864a12c3bccc96104dbe0f6139efcd81e6fc865482641"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "RPC pagination now enforces the same integer cursor and 1..100 page-size bounds as the HTTP example. Existing ready-client/query-pattern guidance remains sufficient; server-local regression tests cover rejection.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/contracts/src/contracts.ts against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/tanstack-start/src/components/action-button.tsx": {
+ "fingerprint": "d0b70e406fe9c1eadf6da4c873a867c67dd0704778b0025afe2570fe957053e6",
+ "snapshot": {
+ "examples/tanstack-start/src/components/action-button.tsx": "79c37de2669992148e645a70f1b783a1dd7d85ac8e5a9ec267843550eafd3926"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed private narrative and assertion commentary while retaining functional tool directives and the existing runtime behavior. The affected example or test continues to use the documented query, ownership and cancellation workflow; no additional skill task is needed.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/tanstack-start/src/components/action-button.tsx against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/tanstack-start/src/components/navigation-link.tsx": {
+ "fingerprint": "b54ce1620db2d94ed8d2f71f4900c2d8c17985ccca14093d9f419a353f67bd13",
+ "snapshot": {
+ "examples/tanstack-start/src/components/navigation-link.tsx": "a7d037126c9a648b3aa20ecb8af5f416982522f9da5703460b141bfb53124cf3"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed private narrative and assertion commentary while retaining functional tool directives and the existing runtime behavior. The affected example or test continues to use the documented query, ownership and cancellation workflow; no additional skill task is needed.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/tanstack-start/src/components/navigation-link.tsx against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/tanstack-start/src/components/router-status.tsx": {
+ "fingerprint": "0fd4520270cc3cdedb23abb639bf655c538744fc11ae2ca2771b4b81b6025a3a",
+ "snapshot": {
+ "examples/tanstack-start/src/components/router-status.tsx": "6e9b8fb3bcd3397aa1d447d12f000b264b214463327ac03319dd59d6f229e99d"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Loading queries labels both RPC and HTTP work accurately. This UI text change adds no developer task or skill requirement.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/tanstack-start/src/components/router-status.tsx against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/tanstack-start/src/hooks/use-slow-query-cancellation.ts": {
+ "fingerprint": "3bbf99d591efe71685bdfc68588e0762578ad051fb61d3aca180de3a8b0ae67c",
+ "snapshot": {
+ "examples/tanstack-start/src/hooks/use-slow-query-cancellation.ts": null
+ },
+ "head": "d870776a5f37835467beb611c6ca6a51fe3933eb",
+ "outcome": "no-change",
+ "reason": "Delete duplicate application hooks in favor of the shared diagnostics-only module. The same start/cancel interface, independent operation IDs and server interruption checks remain; exact per-hook unmount cleanup and post-await owner guards now apply consistently to both applications. The existing shipped cleanup/owner guidance already recommends these rules, so no guidance edit or compatibility wrapper is needed.",
+ "evidence": [
+ "Compared the task working tree with d870776a5f37835467beb611c6ca6a51fe3933eb; three independent architecture passes and an additional independent check of the final diff found no remaining actionable findings.",
+ "Full runtime suite passed: 506 tests in 46 files, including 5 new hook-lifetime cases for RPC/HTTP operation isolation, pending status cancellation and post-await retired-owner guards. Independent pass 2 additionally verified 191 snapshot/lifecycle/hash cases.",
+ "Direct vp pack passed declaration emission, attw and publint. Published-contract fixtures passed installed TypeScript 7.0.2 and 5.9.3. Full type-aware lint passed with no errors or warnings; strict Effect diagnostics passed with 0 errors and 0 warnings (one pre-existing suggestion).",
+ "Both example application builds passed. Expanded shared CSS has exactly the original rules for both apps, ignoring whitespace. Documentation snippet and Astro checks passed.",
+ "All four uncached Fallow analyses passed: both dead-code modes have no issues, semantic near-duplicate groups decreased from 67 to 61. Existing workspace-discovery advisory for the explicitly excluded source-only shared examples remains visible.",
+ "The native task supervisor sometimes fails with spawn EBUSY or sandbox process initialization errors; identical installed commands ran directly after completing their package prerequisites. No checks or source rules were bypassed to obtain these results.",
+ "No shipped guidance, activation description or public interface changed. Fresh consumer and discovery sessions were not repeated for this internal refactor; executable published-contract and rendered-application checks provide this batch evidence."
+ ]
+ },
+ "source:examples/tanstack-start/src/routes/failure.tsx": {
+ "fingerprint": "5df8fdee6f55e2b69313237e1cadae26ec40dd05eff106d23fc0ef2752679c6b",
+ "snapshot": {
+ "examples/tanstack-start/src/routes/failure.tsx": "690a26c3ef52a28f5c89617a385de23d920840b591ea3b22f060673dd0d262d6"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed private narrative and assertion commentary while retaining functional tool directives and the existing runtime behavior. The affected example or test continues to use the documented query, ownership and cancellation workflow; no additional skill task is needed.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/tanstack-start/src/routes/failure.tsx against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/tanstack-start/src/routes/http-failure.tsx": {
+ "fingerprint": "5947742b2cc9d79e14228e7429d5ecc9dd71963448c8fec0e4bd0978705767d9",
+ "snapshot": {
+ "examples/tanstack-start/src/routes/http-failure.tsx": "a7ade1d3bd9973903ab7e49461f82cdf413766e3ff1c194a50be21423b5e2de1"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed private narrative and assertion commentary while retaining functional tool directives and the existing runtime behavior. The affected example or test continues to use the documented query, ownership and cancellation workflow; no additional skill task is needed.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/tanstack-start/src/routes/http-failure.tsx against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/tanstack-start/src/routes/http.tsx": {
+ "fingerprint": "5bf6d229917158997ecae159648fa740b1183ca537bd7eaefa005ef7c806805e",
+ "snapshot": {
+ "examples/tanstack-start/src/routes/http.tsx": "af8b13103d7813a8143db021731e232fb8078170b573eb5fccbbe03c79e61480"
+ },
+ "head": "d870776a5f37835467beb611c6ca6a51fe3933eb",
+ "outcome": "no-change",
+ "reason": "Update direct example imports to the shared cancellation module, preserving rendered diagnostics and HTTP routes. Both application runtime suites and builds pass. This wiring adds no new library-consumer workflow and leaves existing guidance accurate.",
+ "evidence": [
+ "Compared the task working tree with d870776a5f37835467beb611c6ca6a51fe3933eb; three independent architecture passes and an additional independent check of the final diff found no remaining actionable findings.",
+ "Full runtime suite passed: 506 tests in 46 files, including 5 new hook-lifetime cases for RPC/HTTP operation isolation, pending status cancellation and post-await retired-owner guards. Independent pass 2 additionally verified 191 snapshot/lifecycle/hash cases.",
+ "Direct vp pack passed declaration emission, attw and publint. Published-contract fixtures passed installed TypeScript 7.0.2 and 5.9.3. Full type-aware lint passed with no errors or warnings; strict Effect diagnostics passed with 0 errors and 0 warnings (one pre-existing suggestion).",
+ "Both example application builds passed. Expanded shared CSS has exactly the original rules for both apps, ignoring whitespace. Documentation snippet and Astro checks passed.",
+ "All four uncached Fallow analyses passed: both dead-code modes have no issues, semantic near-duplicate groups decreased from 67 to 61. Existing workspace-discovery advisory for the explicitly excluded source-only shared examples remains visible.",
+ "The native task supervisor sometimes fails with spawn EBUSY or sandbox process initialization errors; identical installed commands ran directly after completing their package prerequisites. No checks or source rules were bypassed to obtain these results.",
+ "No shipped guidance, activation description or public interface changed. Fresh consumer and discovery sessions were not repeated for this internal refactor; executable published-contract and rendered-application checks provide this batch evidence."
+ ]
+ },
+ "source:examples/tanstack-start/src/styles.css": {
+ "fingerprint": "e175f79bb10f4c0e3e2625dd8785537b1f1ffe8f43318559c0519bc4f457290d",
+ "snapshot": {
+ "examples/tanstack-start/src/styles.css": "7bca484171da0b685a1af733ae15669004e5adbde4bc8073d07faea65da103ee"
+ },
+ "head": "d870776a5f37835467beb611c6ca6a51fe3933eb",
+ "outcome": "no-change",
+ "reason": "Move identical example theme declarations to examples/shared/theme.css while retaining Tailwind imports at both original entries and the Vite-specific grid locally. Expanded CSS preserves the original rules exactly and both builds pass. This is private example presentation reuse, with no query-library guidance or public-interface change.",
+ "evidence": [
+ "Compared the task working tree with d870776a5f37835467beb611c6ca6a51fe3933eb; three independent architecture passes and an additional independent check of the final diff found no remaining actionable findings.",
+ "Full runtime suite passed: 506 tests in 46 files, including 5 new hook-lifetime cases for RPC/HTTP operation isolation, pending status cancellation and post-await retired-owner guards. Independent pass 2 additionally verified 191 snapshot/lifecycle/hash cases.",
+ "Direct vp pack passed declaration emission, attw and publint. Published-contract fixtures passed installed TypeScript 7.0.2 and 5.9.3. Full type-aware lint passed with no errors or warnings; strict Effect diagnostics passed with 0 errors and 0 warnings (one pre-existing suggestion).",
+ "Both example application builds passed. Expanded shared CSS has exactly the original rules for both apps, ignoring whitespace. Documentation snippet and Astro checks passed.",
+ "All four uncached Fallow analyses passed: both dead-code modes have no issues, semantic near-duplicate groups decreased from 67 to 61. Existing workspace-discovery advisory for the explicitly excluded source-only shared examples remains visible.",
+ "The native task supervisor sometimes fails with spawn EBUSY or sandbox process initialization errors; identical installed commands ran directly after completing their package prerequisites. No checks or source rules were bypassed to obtain these results.",
+ "No shipped guidance, activation description or public interface changed. Fresh consumer and discovery sessions were not repeated for this internal refactor; executable published-contract and rendered-application checks provide this batch evidence."
+ ]
+ },
+ "source:examples/tanstack-start/vite.config.ts": {
+ "fingerprint": "c2f207176f82c378faf65195877ae337a8c4ed7b0d62ba4eb16356327e8766e8",
+ "snapshot": {
+ "examples/tanstack-start/vite.config.ts": "e33ed6de04e21fd8b43f95e2a29fdf5adae9007b24faf307ac85b5f51fbb4180"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed private narrative and assertion commentary while retaining functional tool directives and the existing runtime behavior. The affected example or test continues to use the documented query, ownership and cancellation workflow; no additional skill task is needed.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/tanstack-start/vite.config.ts against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/vite-react/src/components/sections/queries-section.tsx": {
+ "fingerprint": "6a00123ad89af1b93a07f046f5e3a8d06c9232996dfe15038468201d5d556064",
+ "snapshot": {
+ "examples/vite-react/src/components/sections/queries-section.tsx": "2f6d771e217f415d570a4483e44a398b49f3a1fb0afae7f7a9caebc8c6a2d41d"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Count loaded users directly across pages without allocating a flattened array; query data, ownership and displayed counts are unchanged, and existing framework guidance remains accurate.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/vite-react/src/components/sections/queries-section.tsx against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/vite-react/src/components/ui/action-button.tsx": {
+ "fingerprint": "1b0278c83a2efe4939ff4f81fb4cf741e3e65a0b5316df77dd14d7872b5df4f8",
+ "snapshot": {
+ "examples/vite-react/src/components/ui/action-button.tsx": "bdacb6e84d72e4e454c5a0062355a53062db3ebeb56873eb8bd5f5b7b0766fbf"
+ },
+ "head": "54b6521f3e37f9cb3ca4cd3812ab3c960eb2168a",
+ "outcome": "no-change",
+ "reason": "Removed private narrative and assertion commentary while retaining functional tool directives and the existing runtime behavior. The affected example or test continues to use the documented query, ownership and cancellation workflow; no additional skill task is needed.",
+ "evidence": [
+ "Reviewed the actual diff and current source at examples/vite-react/src/components/ui/action-button.tsx against 54b6521 and the supplied PR base; relevant native task receipts are under /tmp/effect-api-query-audit-2026-10-11/.",
+ "Final uncached native tasks passed: typecheck (142 files), Effect diagnostics (162 files, zero errors/warnings), Fallow, test (41 files / 474 runtime cases), public API and server-local fixtures with TypeScript 7.0.2 and 5.9.3, native pack with attw/publint, both example builds, docs-check and 46-page docs-build with internal links. Chromium passed all 31 application and 7 documentation checks. Firefox/WebKit browser launches are unavailable locally because their installed binaries are missing; their HTTP-only documentation checks passed. Fresh installed-consumer activation/task evaluation was not performed; compiler and application evidence comes from this workspace."
+ ]
+ },
+ "source:examples/vite-react/src/styles/tailwind.css": {
+ "fingerprint": "ef9ab398e901958bc40a3dc2b73bd4f529b6066580714f8a61123aed96b2c9a3",
+ "snapshot": {
+ "examples/vite-react/src/styles/tailwind.css": "51c4b3e6464deaf25b330dc651ab0b6a6ba277bc660cc45f128e1461eeb8daaa"
+ },
+ "head": "d870776a5f37835467beb611c6ca6a51fe3933eb",
+ "outcome": "no-change",
+ "reason": "Move identical example theme declarations to examples/shared/theme.css while retaining Tailwind imports at both original entries and the Vite-specific grid locally. Expanded CSS preserves the original rules exactly and both builds pass. This is private example presentation reuse, with no query-library guidance or public-interface change.",
+ "evidence": [
+ "Compared the task working tree with d870776a5f37835467beb611c6ca6a51fe3933eb; three independent architecture passes and an additional independent check of the final diff found no remaining actionable findings.",
+ "Full runtime suite passed: 506 tests in 46 files, including 5 new hook-lifetime cases for RPC/HTTP operation isolation, pending status cancellation and post-await retired-owner guards. Independent pass 2 additionally verified 191 snapshot/lifecycle/hash cases.",
+ "Direct vp pack passed declaration emission, attw and publint. Published-contract fixtures passed installed TypeScript 7.0.2 and 5.9.3. Full type-aware lint passed with no errors or warnings; strict Effect diagnostics passed with 0 errors and 0 warnings (one pre-existing suggestion).",
+ "Both example application builds passed. Expanded shared CSS has exactly the original rules for both apps, ignoring whitespace. Documentation snippet and Astro checks passed.",
+ "All four uncached Fallow analyses passed: both dead-code modes have no issues, semantic near-duplicate groups decreased from 67 to 61. Existing workspace-discovery advisory for the explicitly excluded source-only shared examples remains visible.",
+ "The native task supervisor sometimes fails with spawn EBUSY or sandbox process initialization errors; identical installed commands ran directly after completing their package prerequisites. No checks or source rules were bypassed to obtain these results.",
+ "No shipped guidance, activation description or public interface changed. Fresh consumer and discovery sessions were not repeated for this internal refactor; executable published-contract and rendered-application checks provide this batch evidence."
+ ]
+ },
+ "source:.github/actions/setup-repository/action.yml": {
+ "fingerprint": "ed0796c080ab8de729e657ad263c3df80c8170cac6ade354db92d97d5f85a4b8",
+ "snapshot": {
+ ".github/actions/setup-repository/action.yml": "1e48c3997b540b68b47e4dc5ef7bdb0ab6c9b19adc307f5a0a1280bef08a1fae"
+ },
+ "head": "f3ba2a62cdb0b28eaa6e592b010bb6879466cda2",
+ "outcome": "no-change",
+ "reason": "The shared setup still provisions the pinned pnpm executable and runs one frozen workspace install. Every caller uses dependency caching, so the unused cache switch was removed. This changes repository provisioning only.",
+ "evidence": [
+ "Diff reviewed against f3ba2a62cdb0b28eaa6e592b010bb6879466cda2; actual PR base 5b91ddb1de13970365669c887b9d767ea417fbd4. Public library source, compiler fixtures, runtime cases, README, documentation pages and skills were not changed in this batch.",
+ "Native uncached typecheck passed 141 files and native pack attw/publint. Scoped native format passed seven affected configuration files; final YAML parsed and browser/trigger/publication prerequisite expressions were inspected.",
+ "Four existing application Chromium acceptance cases and all seven existing documentation Chromium cases passed against prepared outputs. Their preview logs contain no pack or build invocation. Hosted docs Playwright list mode listed seven cases without building a local site. Receipts: /tmp/effect-api-query-ci-audit/.",
+ "All three shared planning documents were read: _artifacts/domain_map.yaml retains the same ten consumer tasks/failure modes, _artifacts/skill_spec.md retains accurate source-backed coverage and boundaries, and _artifacts/skill_tree.yaml retains the same owned skill, six references, source mappings, prerequisites and distribution. CI-only orchestration requires no guidance or planning rewrite.",
+ "The first hosted run of artifact reuse and the reusable release/deployment workflows remains unverified locally. No package publication or Pages deployment was performed."
+ ]
+ },
+ "source:.github/workflows/deploy-docs.yml": {
+ "fingerprint": "b23c6bf5ef73b244b420516cd31b713672423d7d342472ca4e90e3570a3bec41",
+ "snapshot": {
+ ".github/workflows/deploy-docs.yml": "ab245e4f9057e32a15906f0202c4264842da05a1f44fa9c6969d59e70b97b31a"
+ },
+ "head": "f3ba2a62cdb0b28eaa6e592b010bb6879466cda2",
+ "outcome": "no-change",
+ "reason": "A release restores the same validated documentation site from its current workflow run. Standalone manual deployment retains checkout, native docs checks and build. The site contents and library guidance are unchanged.",
+ "evidence": [
+ "Diff reviewed against f3ba2a62cdb0b28eaa6e592b010bb6879466cda2; actual PR base 5b91ddb1de13970365669c887b9d767ea417fbd4. Public library source, compiler fixtures, runtime cases, README, documentation pages and skills were not changed in this batch.",
+ "Native uncached typecheck passed 141 files and native pack attw/publint. Scoped native format passed seven affected configuration files; final YAML parsed and browser/trigger/publication prerequisite expressions were inspected.",
+ "Four existing application Chromium acceptance cases and all seven existing documentation Chromium cases passed against prepared outputs. Their preview logs contain no pack or build invocation. Hosted docs Playwright list mode listed seven cases without building a local site. Receipts: /tmp/effect-api-query-ci-audit/.",
+ "All three shared planning documents were read: _artifacts/domain_map.yaml retains the same ten consumer tasks/failure modes, _artifacts/skill_spec.md retains accurate source-backed coverage and boundaries, and _artifacts/skill_tree.yaml retains the same owned skill, six references, source mappings, prerequisites and distribution. CI-only orchestration requires no guidance or planning rewrite.",
+ "The first hosted run of artifact reuse and the reusable release/deployment workflows remains unverified locally. No package publication or Pages deployment was performed."
+ ]
+ },
+ "source:playwright.config.ts": {
+ "fingerprint": "0acc85c38e3fdfd4e5887ca39bc139a54cdbee979d61aefd21b66d3780b5d1f9",
+ "snapshot": {
+ "playwright.config.ts": "fe31f0f28ff40bd607e7b39b71426dd91ad1c51121bd2bed018bd7b83675b614"
+ },
+ "head": "f3ba2a62cdb0b28eaa6e592b010bb6879466cda2",
+ "outcome": "no-change",
+ "reason": "Application previews serve prepared outputs. Native browser tasks own their build prerequisites; CI skips them only after successful current-run artifact restoration. Existing acceptance cases and tested application behavior are unchanged.",
+ "evidence": [
+ "Diff reviewed against f3ba2a62cdb0b28eaa6e592b010bb6879466cda2; actual PR base 5b91ddb1de13970365669c887b9d767ea417fbd4. Public library source, compiler fixtures, runtime cases, README, documentation pages and skills were not changed in this batch.",
+ "Native uncached typecheck passed 141 files and native pack attw/publint. Scoped native format passed seven affected configuration files; final YAML parsed and browser/trigger/publication prerequisite expressions were inspected.",
+ "Four existing application Chromium acceptance cases and all seven existing documentation Chromium cases passed against prepared outputs. Their preview logs contain no pack or build invocation. Hosted docs Playwright list mode listed seven cases without building a local site. Receipts: /tmp/effect-api-query-ci-audit/.",
+ "All three shared planning documents were read: _artifacts/domain_map.yaml retains the same ten consumer tasks/failure modes, _artifacts/skill_spec.md retains accurate source-backed coverage and boundaries, and _artifacts/skill_tree.yaml retains the same owned skill, six references, source mappings, prerequisites and distribution. CI-only orchestration requires no guidance or planning rewrite.",
+ "The first hosted run of artifact reuse and the reusable release/deployment workflows remains unverified locally. No package publication or Pages deployment was performed."
+ ]
+ },
+ "source:examples/shared/theme.css": {
+ "fingerprint": "8d029321671dc85cbf712e9165c283c5bd8a1b9835174d8c79023453c07681f0",
+ "snapshot": {
+ "examples/shared/theme.css": "b48a2896fe934311ef529e62ee4a90e7c59e9e6202f6ee2bb571fd0e2fbab8eb"
+ },
+ "head": "d870776a5f37835467beb611c6ca6a51fe3933eb",
+ "outcome": "no-change",
+ "reason": "Move identical example theme declarations to examples/shared/theme.css while retaining Tailwind imports at both original entries and the Vite-specific grid locally. Expanded CSS preserves the original rules exactly and both builds pass. This is private example presentation reuse, with no query-library guidance or public-interface change.",
+ "evidence": [
+ "Compared the task working tree with d870776a5f37835467beb611c6ca6a51fe3933eb; three independent architecture passes and an additional independent check of the final diff found no remaining actionable findings.",
+ "Full runtime suite passed: 506 tests in 46 files, including 5 new hook-lifetime cases for RPC/HTTP operation isolation, pending status cancellation and post-await retired-owner guards. Independent pass 2 additionally verified 191 snapshot/lifecycle/hash cases.",
+ "Direct vp pack passed declaration emission, attw and publint. Published-contract fixtures passed installed TypeScript 7.0.2 and 5.9.3. Full type-aware lint passed with no errors or warnings; strict Effect diagnostics passed with 0 errors and 0 warnings (one pre-existing suggestion).",
+ "Both example application builds passed. Expanded shared CSS has exactly the original rules for both apps, ignoring whitespace. Documentation snippet and Astro checks passed.",
+ "All four uncached Fallow analyses passed: both dead-code modes have no issues, semantic near-duplicate groups decreased from 67 to 61. Existing workspace-discovery advisory for the explicitly excluded source-only shared examples remains visible.",
+ "The native task supervisor sometimes fails with spawn EBUSY or sandbox process initialization errors; identical installed commands ran directly after completing their package prerequisites. No checks or source rules were bypassed to obtain these results.",
+ "No shipped guidance, activation description or public interface changed. Fresh consumer and discovery sessions were not repeated for this internal refactor; executable published-contract and rendered-application checks provide this batch evidence."
+ ]
+ },
+ "source:examples/tanstack-start/src/routes/diagnostics.tsx": {
+ "fingerprint": "d7df381eb6eb247f0cfc9940181740b6fb1691dc94f4d93d2f6f1084aa4ecaf4",
+ "snapshot": {
+ "examples/tanstack-start/src/routes/diagnostics.tsx": "76e54e5f6834b75fd47f3f751414782daa5a9d5eb0472c0b466b8fb133418bc3"
+ },
+ "head": "d870776a5f37835467beb611c6ca6a51fe3933eb",
+ "outcome": "no-change",
+ "reason": "Update direct example imports to the shared cancellation module, preserving rendered diagnostics and HTTP routes. Both application runtime suites and builds pass. This wiring adds no new library-consumer workflow and leaves existing guidance accurate.",
+ "evidence": [
+ "Compared the task working tree with d870776a5f37835467beb611c6ca6a51fe3933eb; three independent architecture passes and an additional independent check of the final diff found no remaining actionable findings.",
+ "Full runtime suite passed: 506 tests in 46 files, including 5 new hook-lifetime cases for RPC/HTTP operation isolation, pending status cancellation and post-await retired-owner guards. Independent pass 2 additionally verified 191 snapshot/lifecycle/hash cases.",
+ "Direct vp pack passed declaration emission, attw and publint. Published-contract fixtures passed installed TypeScript 7.0.2 and 5.9.3. Full type-aware lint passed with no errors or warnings; strict Effect diagnostics passed with 0 errors and 0 warnings (one pre-existing suggestion).",
+ "Both example application builds passed. Expanded shared CSS has exactly the original rules for both apps, ignoring whitespace. Documentation snippet and Astro checks passed.",
+ "All four uncached Fallow analyses passed: both dead-code modes have no issues, semantic near-duplicate groups decreased from 67 to 61. Existing workspace-discovery advisory for the explicitly excluded source-only shared examples remains visible.",
+ "The native task supervisor sometimes fails with spawn EBUSY or sandbox process initialization errors; identical installed commands ran directly after completing their package prerequisites. No checks or source rules were bypassed to obtain these results.",
+ "No shipped guidance, activation description or public interface changed. Fresh consumer and discovery sessions were not repeated for this internal refactor; executable published-contract and rendered-application checks provide this batch evidence."
+ ]
+ }
+ }
+}
diff --git a/AGENTS.md b/AGENTS.md
index 9767767..b157251 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,5 +1,16 @@
## Agent skills
+### Shipped library skill
+
+When changing public behavior, usage documentation, or shipped guidance, run
+`vp exec intent meta generate-skill` and follow the installed maintenance procedure.
+Read the shared [planning record](_artifacts/skill_spec.md); maintain its domain map
+and skill tree alongside the affected guidance. Run `vp exec intent maintainer sync`,
+review actual source changes with `vp exec intent maintainer review --json`, and
+record justified outcomes for the owned skill, planning, and source items after
+task checks. Leave unrelated skills unresolved. Run `vp exec intent maintainer check`,
+report pending work, and finish with `vp run skills-check`.
+
### Issue tracker
Before reading or updating GitHub issues, read [the issue tracker workflow](docs/agents/issue-tracker.md).
diff --git a/GLOSSARY.md b/GLOSSARY.md
index e2cdf9d..a273b0b 100644
--- a/GLOSSARY.md
+++ b/GLOSSARY.md
@@ -9,21 +9,25 @@ A nested object derived from literal Effect RPC tags. Branches represent RPC nam
_Avoid_: Router, generated client
**HTTP utility tree**:
-A nested object derived from an Effect HttpApi's literal group and endpoint identifiers. Supported buffered endpoints provide typed key and option builders, with multipart endpoints limited to mutations; endpoints in top-level groups appear at the root.
+A nested object derived from an Effect HttpApi's literal group and endpoint identifiers. Supported buffered and SSE endpoints provide typed key and option builders, with multipart endpoints limited to buffered mutations; endpoints in top-level groups appear at the root.
_Avoid_: RPC utility tree, generated client
**Query data**:
-The successful decoded RPC or HTTP value presented to TanStack Query. Buffered queries convert successful `undefined` to `null`; streamed values and mutation data remain unchanged.
+The successful decoded RPC or HTTP value presented to TanStack Query. Buffered queries and live queries convert successful `undefined` to `null`; accumulated stream elements and mutation data remain unchanged.
_Avoid_: RPC success value when it is `undefined`
**Accumulated streamed query**:
-A streaming RPC view that caches emitted values in order, optionally retaining only a bounded recent history. Refetches may reset, append to, or replace the cached sequence.
+A streaming RPC or HTTP SSE view that caches emitted values in order, optionally retaining only a bounded recent history. Refetches may reset, append to, or replace the cached sequence.
_Avoid_: Live query, infinite query
**Live query**:
-A streaming RPC view that caches only the latest emitted value. Stream completion preserves that value; completion before the first emission produces a package error.
+A streaming RPC or HTTP SSE view that caches only the latest emitted value, converting `undefined` to `null`. Stream completion preserves that value; completion before the first emission produces a package error.
_Avoid_: Accumulated streamed query, subscription
+**HTTP metadata view**:
+A buffered HTTP query view containing decoded query data and an immutable snapshot of the response status and raw string headers. Declared decoded header wrappers remain part of its data.
+_Avoid_: Raw response, header-wrapped success
+
## Payloads and keys
**HTTP request input**:
@@ -73,7 +77,7 @@ An `Error` produced when an HTTP Effect returns a failed `Exit`. It identifies t
_Avoid_: Sanitized Cause, configuration error
**Configuration error**:
-A synchronous error that rejects invalid configuration for a utility tree or its option builders.
+An error that rejects invalid utility configuration during preparation or execution.
_Avoid_: RPC execution error
**Key-generation error**:
diff --git a/README.md b/README.md
index 750d3ef..f2cb07f 100644
--- a/README.md
+++ b/README.md
@@ -1,92 +1,121 @@
# effect-api-query
-Use Effect RPC and HttpApi with typed TanStack Query options and semantic cache keys.
-
-Create utilities from your API definition and a ready client, then pass their options directly to
-TanStack Query. Your application controls the client lifetime, cache policies, and framework setup.
+Derive typed TanStack Query options and cache keys from your Effect RPC and HttpApi contracts.
+Pass the generated options to QueryClient or your framework's Query hooks. Inputs and results
+follow the contract; your application controls transport, client lifetime, and cache policy.
## Install
+Install the package and TanStack Query Core:
+
```sh
pnpm add effect-api-query @tanstack/query-core
```
-With automatic peer installation enabled, pnpm installs the exact Effect version declared by the
-package. Use TypeScript 5.9 or newer with `strict: true`. The package requires ESM and ES2022 support.
-Before upgrading, review [compatibility and stability](https://ueberbrot.github.io/effect-api-query/getting-started/compatibility-and-stability/).
+The package pins one exact Effect 4 release because its RPC and HTTP API modules are unstable.
+With automatic peer installation enabled, pnpm installs that version. Existing applications must
+match it. Use TypeScript 5.9 or newer with `strict: true`, ESM, and ES2022 support. See
+[compatibility and stability](https://ueberbrot.github.io/effect-api-query/getting-started/compatibility-and-stability/).
-## Query an RPC
+## RPC
-Pass your RPC group and ready flat client to the factory:
+Share this contract with your server and acquire a matching **flat RPC client** before calling
+`readUser`. Keep its Scope alive while the client is in use. The
+[RPC quick start](https://ueberbrot.github.io/effect-api-query/getting-started/quick-start/)
+shows acquisition and cleanup.
```ts
+import { QueryClient } from '@tanstack/query-core'
+import { Schema } from 'effect'
import { createRpcQueryUtils } from 'effect-api-query'
-
-const rpc = createRpcQueryUtils(rpcGroup, {
- client,
- keyPrefix: ['my-app'],
- runPromiseExit,
-})
-
-const options = rpc.users.get.queryOptions({ input: { id: 1 } })
-const user = await queryClient.query(options)
+import { Rpc, RpcGroup } from 'effect/rpc'
+import type { RpcClient } from 'effect/rpc'
+
+const usersRpc = RpcGroup.make(
+ Rpc.make('users.get', {
+ payload: { id: Schema.Int },
+ success: Schema.Struct({ id: Schema.Int, name: Schema.String }),
+ }),
+)
+
+async function readUser(
+ client: RpcClient.RpcClient.Flat>,
+ queryClient: QueryClient,
+) {
+ const rpc = createRpcQueryUtils(usersRpc, { client, keyPrefix: ['users-app'] })
+ const user = await queryClient.query(rpc.users.get.queryOptions({ input: { id: 1 } }))
+ return user.name
+}
```
-Follow the [RPC quick start](https://ueberbrot.github.io/effect-api-query/getting-started/quick-start/)
-for setup and cleanup.
+Dotted tags become nested utility paths: `users.get` becomes `rpc.users.get`. RPC inputs use the
+payload Schema's constructor input.
-## Query an HttpApi
+## HTTP
-Pass your HttpApi declaration and ready HTTP API client to the factory:
+Share this HttpApi with your server and acquire its **ready HttpApiClient** before calling
+`readUser`. Keep its transport resources alive while the client is in use. The
+[HTTP quick start](https://ueberbrot.github.io/effect-api-query/getting-started/http-quick-start/)
+shows acquisition and cleanup.
```ts
+import { QueryClient } from '@tanstack/query-core'
+import { Schema } from 'effect'
import { createHttpApiQueryUtils } from 'effect-api-query'
-
-const http = createHttpApiQueryUtils(api, {
- client: httpClient,
- keyPrefix: ['my-app'],
- runPromiseExit,
-})
-
-const options = http.users.get.queryOptions({ input: { params: { id: 1 } } })
-const user = await queryClient.query(options)
+import { HttpApi, HttpApiEndpoint, HttpApiGroup } from 'effect/http-api'
+import type { HttpApiClient } from 'effect/http-api'
+
+const usersApi = HttpApi.make('users-api').add(
+ HttpApiGroup.make('users').add(
+ HttpApiEndpoint.get('get', '/users/:id', {
+ params: { id: Schema.Int },
+ success: Schema.Struct({ id: Schema.Int, name: Schema.String }),
+ }),
+ ),
+)
+
+async function readUser(client: HttpApiClient.ForApi, queryClient: QueryClient) {
+ const http = createHttpApiQueryUtils(usersApi, { client, keyPrefix: ['users-app'] })
+ const user = await queryClient.query(
+ http.users.get.queryOptions({ input: { params: { id: 1 } } }),
+ )
+ return user.name
+}
```
-HTTP accepts decoded request parts; RPC accepts payload constructor input. Follow the
-[HTTP quick start](https://ueberbrot.github.io/effect-api-query/getting-started/http-quick-start/)
-for a complete declaration, client, query, and mutation.
-
-## Choose an operation
+HTTP inputs use decoded `params`, `query`, `headers`, and `payload` containers. Both examples use
+the default Effect runner; provide a signal-aware `runPromiseExit` when execution needs services.
+Choose a `keyPrefix` that identifies your application and any user or tenant that affects its data.
+Keep credentials out of keys.
-| API definition | Available operations |
-| ------------------------------------------- | --------------------------------------------- |
-| Unary RPC | Queries, infinite queries, and mutations |
-| Streaming RPC | Accumulated streamed queries and live queries |
-| Buffered HttpApi endpoint without multipart | Queries, infinite queries, and mutations |
-| Buffered HttpApi endpoint with multipart | Mutations with `FormData` |
+## Capabilities
-Both factories generate keys for cache reads, writes, prefetching, and invalidation. Query functions
-forward cancellation to Effect. Mutations use TanStack's normal callbacks; invalidate affected
-queries in your application.
+| Contract | Generated operations |
+| --------------------------------------- | --------------------------------------------- |
+| Unary RPC or buffered nonmultipart HTTP | Query, infinite query, mutation |
+| Buffered nonmultipart HTTP | Separate response status/header metadata view |
+| Buffered multipart HTTP | Mutation with explicit `FormData` |
+| RPC stream or unambiguous HTTP SSE | Accumulated streamed query, live query |
-For uploads, build `FormData` explicitly and pass it as mutation `payload`. See the
-[HTTP upload guide](https://ueberbrot.github.io/effect-api-query/guides/http-queries-and-mutations/#upload-a-file).
-Streaming HTTP responses and streaming multipart requests remain omitted.
+Generated keys support cache reads, writes, and invalidation. Queries forward cancellation to
+Effect. Use `withQueryPolicy` and `withMutationPolicy` to share typed defaults. Your application
+invalidates affected queries after mutations. See
+[feature support](https://ueberbrot.github.io/effect-api-query/getting-started/feature-support/)
+for supported contracts and limits.
-## Integrate with your application
+## Documentation and examples
-- [React Query](https://ueberbrot.github.io/effect-api-query/guides/react-query/): use generated options with hooks.
-- [TanStack Start](https://ueberbrot.github.io/effect-api-query/guides/tanstack-start/): share RPC and HTTP options across loaders, server rendering, and hydration.
-- [Run the examples](https://ueberbrot.github.io/effect-api-query/examples/): try complete Vite React and TanStack Start applications.
-- [Feature support](https://ueberbrot.github.io/effect-api-query/getting-started/feature-support/): check available operations and integration limits.
-- [API reference](https://ueberbrot.github.io/effect-api-query/reference/public-exports/): look up factories, builders, and errors.
+- [Documentation](https://ueberbrot.github.io/effect-api-query/): queries, mutations, pagination, streaming, policies, and caching.
+- [Integrations](https://ueberbrot.github.io/effect-api-query/integrations/): framework setup and client lifetime.
+- [Examples](https://ueberbrot.github.io/effect-api-query/examples/): complete Vite React and TanStack Start applications.
+- [API reference](https://ueberbrot.github.io/effect-api-query/reference/public-exports/): factories, builders, keys, and errors.
## Agent skill
Install the library usage skill from this repository:
```sh
-npx skills add ueberBrot/effect-api-query --skill effect-api-query
+npx skills add ueberBrot/effect-api-query --full-depth --skill effect-api-query
```
The same skill ships in the npm package. With the library installed, run
@@ -96,5 +125,5 @@ The same skill ships in the npm package. With the library installed, run
npx @tanstack/intent@latest load effect-api-query#effect-api-query
```
-Intent reads the skill from the installed library version. Skills installed from
-GitHub are updated separately through the Skills CLI.
+Intent uses the skill from the installed library version. GitHub skill installations update
+separately through the Skills CLI.
diff --git a/_artifacts/domain_map.yaml b/_artifacts/domain_map.yaml
new file mode 100644
index 0000000..fc1766a
--- /dev/null
+++ b/_artifacts/domain_map.yaml
@@ -0,0 +1,175 @@
+library:
+ name: effect-api-query
+ version: 0.1.0
+ repository: https://github.com/ueberBrot/effect-api-query
+ description: TanStack Query utilities derived from ready Effect RPC and HTTP clients.
+ primary_framework: framework-agnostic
+domains:
+ - name: Contract-derived query workflows
+ slug: contract-queries
+ description: Choose typed cache views while preserving application-owned execution and lifetime.
+skills:
+ - name: effect-api-query
+ slug: effect-api-query
+ domain: contract-queries
+ description: Derive options and keys, coordinate cache owners, and integrate native Query
+ consumers.
+ type: core
+ packages:
+ - effect-api-query
+ covers:
+ - RPC construction and canonical identity
+ - HTTP decoded requests, SSE, multipart mutations, and metadata
+ - Inferred operation types, typed policy reuse, native defaults, and view filters
+ - Input-field skipping, pagination, stream policies, and lifetime tracing
+ - Stream snapshots and request cleanup
+ - Optimistic overlap, event refresh, and owner replacement
+ - DTO and rich-value hydration
+ - Native provider setup, Suspense recovery, reactive accessors, and host boundaries
+ tasks:
+ - Derive buffered, paginated, accumulated, live, and metadata options from a ready client.
+ - Address exact stream policy keys, select supported view prefixes, and compose encoded
+ partial native filters.
+ - Reuse inferred input, cached query data, and mutation types in application modules.
+ - Apply native defaults and typed reusable policies without losing call-site selection,
+ conditional input, or explicitly undefined seed behavior.
+ - Capture open streams and drain queries, preparation, and accepted writes before request
+ disposal.
+ - Hydrate every selected view into its normal decoded cache representation.
+ - Preserve neighboring writes and originating ownership during mutation overlap.
+ - Defer event refresh until participating writes settle.
+ - Retire consumers and accepted work before acquiring a replacement owner.
+ - Acquire a ready client and mount native providers with awaited cleanup.
+ - Recover initial Suspense failures, retain cached data after failed refetches, and start
+ independent reads together with native cancellation limits.
+ - Trace the consumed Stream and its cleanup while its owning runtime remains alive.
+ - Rebuild options inside native reactive framework accessors.
+ - Choose an application-owned transport within documented version and host boundaries.
+ subsystems:
+ - name: RPC
+ package: effect-api-query
+ config_surface: Literal RpcGroup, flat ready client, prefix, key encoders, runner.
+ - name: HTTP
+ package: effect-api-query
+ config_surface: Literal HttpApi, ready client, prefix, request encoders, runner.
+ reference_candidates:
+ - topic: Adapter inputs and capabilities
+ reason: RPC construction and HTTP decoded containers differ.
+ - topic: Cache workflows
+ reason: Keys, policies, and native filters are library contracts; writes and replacement
+ are application-owned workflows.
+ - topic: Hydration and SSR
+ reason: Captures, view codecs, and preparation require request lifetime.
+ - topic: Frameworks and hosts
+ reason: Native providers, Suspense recovery, hook overloads, and transport boundaries are
+ conditional integrations rather than package-provided services.
+ failure_modes:
+ - mistake: Reuse an accumulated key across incompatible policies
+ mechanism: Retention and refetch policy change representation and normalized identity.
+ wrong_pattern: rpc.events.watch.streamedKey(input)
+ correct_pattern: rpc.events.watch.streamedKey(input, policy)
+ source: src/rpc/streamed-query.ts
+ priority: HIGH
+ status: active
+ - mistake: Dispose resources after native cancellation alone
+ mechanism: Query settlement can precede local finalization; accepted writes and
+ preparation may still need the runtime.
+ wrong_pattern: await queryClient.cancelQueries(); await runtime.dispose()
+ correct_pattern: await acceptedWorkDrain; await runtime.dispose()
+ source: examples/tanstack-start/src/lib/application.ts
+ priority: HIGH
+ status: active
+ - mistake: Roll back an overlapping write with an old snapshot
+ mechanism: Whole-list replacement erases intervening writes; stale entity restoration
+ can overwrite a newer authoritative cache revision.
+ wrong_pattern: queryClient.setQueryData(key, oldList)
+ correct_pattern: Capture current entity fields and positions for each new write; restore
+ them only while its optimistic cache revision remains owned.
+ source: examples/vite-react/src/lib/user-writes.ts
+ priority: CRITICAL
+ status: active
+ - mistake: Redirect late callbacks to a replacement owner
+ mechanism: Mutable current-owner lookup can send private results to another cache.
+ wrong_pattern: currentOwner.queryClient.setQueryData(key, result)
+ correct_pattern: transaction.commit(result)
+ source: examples/vite-react/src/lib/user-writes.ts
+ priority: CRITICAL
+ status: active
+ - mistake: Hydrate rich values without paired view codecs
+ mechanism: JSON loses prototypes, rich page parameters, and distinct undefined elements.
+ wrong_pattern: hydrate(queryClient, JSON.parse(snapshot))
+ correct_pattern: await decodeAllSelectedViewsThenHydrate(snapshot)
+ source: tests/types/docs-hydration-views.ts
+ priority: HIGH
+ status: active
+ - mistake: Construct reactive query options only once
+ mechanism: Builders capture the first input and cannot follow reactive changes.
+ wrong_pattern: useQuery(rpc.users.read.queryOptions({ input }))
+ correct_pattern: 'useQuery(() => rpc.users.read.queryOptions({ input: readInput() }))'
+ source: apps/docs/src/content/docs/guides/solid-query.md
+ priority: HIGH
+ status: active
+ - mistake: Rely on changed metadata options after a fresh hit
+ mechanism: An imperative fresh cache hit retains the existing Query options.
+ wrong_pattern: await queryClient.query(newOptions); queryClient.setQueryData(key, value)
+ correct_pattern: Install the policy through an observer or actual fetch before manual writes.
+ source: apps/docs/src/content/docs/reference/http-builders.md
+ priority: HIGH
+ status: active
+ - mistake: Assume shared mutation callbacks compose automatically
+ mechanism: Call-site callbacks replace policy callbacks, and shared callbacks cannot
+ assume the local optimistic context's shape.
+ wrong_pattern: 'write({ onSuccess: localSuccess })'
+ correct_pattern: Compose required callbacks explicitly and keep onMutate at the call site.
+ source: tests/query-policy.test.ts
+ priority: HIGH
+ status: active
+ - mistake: Rely on Suspense cancellation for open streams
+ mechanism: Native Suspense hooks do not support cancellation; lifecycle cleanup needs
+ an ordinary abort-aware query or observer.
+ wrong_pattern: useSuspenseQuery(rpc.events.watch.liveOptions())
+ correct_pattern: Use an ordinary Query hook or observer for a stream requiring cancellation.
+ source: apps/docs/src/content/docs/guides/react-query.md
+ priority: HIGH
+ status: active
+ - mistake: Trace only the creation of an iterable
+ mechanism: The runner's Effect ends before stream consumption and local finalization.
+ wrong_pattern: runPromiseExit(effect.pipe(Effect.withSpan('feed.consume')))
+ correct_pattern: Acquire Effect.makeSpanScoped inside Stream.unwrap and retain it through
+ asynchronous Stream.ensuring cleanup.
+ source: tests/types/docs-stream-tracing.ts
+ priority: HIGH
+ status: active
+ compositions:
+ - library: TanStack Query
+ - library: Effect
+tensions:
+ - name: Library contracts and application workflows
+ skills:
+ - effect-api-query
+ description: Generated options, keys, inference, and policy binding have a package contract;
+ native providers, transports, and domain protocols belong to the application.
+ implication: Explain package behavior in library guidance, native consumers in integrations,
+ and concrete protocols such as cancellable commands in runnable examples.
+ - name: Exact identity and broad refresh
+ skills:
+ - effect-api-query
+ description: Concrete keys include encoding and view policy while native prefixes group
+ related entries.
+ implication: Partial constructor input or omitted stream policy cannot stand in for an exact
+ key.
+ - name: Local retirement and accepted domain work
+ skills:
+ - effect-api-query
+ description: Private cache retirement stops local side effects without pretending to undo
+ remote writes.
+ implication: Keep originating-owner guards after drain and model command cancellation explicitly.
+ - name: Policy reuse and call-site inference
+ skills:
+ - effect-api-query
+ description: Shared endpoint-aware defaults reduce repetition while selected data and
+ optimistic context depend on each invocation.
+ implication: Bind typed policies once per owner, keeping projections, seeds, identity, and
+ optimistic context at the call site; compose required callbacks deliberately.
+cross_references: []
+gaps: []
diff --git a/_artifacts/skill_spec.md b/_artifacts/skill_spec.md
new file mode 100644
index 0000000..ce41f47
--- /dev/null
+++ b/_artifacts/skill_spec.md
@@ -0,0 +1,129 @@
+# Effect API Query skill coverage
+
+The package derives TanStack Query utilities from Effect RPC and HTTP contracts
+and ready clients. Applications own transport, authentication, runtime, Scope,
+cache ownership, and serialization policy.
+
+## Structure
+
+One automatically discoverable `effect-api-query` skill covers the existing
+library. Its entry point holds shared rules and routes conditional tasks to six
+references:
+
+| Reference | Tasks |
+| -------------------- | ------------------------------------------------------------------ |
+| RPC | Payload construction, canonical identity, ready-client lifetime |
+| HTTP | Decoded requests, SSE, multipart mutations, metadata |
+| Query patterns | Inference types, skipping, pagination, stream views and tracing |
+| Cache workflows | Typed policies, native defaults, view filters, writes and owners |
+| Hydration and SSR | Snapshots, paired view codecs, preparation and cleanup |
+| Frameworks and hosts | Provider setup, Suspense, reactive accessors, transports and hosts |
+
+Consumers load the guidance from their installed package without repository-local
+authoring skills. Planning records remain outside the shipped package.
+
+## Sources and boundaries
+
+The [domain map](domain_map.yaml) owns task coverage and failure modes. The
+[skill tree](skill_tree.yaml) owns skill paths and source mappings. Public
+declarations and runtime own API facts; application modules own domain and cache
+coordination. Library documentation explains generated options, keys,
+inference, policies, and cleanup contracts. Integration pages explain native
+providers and consumers; runnable examples demonstrate application protocols.
+
+Keep guidance within existing library behavior. Preserve application ownership
+and qualify support through [frameworks and hosts](../skills/effect-api-query/references/frameworks-and-hosts.md).
+Measurements describe their fixtures; they do not establish universal budgets.
+
+## Validation
+
+Native Intent maintenance detects source changes and records justified outcomes
+for the owned skill and planning records. Run `intent maintainer check`, report
+pending work, and finish with the uncached scoped `skills-check` task. Leave
+unrelated skills unresolved.
+
+Strict compiler fixtures check the public declarations and retained documentation
+examples. Ordinary runtime tests and application examples cover cache views,
+cancellation, hydration, and ownership. Native builds validate package
+declarations and exports.
+
+The usability batch reuses the existing executable consumer fixtures:
+
+| Task | Checks |
+| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
+| Infer operation inputs, views, and failures; retain local policy inference | `tests/types/helper-contract.ts`, `tests/types/docs-policies.ts`, `tests/query-policy.test.ts` |
+| Select every input of a supported view and preserve exact tagged reads | `tests/query-view-prefix.test.ts`, `tests/types/helper-contract.ts` |
+| Share typed RPC/HTTP retry decisions | `tests/types/docs-retry.ts` |
+| Acquire, provide, render, and dispose a minimal React application | `tests/types/docs-react-setup.tsx`, `tests/types/docs-react-entry.ts`, `examples/vite-react/tests/minimal-setup.test.tsx` |
+| Reset initial Suspense errors, retain failed-refetch data, start reads together | `tests/types/docs-suspense.tsx`, `examples/vite-react/tests/suspense-recovery.test.tsx` |
+| Trace lazy stream emissions and awaited cleanup | `tests/types/docs-stream-tracing.ts`, `examples/vite-react/tests/stream-tracing.test.ts` |
+
+These checks verify the recommended APIs and observable behavior. A fresh isolated
+consumer session remains separate evidence; this authoring session does not
+establish skill discovery or consumer reliability.
+
+## Coverage and batch history
+
+- **0.1.0 candidate, source `6893603` (2026-10-10):** one skill and six references
+ cover the ten developer tasks in the domain map. Guidance includes originating
+ cache owners, overlapping writes, stream capture and preparation drain, paired
+ hydration codecs, and qualified framework and host limits. CI `38085762210`
+ and release validation `38085762195` passed; publication remains separate.
+- **Maintainer alignment (2026-10-10), based on `6893603`:** pin native Intent
+ 0.5.3 under the seven-day dependency policy and add its revision-aware check to
+ CI. Its default discovery excludes hidden repository authoring skills. Preserve
+ the existing task coverage, source mappings, and package-only distribution.
+ Skills CLI 1.7.0 discovered and copied this same skill from the repository root:
+ all seven files matched, and all 13 relative links resolved within the copy.
+ Guidance is unchanged, so this batch checks delivery without repeating API
+ tasks. Scoped formatting, skill validation, and native maintainer checks with
+ the default and actual PR bases passed. Initial package publication remains
+ pending.
+- **API and architecture review (2026-10-11), based on `bf38d85`:** use one
+ conditional-input form across buffered, metadata, streamed, and live options.
+ Retain the ten tasks and existing source mappings. Compiler fixtures verify
+ contextual inference and mutation tracking; 124 in-memory runtime cases cover
+ cache views, retry attempts, defaults, hydration, cancellation, and ownership.
+- **Runtime and guidance audit (2026-10-11), based on `54b6521`:** qualify stream
+ hashing and execution errors, preserve refreshed page totals during overlapping
+ writes, and reconcile command starts after transport failures. Shorten repeated
+ guidance while retaining the ten tasks, domain map, and source mappings. All
+ 474 runtime cases and both public API compiler suites pass, alongside typed
+ lint, Effect diagnostics, dead-code checks, and documentation checks.
+- **Functionality and lifetime review (2026-10-11), based on `512cd90`:** organize
+ documentation around queries, mutations, pagination, streaming, and metadata.
+ Request disposal drains ordinary query finalizers and accepted writes; rollback
+ respects newer authoritative cache revisions. Clarify selected return values
+ and opaque middleware's encoder requirement. Preserve the ten tasks and six
+ references; existing source mappings cover the new guides and compiler fixture.
+ Remove runtime cases that duplicate static contracts, upstream behavior, or
+ bookkeeping. All 491 remaining runtime cases and both public API compiler
+ suites pass. Documentation builds with valid links, and all 38 application and
+ documentation Chromium checks pass.
+- **Usability and policy reuse (2026-10-11), based on `8f4723c`:** extend the
+ existing skill and six references with operation inference, supported view
+ prefixes, typed query/mutation policy reuse, minimal native provider setup,
+ Suspense recovery, and consumed-stream tracing. Keep inputs, projections, seeds,
+ page mapping, stream identity, and optimistic context local; call-site callbacks
+ replace shared policy callbacks. Preserve native QueryClient defaults, canonical
+ encoded partial filtering, application lifetime, and all prior task coverage.
+ Semantic near-miss duplication detection found the repeated retry recipe;
+ shared owner invalidation and error descriptions also reduce example drift.
+ Expand source mappings for TSX fixtures and shared example error rendering.
+ A fresh consumer invoked the copied packaged skill and produced typed policy
+ builders in a disposable project. The behavior checks passed and rejected the
+ initial version without shared defaults; its result compiled on TypeScript 7
+ and 5.9. Skill discovery remains unverified. Final compiler, runtime,
+ documentation, and revision-bound Intent outcomes are recorded with the task's
+ maintenance review.
+- **Library-focused documentation (2026-10-11), based on `8f4723c`:** separate
+ library contracts, native integrations, runnable application examples, and API
+ reference. Keep the existing fourteen tasks and six shipped references.
+ Type Inference owns the detailed inference contract; Defaults and Policies owns
+ shared defaults and callbacks; Cache Keys and Filters replaces Cache Management.
+ Fold ready-client mounting into React Query and move the explicit command
+ protocol to Cancellable Commands. Update shipped pointers to those canonical
+ pages and the integration overview. Existing skill-tree source patterns already
+ cover the new and moved pages, so its identities and mappings remain accurate.
+ Preserve the fresh-consumer evidence above; this reorganization changes where
+ guidance is reached, without changing its recommended API behavior.
diff --git a/_artifacts/skill_tree.yaml b/_artifacts/skill_tree.yaml
new file mode 100644
index 0000000..8243983
--- /dev/null
+++ b/_artifacts/skill_tree.yaml
@@ -0,0 +1,58 @@
+library:
+ name: effect-api-query
+ version: 0.1.0
+generated_from:
+ domain_map: _artifacts/domain_map.yaml
+ skill_spec: _artifacts/skill_spec.md
+skills:
+ - name: effect-api-query
+ slug: effect-api-query
+ domain: contract-queries
+ path: skills/effect-api-query/SKILL.md
+ description: 'Use when integrating effect-api-query with an Effect RPC or
+ HttpApi contract: derive TanStack Query keys and options, choose buffered
+ or streaming views, configure metadata, pagination, defaults or cache
+ filters, coordinate writes and cache owners, capture or hydrate SSR data,
+ or rebuild native framework queries from reactive input. Also use when
+ diagnosing execution failures, cancellation, or ready-client lifetime in
+ these integrations.'
+ sources:
+ - src/**/*.ts
+ - tests/**/*.ts
+ - tests/**/*.tsx
+ - '**/examples/shared/*.ts'
+ - '**/examples/vite-react/src/lib/*.ts'
+ - '**/examples/vite-react/src/main.tsx'
+ - '**/examples/vite-react/src/app.tsx'
+ - '**/examples/vite-react/src/components/ui/effect-error-details.tsx'
+ - '**/examples/vite-react/tests/*.ts*'
+ - '**/examples/tanstack-start/src/lib/*.ts'
+ - '**/examples/tanstack-start/src/router.tsx'
+ - '**/examples/tanstack-start/src/components/effect-error-details.tsx'
+ - '**/examples/tanstack-start/tests/*.ts*'
+ - '**/examples/server/src/*.ts'
+ - '**/examples/server/tests/**/*.ts'
+ - GLOSSARY.md
+ - README.md
+ - package.json
+ - pnpm-workspace.yaml
+ - scripts/*.mts
+ - docs/adr/000*.md
+ - docs/adr/0010-*.md
+ - docs/adr/0012-*.md
+ - docs/adr/0014-*.md
+ - docs/adr/0015-*.md
+ - docs/adr/002*.md
+ - '**/apps/docs/src/content/docs/**/*.md'
+ - '**/apps/docs/src/content/docs/**/*.mdx'
+ requires: []
+ purpose: Derive typed TanStack Query keys and options from ready Effect RPC and
+ HTTP clients, preserving cache identity, decoded query views, native
+ framework behavior, and application-owned execution, hydration, and
+ resource lifetime.
+distribution:
+ mode: none
+review:
+ ignore:
+ - node_modules
+ - '**/node_modules'
diff --git a/apps/docs/astro.config.mjs b/apps/docs/astro.config.mjs
deleted file mode 100644
index cc5eb96..0000000
--- a/apps/docs/astro.config.mjs
+++ /dev/null
@@ -1,106 +0,0 @@
-// @ts-check
-
-import starlight from '@astrojs/starlight'
-import { defineConfig } from 'astro/config'
-import starlightLinksValidator from 'starlight-links-validator'
-import starlightLlmsTxt from 'starlight-llms-txt'
-import starlightThemeBlack from 'starlight-theme-black'
-
-import packageManifest from '../../package.json' with { type: 'json' }
-
-const repositoryUrl = 'https://github.com/ueberBrot/effect-api-query'
-const docsBase = '/effect-api-query'
-const packageUrl = `https://www.npmjs.com/package/${packageManifest.name}`
-
-export default defineConfig({
- base: docsBase,
- integrations: [
- starlight({
- description: 'Use Effect RPC and HttpApi with typed TanStack Query options and cache keys.',
- editLink: {
- baseUrl: `${repositoryUrl}/edit/main/apps/docs/`,
- },
- lastUpdated: true,
- head: [
- {
- tag: 'script',
- attrs: {
- defer: true,
- src: `${docsBase}/package-version.js`,
- },
- },
- ],
- logo: {
- src: './src/assets/icon.svg',
- },
- plugins: [
- starlightLlmsTxt(),
- starlightThemeBlack({
- navLinks: [
- {
- label: `v${packageManifest.version}`,
- link: packageUrl,
- },
- ],
- }),
- starlightLinksValidator({
- errorOnRelativeLinks: true,
- }),
- ],
- sidebar: [
- {
- label: 'Start Here',
- items: [
- { label: 'Installation', slug: 'getting-started/installation' },
- { label: 'RPC Quick Start', slug: 'getting-started/quick-start' },
- { label: 'HTTP Quick Start', slug: 'getting-started/http-quick-start' },
- { label: 'Executable Examples', slug: 'examples' },
- { label: 'Feature Support', slug: 'getting-started/feature-support' },
- {
- label: 'Compatibility and Stability',
- slug: 'getting-started/compatibility-and-stability',
- },
- ],
- },
- {
- label: 'Guides',
- items: [
- { label: 'React Query', slug: 'guides/react-query' },
- { label: 'HTTP Queries and Mutations', slug: 'guides/http-queries-and-mutations' },
- { label: 'TanStack Start', slug: 'guides/tanstack-start' },
- { label: 'Cache Management', slug: 'guides/cache-management' },
- { label: 'Cancellation', slug: 'guides/cancellation' },
- { label: 'Handle Failures', slug: 'guides/handle-failures' },
- { label: 'Custom Key Encoders', slug: 'guides/custom-key-encoders' },
- { label: 'Conditional Queries', slug: 'guides/conditional-queries' },
- ],
- },
- {
- label: 'Concepts',
- items: [
- { label: 'RPC Utility Tree', slug: 'concepts/rpc-utility-tree' },
- { label: 'HTTP Utility Tree', slug: 'concepts/http-utility-tree' },
- { label: 'Queries and Mutations', slug: 'concepts/queries-and-mutations' },
- { label: 'Client Lifecycle', slug: 'concepts/client-lifecycle' },
- { label: 'Semantic Keys', slug: 'concepts/semantic-keys' },
- { label: 'Data Normalization', slug: 'concepts/data-normalization' },
- ],
- },
- {
- label: 'Reference',
- items: [
- { label: 'RPC Factory', slug: 'reference/factory' },
- { label: 'HTTP Factory', slug: 'reference/http-factory' },
- { label: 'RPC Builders', slug: 'reference/generated-builders' },
- { label: 'Errors', slug: 'reference/errors' },
- { label: 'Public Exports', slug: 'reference/public-exports' },
- { label: 'Compatibility and Limits', slug: 'reference/compatibility-and-limits' },
- ],
- },
- ],
- social: [{ icon: 'github', label: 'GitHub', href: repositoryUrl }],
- title: packageManifest.name,
- }),
- ],
- site: 'https://ueberbrot.github.io',
-})
diff --git a/apps/docs/astro.config.mts b/apps/docs/astro.config.mts
new file mode 100644
index 0000000..3e73f37
--- /dev/null
+++ b/apps/docs/astro.config.mts
@@ -0,0 +1,354 @@
+import starlight from '@astrojs/starlight'
+import { defineConfig } from 'astro/config'
+import starlightLinksValidator from 'starlight-links-validator'
+import starlightLlmsTxt from 'starlight-llms-txt'
+import starlightThemeBlack from 'starlight-theme-black'
+
+import packageManifest from '../../package.json' with { type: 'json' }
+
+const repositoryUrl = 'https://github.com/ueberBrot/effect-api-query'
+const docsBase = '/effect-api-query'
+const packageUrl = `https://www.npmjs.com/package/${packageManifest.name}`
+
+export default defineConfig({
+ base: docsBase,
+ integrations: [
+ starlight({
+ description: 'Use Effect RPC and HttpApi with typed TanStack Query options and cache keys.',
+ editLink: {
+ baseUrl: `${repositoryUrl}/edit/main/apps/docs/`,
+ },
+ lastUpdated: true,
+ head: [
+ {
+ tag: 'script',
+ attrs: {
+ defer: true,
+ src: `${docsBase}/package-version.js`,
+ },
+ },
+ ],
+ logo: {
+ src: './src/assets/icon.svg',
+ },
+ plugins: [
+ starlightLlmsTxt(),
+ starlightThemeBlack({
+ navLinks: [
+ {
+ label: `v${packageManifest.version}`,
+ link: packageUrl,
+ },
+ ],
+ }),
+ starlightLinksValidator({
+ errorOnRelativeLinks: true,
+ }),
+ ],
+ sidebar: [
+ {
+ label: 'Start Here',
+ items: [
+ {
+ label: 'Installation',
+ slug: 'getting-started/installation',
+ },
+ {
+ label: 'Supported Operations',
+ slug: 'getting-started/feature-support',
+ },
+ ],
+ },
+ {
+ label: 'HTTP API',
+ items: [
+ {
+ label: 'Quick Start',
+ slug: 'getting-started/http-quick-start',
+ },
+ {
+ label: 'Contract and Utility Tree',
+ slug: 'concepts/http-utility-tree',
+ },
+ {
+ label: 'Requests and Uploads',
+ slug: 'guides/http-queries-and-mutations',
+ },
+ {
+ label: 'Response Metadata',
+ slug: 'guides/http-metadata',
+ },
+ {
+ label: 'Factory',
+ slug: 'reference/http-factory',
+ },
+ {
+ label: 'Builders',
+ slug: 'reference/http-builders',
+ },
+ ],
+ },
+ {
+ label: 'RPC',
+ items: [
+ {
+ label: 'Quick Start',
+ slug: 'getting-started/quick-start',
+ },
+ {
+ label: 'Contract and Utility Tree',
+ slug: 'concepts/rpc-utility-tree',
+ },
+ {
+ label: 'Factory',
+ slug: 'reference/factory',
+ },
+ {
+ label: 'Builders',
+ slug: 'reference/generated-builders',
+ },
+ ],
+ },
+ {
+ label: 'Library',
+ items: [
+ {
+ label: 'Contracts and Inputs',
+ items: [
+ {
+ label: 'Generated Utility Model',
+ slug: 'concepts/queries-and-mutations',
+ },
+ {
+ label: 'Inputs and Query Data',
+ slug: 'concepts/data-normalization',
+ },
+ ],
+ },
+ {
+ label: 'Options and Cache Views',
+ items: [
+ {
+ label: 'Queries',
+ slug: 'guides/queries',
+ },
+ {
+ label: 'Mutations',
+ slug: 'guides/mutations',
+ },
+ {
+ label: 'Pagination',
+ slug: 'guides/pagination',
+ },
+ {
+ label: 'Conditional Queries',
+ slug: 'guides/conditional-queries',
+ },
+ {
+ label: 'Streaming',
+ slug: 'guides/streaming',
+ },
+ {
+ label: 'Stream History',
+ slug: 'guides/choose-stream-history',
+ },
+ ],
+ collapsed: true,
+ },
+ {
+ label: 'Cache and Policies',
+ items: [
+ {
+ label: 'Semantic Keys',
+ slug: 'concepts/semantic-keys',
+ },
+ {
+ label: 'Cache Keys and Filters',
+ slug: 'guides/cache-filters',
+ },
+ {
+ label: 'Defaults and Policies',
+ slug: 'guides/query-defaults',
+ },
+ {
+ label: 'Custom Key Encoders',
+ slug: 'guides/custom-key-encoders',
+ },
+ {
+ label: 'Optimistic Updates',
+ slug: 'guides/optimistic-writes',
+ },
+ {
+ label: 'Refresh from Events',
+ slug: 'guides/refresh-from-events',
+ },
+ {
+ label: 'Switch Cache Owners',
+ slug: 'guides/switch-cache-owners',
+ },
+ ],
+ collapsed: true,
+ },
+ {
+ label: 'Execution and Lifetime',
+ items: [
+ {
+ label: 'Client Lifecycle',
+ slug: 'concepts/client-lifecycle',
+ },
+ {
+ label: 'Handle Failures',
+ slug: 'guides/handle-failures',
+ },
+ {
+ label: 'Retry Queries',
+ slug: 'guides/retry-queries',
+ },
+ {
+ label: 'Cancellation',
+ slug: 'guides/cancellation',
+ },
+ ],
+ collapsed: true,
+ },
+ ],
+ },
+ {
+ label: 'Integrations',
+ items: [
+ {
+ label: 'Overview',
+ slug: 'integrations',
+ },
+ {
+ label: 'React',
+ items: [
+ {
+ label: 'Client Setup and Hooks',
+ slug: 'guides/react-query',
+ },
+ {
+ label: 'Suspense and Error Recovery',
+ slug: 'guides/suspense-and-recovery',
+ },
+ ],
+ },
+ {
+ label: 'Reactive Frameworks',
+ items: [
+ {
+ label: 'Vue Query',
+ slug: 'guides/vue-query',
+ },
+ {
+ label: 'Solid Query',
+ slug: 'guides/solid-query',
+ },
+ {
+ label: 'Svelte Query',
+ slug: 'guides/svelte-query',
+ },
+ {
+ label: 'Angular Query',
+ slug: 'guides/angular-query',
+ },
+ ],
+ collapsed: true,
+ },
+ {
+ label: 'Router and Server Rendering',
+ items: [
+ {
+ label: 'Router and Start',
+ slug: 'guides/tanstack-start',
+ },
+ {
+ label: 'Hydrate Query Data',
+ slug: 'guides/hydrate-unary-data',
+ },
+ {
+ label: 'Hydrate Query Views',
+ slug: 'guides/hydrate-query-views',
+ },
+ {
+ label: 'Stream Snapshots',
+ slug: 'guides/stream-snapshots',
+ },
+ ],
+ collapsed: true,
+ },
+ {
+ label: 'Clients and Hosts',
+ items: [
+ {
+ label: 'WebSocket Clients',
+ slug: 'guides/websocket-clients',
+ },
+ {
+ label: 'Browser and Worker Hosts',
+ slug: 'reference/browser-and-worker-hosts',
+ },
+ {
+ label: 'Stream Tracing',
+ slug: 'guides/trace-streams',
+ },
+ {
+ label: 'External HTTP Clients',
+ slug: 'reference/external-http-clients',
+ },
+ ],
+ collapsed: true,
+ },
+ ],
+ },
+ {
+ label: 'Examples',
+ items: [
+ {
+ label: 'Run the Applications',
+ slug: 'examples',
+ },
+ {
+ label: 'Cancellable Commands',
+ slug: 'examples/cancellable-commands',
+ },
+ ],
+ collapsed: true,
+ },
+ {
+ label: 'API Reference',
+ items: [
+ {
+ label: 'Type Inference',
+ slug: 'reference/type-inference',
+ },
+ {
+ label: 'Errors',
+ slug: 'reference/errors',
+ },
+ {
+ label: 'Public Exports',
+ slug: 'reference/public-exports',
+ },
+ {
+ label: 'Compatibility and Limits',
+ slug: 'reference/compatibility-and-limits',
+ },
+ {
+ label: 'Compatibility and Stability',
+ slug: 'getting-started/compatibility-and-stability',
+ },
+ {
+ label: 'Performance and Bundling',
+ slug: 'reference/performance',
+ },
+ ],
+ collapsed: true,
+ },
+ ],
+ social: [{ icon: 'github', label: 'GitHub', href: repositoryUrl }],
+ title: packageManifest.name,
+ }),
+ ],
+ site: 'https://ueberbrot.github.io',
+})
diff --git a/apps/docs/package.json b/apps/docs/package.json
index 4f0fb9b..69c7feb 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -18,6 +18,6 @@
},
"devDependencies": {
"@astrojs/check": "0.9.10",
- "typescript": "6.0.3"
+ "typescript": "catalog:docs"
}
}
diff --git a/apps/docs/public/package-version.js b/apps/docs/public/package-version.js
index 0ddc8cf..ab8f1b4 100644
--- a/apps/docs/public/package-version.js
+++ b/apps/docs/public/package-version.js
@@ -24,7 +24,7 @@
updatePackageVersion(manifest.version)
} catch {
- // Keep the version embedded by the last documentation build.
+ return
}
}
diff --git a/apps/docs/src/content/docs/concepts/client-lifecycle.md b/apps/docs/src/content/docs/concepts/client-lifecycle.md
index a089842..059c0ca 100644
--- a/apps/docs/src/content/docs/concepts/client-lifecycle.md
+++ b/apps/docs/src/content/docs/concepts/client-lifecycle.md
@@ -3,26 +3,19 @@ title: Client Lifecycle
description: Keep RPC and HTTP clients, runtimes, and resources under caller ownership.
---
-`createRpcQueryUtils` accepts a ready flat RPC client. Your application acquires the client, keeps
-its `Scope` open, and disposes its resources:
+Both factories use ready clients. The application owns transport, middleware, runtime,
+Scope, and QueryClient:
-1. Open the RPC client's `Scope` and build any required runtime.
-2. Create a `QueryClient` and RPC utility tree.
-3. Run ordinary, infinite, accumulated-stream, and live queries or mutations. Their generated
- functions call the ready client through `runPromiseExit`.
-4. At shutdown, cancel active queries, clear the cache, and then dispose the RPC client's resources.
+1. Acquire the RPC or HTTP client and the services it requires.
+2. Create a QueryClient and utility tree for that owner.
+3. Keep those resources alive while queries, streams, and mutations run.
+4. Stop consumers, cancel queries, await local stream cleanup and accepted mutations,
+ clear the cache, then release the client and runtime.
-On the server, create these resources separately for each request to keep request data and scoped
-services isolated. In the browser, keep them for the application lifetime.
-
-The factory has no React, router, transport, provider, or server-rendering lifecycle of its own.
+Server requests own independent resources. Browser applications keep them for their lifetime.
## HTTP clients and execution services
-`createHttpApiQueryUtils` accepts a ready HttpApiClient. The application builds its HTTP transport,
-installs client middleware, and manages any runtime or `Scope` the client uses. On the server,
-create a client and `QueryClient` for each request and dispose their resources when it ends.
-
Calls that need no services default to `Effect.runPromiseExit`. If an exposed endpoint needs request
encoding, success decoding, or error decoding services, supply a `runPromiseExit` that provides
them. The runner must also provide any services the ready client still requires. It must forward its
@@ -42,3 +35,30 @@ processing; it is not a serialized server Context and does not replace the suppl
Manage authentication, middleware, transport setup, runtime services, and `Scope` in your
application client and runtime.
+
+## Stream creation and consumption
+
+For an accumulated or live RPC or HTTP SSE query, the runner executes
+`Stream.toAsyncIterableEffect` to create an iterable and capture its Effect `Context`. The runner
+returns a successful `Exit` before Query Core pulls values. Iterator pulls then use that captured
+Context while the query remains fetching. Keep its services and the ready client's Scope alive
+until consumption finishes.
+
+Transform or instrument the ready-client stream when the work must cover consumption.
+Preserve its request options, declared value/error types, and HTTP response-mode contract.
+Use a stream finalizer for completion or cancellation cleanup.
+
+A timer, span, finalizer, or retry schedule around the runner's creation Effect ends with iterable
+creation. It does not wrap the later pulls. Put stream-lifetime instrumentation and recovery on the
+stream itself. A retry in generated Query options reruns the query function and creates another
+iterable. Coordinate it with stream and transport schedules as described in
+[retry queries](/effect-api-query/guides/retry-queries/#set-defaults-deliberately).
+
+Native `cancelQueries` settlement can precede asynchronous iterator cleanup. Await the
+resource's completion signal before releasing its services. Mutations settle separately because
+they have no query abort signal.
+
+For an open-stream server capture, await
+[fetchStreamSnapshot](/effect-api-query/guides/stream-snapshots/) before dehydration or client
+disposal. The helper waits for local iterator cleanup; remote completion still requires an
+application acknowledgement.
diff --git a/apps/docs/src/content/docs/concepts/data-normalization.md b/apps/docs/src/content/docs/concepts/data-normalization.md
index d777c60..be1e8e5 100644
--- a/apps/docs/src/content/docs/concepts/data-normalization.md
+++ b/apps/docs/src/content/docs/concepts/data-normalization.md
@@ -22,6 +22,17 @@ with their schemas; the ready HttpApiClient encodes them separately for executio
Every declared request container remains required, even when its fields are optional. For example,
an endpoint with optional query filters still takes `input: { query: {} }` when no filter is selected.
+## Keep captured inputs unchanged
+
+Query options retain the normalized RPC payload or decoded HTTP request for later execution.
+Keep those values and their nested mutable values unchanged while the options can run. When input
+changes, create new input and options rather than modifying the captured values.
+
+Canonical keys copy and deeply freeze the encoded identity. They do not clone or freeze arbitrary
+execution inputs or decoded query data. RPC construction can retain nested caller values; HTTP
+preparation retains the decoded request. In reactive frameworks, rebuild options inside the
+framework's computed value or accessor.
+
## No-content and undefined query results
TanStack Query rejects `undefined` as successful query data. When a buffered RPC or HTTP query succeeds
@@ -34,8 +45,11 @@ An HTTP endpoint using `HttpApiSchema.NoContent` decodes its successful 204 resp
Mutations keep the original success type. A mutation that succeeds with `undefined` still
resolves to `undefined`.
-Accumulated streamed queries and live queries retain emitted values as supplied; they do not
-apply buffered query normalization.
+Live queries also convert each emitted `undefined` to `null`. A stream emitting a value followed
+by `undefined` ends with `null` as its latest query data. Live keys, selectors, and `initialData`
+use the same normalized type. The first emission makes an open live query successful while it
+remains fetching; completion without any emission raises `EffectRpcQueryEmptyStreamError` for RPC
+or `EffectHttpApiQueryEmptyStreamError` for HTTP SSE.
-The [packed RPC consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/packed-consumer/runtime.mts) and
-[packed HTTP consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/packed-consumer/http-runtime.mts) exercise these normalization rules.
+Accumulated streamed queries retain emitted values as supplied, including `undefined` elements
+inside their cached arrays.
diff --git a/apps/docs/src/content/docs/concepts/http-utility-tree.md b/apps/docs/src/content/docs/concepts/http-utility-tree.md
index ad6f26b..7a32b1f 100644
--- a/apps/docs/src/content/docs/concepts/http-utility-tree.md
+++ b/apps/docs/src/content/docs/concepts/http-utility-tree.md
@@ -6,6 +6,7 @@ description: Understand literal HTTP identifiers, top-level groups, and omitted
`createHttpApiQueryUtils` builds and freezes an HTTP utility tree when you call it with a literal
Effect HttpApi declaration. Buffered endpoints without multipart have ordinary query, infinite-query,
and mutation builders. Buffered multipart endpoints have mutation builders only, regardless of HTTP method.
+Endpoints with one SSE success expose accumulated and live streamed-query builders.
| Declaration | Generated path |
| ------------------------------------------ | ----------------------------------- |
@@ -21,21 +22,28 @@ Every retained branch and endpoint has `key()`. Top-level groups have no branch
custom key encoders still use their declaration group identifier. The factory rejects unsafe
names, collisions, and invalid encoder configuration before returning any utilities.
-The factory omits an entire endpoint if any success alternative streams, including a stream
-wrapped with response headers, or any request alternative uses streaming multipart. It also omits groups
-containing only omitted endpoints. It never keeps just the buffered alternatives of a partially
-supported endpoint. Contradictory multipart metadata causes factory construction to fail. HTTP
-streams and streaming multipart remain deferred; use the ready client directly when you need them.
+| Endpoint success/payload | Generated cache views |
+| ------------------------------------------ | ------------------------------------------------------------ |
+| Buffered without multipart | Ordinary, infinite and mutation builders; buffered metadata |
+| Any buffered multipart payload alternative | Mutations only, including mixed plain/multipart alternatives |
+| Single SSE success without multipart | Accumulated history and latest-value views |
+
+SSE events retain decoded response-header wrappers. Decoder policy contributes to both view
+keys; accumulated keys also include retention and refetch policy. Endpoint prefixes select all
+policies. See [HTTP Factory](/effect-api-query/reference/http-factory/) for exact builders.
+
+Raw byte streams, mixed buffered/SSE successes, SSE endpoints with multipart payloads, and streaming
+multipart requests omit the complete endpoint. Groups containing only omitted endpoints disappear.
+Contradictory multipart metadata causes factory construction to fail. Use the ready client directly
+for unsupported streams; applications own byte sinks, reconnection, and resume policy.
Any buffered multipart payload alternative makes the endpoint mutation-only, including an endpoint
that also accepts ordinary payloads. Its leaf exposes `key()`, `mutationKey()`, and `mutationOptions()`.
Files and other mutation variables do not become cache identity, so these leaves require no key
encoder and reject encoder entries. See [upload a file](/effect-api-query/guides/http-queries-and-mutations/#upload-a-file).
-Raw-response modes are also deferred. Generated calls force decoded-only responses and exclude
-response controls from their input. See the [HTTP factory](/effect-api-query/reference/http-factory/)
+Raw response objects remain omitted. Ordinary queries, mutations, and SSE views use decoded-only
+responses; buffered metadata views copy status and headers alongside decoded data. Response
+controls are excluded from request input. See the [HTTP factory](/effect-api-query/reference/http-factory/)
for request, response, and builder contracts, and [Semantic Keys](/effect-api-query/concepts/semantic-keys/)
for the `http` namespace.
-
-The [public HTTP type consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/http-contract.ts)
-and [factory runtime tests](https://github.com/ueberBrot/effect-api-query/blob/main/tests/create-http-api-query-utils.test.ts) check these projection rules.
diff --git a/apps/docs/src/content/docs/concepts/queries-and-mutations.md b/apps/docs/src/content/docs/concepts/queries-and-mutations.md
index c3d167b..cdc0a38 100644
--- a/apps/docs/src/content/docs/concepts/queries-and-mutations.md
+++ b/apps/docs/src/content/docs/concepts/queries-and-mutations.md
@@ -1,38 +1,51 @@
---
-title: Query and Mutation Operations
-description: Choose queries, mutations, pagination, or streams for your API calls.
+title: Generated Utility Model
+description: Understand the contract, input, data, error, and cache identity carried by generated leaves.
---
-Every unary RPC leaf and buffered HTTP endpoint without multipart has query, infinite-query,
-and mutation builders. Your application chooses how to use each operation; neither the RPC
-definition nor the HTTP method determines the builder. Buffered multipart HTTP endpoints expose
-mutations only. HTTP stream builders are deferred.
+A factory combines an Effect declaration with its ready client and a caller-supplied key prefix.
+It eagerly builds an immutable utility tree. Branches represent declaration namespaces;
+leaves represent RPCs or supported HTTP endpoints. Each leaf supplies the builders for the views
+its contract supports.
-Use a query when TanStack should cache a result by semantic request identity. For RPCs with a
-payload, the query key contains the normalized, canonical payload. TanStack can refetch or cancel the query.
+## What a generated leaf carries
-Use a mutation when the call represents an action or write. Pass variables when the mutation
-runs; their values do not become part of the mutation key.
+| Part | Contract |
+| ----------------- | ------------------------------------------------------------------------------------------ |
+| Input | RPC payload constructor input or the complete decoded HTTP request |
+| Query data | Decoded data for the selected cache view, before an observer's `select` |
+| Execution failure | Declaration identity plus the complete Effect Cause from a failed Exit |
+| Cache identity | Caller prefix, adapter/declaration path, view, canonical input, and applicable view policy |
+| Options | Generated key and function with the applicable native TanStack options |
-Use an infinite query when TanStack should accumulate paginated results. Map each page parameter
-to an RPC payload or complete decoded HTTP request; the mapped initial request becomes part of
-the semantic key. Keep stable filters in every page request. See
-[HTTP pagination](/effect-api-query/guides/http-queries-and-mutations/#load-pages) or
-[RPC pagination](/effect-api-query/reference/generated-builders/#build-an-infinite-query).
+Ordinary buffered reads cache decoded data. Infinite queries cache pages and page parameters.
+Accumulated streamed queries cache emissions in order; live queries cache the latest value.
+HTTP metadata caches decoded data beside immutable status and raw-header snapshots.
+Mutation variables are execution input and do not become mutation-key identity.
-Use an accumulated streamed query when the application needs every emitted value in order. Use a
-live query when it needs only the latest emitted value. Both operations close their stream iterator
-when TanStack cancels the query.
+See [Feature Support](/effect-api-query/getting-started/feature-support/) for supported contract
+shapes. [RPC Utility Tree](/effect-api-query/concepts/rpc-utility-tree/) explains dotted tags;
+[HTTP Utility Tree](/effect-api-query/concepts/http-utility-tree/) explains literal group and endpoint
+identifiers and omitted endpoints.
-```ts
-const user = useQuery(rpcQuery.users.get.queryOptions({ input: { id: 1 } }))
+## Keep input, cached data, and observer data distinct
-const removeUser = useMutation(rpcQuery.users.delete.mutationOptions())
-removeUser.mutate({ id: 1 })
-```
+RPC constructors can supply defaults before key preparation. HTTP builders accept decoded request
+containers without RPC construction. Equivalent canonical input shares identity, while distinct
+views remain separate. See [Inputs and Query Data](/effect-api-query/concepts/data-normalization/)
+and [Semantic Keys](/effect-api-query/concepts/semantic-keys/).
-After a successful mutation, invalidate the affected query prefix explicitly. The package does not
-infer relationships between API operations.
+An observer's `select` projects data without changing the cached representation. Buffered and
+live `undefined` values become `null`; mutation results and accumulated stream elements retain
+`undefined`. Infer these types from the generated leaf when extracting reusable application code.
-The [public RPC consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/public-contract.ts) and
-[public HTTP consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/http-contract.ts) check these builder and hook contracts.
+## Ownership at the boundary
+
+The package owns generated keys/functions, view identity, and adaptation of failed Effect Exits.
+TanStack owns caching, observers, retries, invalidation, and framework hooks. The application owns
+ready clients, runtimes, transport, authentication, providers, lifecycle, and relationships between
+writes and reads.
+
+The same generated options work in native QueryClient calls, framework hooks, and router loaders.
+[Defaults and Policies](/effect-api-query/guides/query-defaults/) keeps reusable policy attached to
+the leaf's types. [Integrations](/effect-api-query/integrations/) shows each consumer's wiring.
diff --git a/apps/docs/src/content/docs/concepts/semantic-keys.md b/apps/docs/src/content/docs/concepts/semantic-keys.md
index f6305cc..0f8dffe 100644
--- a/apps/docs/src/content/docs/concepts/semantic-keys.md
+++ b/apps/docs/src/content/docs/concepts/semantic-keys.md
@@ -21,8 +21,11 @@ The default process is:
3. Canonicalize strict JSON by sorting object keys recursively.
4. Store the canonical key payload in a flat, prefix-matchable query key.
-The generated `queryKeyHashFn` serializes the already-canonical key so TanStack Query uses the same
-identity as the key builders.
+QueryClient owns hashing through its global and prefix defaults. Generated options omit hash
+fields so fetching, stream publications, and native `getQueryData`/`setQueryData` calls address the
+same cache entry. Builders reject per-call `queryKeyHashFn` and `queryHash` overrides.
+Configure hashing before cache use and keep it stable while entries remain. A stream execution
+rejects with `UnsupportedQueryHash` if changed hashing conflicts with a matching cached entry.
Key objects cannot contain `__proto__` or `constructor` properties at any depth. This applies to
prefixes, Schema output, and custom encoder output.
@@ -35,6 +38,12 @@ Every RPC operation adds its own segment after the RPC path: `query`, `infinite`
keep different cache shapes from colliding while root, branch, and RPC prefixes continue to match
all descendant operations.
+Accumulated-stream keys also include normalized retention and refetch policy. Unlimited/reset is
+the default identity; different bounds or modes have separate cache entries. Supply the same policy
+to `streamedKey` and `streamedOptions` for exact cache access. Broad prefixes continue to match all
+views. Treat the concrete suffix as opaque. Applications persisting query data choose schema and
+key-version busters as described in [Switch Cache Owners](/effect-api-query/guides/switch-cache-owners/).
+
Unsupported values, failed construction, and failed encoding raise `EffectRpcQueryKeyError` before
network execution. Payloads whose encoding needs services or that contain redacted values require a
[custom key encoder](/effect-api-query/guides/custom-key-encoders/).
@@ -47,8 +56,5 @@ infer every possible equivalence between HTTP requests.
Client middleware does not contribute to that declared identity. Include safe user, tenant, or
other identifiers in the caller prefix when they affect results. See the
-[HTTP factory reference](/effect-api-query/reference/http-factory/#cache-identity-and-failures) and
+[HTTP factory reference](/effect-api-query/reference/http-builders/#cache-identity-and-failures) and
[HTTP encoder guide](/effect-api-query/guides/custom-key-encoders/#http-requests) for the complete rules.
-
-The [RPC key tests](https://github.com/ueberBrot/effect-api-query/blob/main/tests/create-rpc-query-utils-keys.test.ts) and
-[HTTP key tests](https://github.com/ueberBrot/effect-api-query/blob/main/tests/http-semantic-keys.test.ts) verify canonical identity and its failure cases.
diff --git a/apps/docs/src/content/docs/examples.md b/apps/docs/src/content/docs/examples.md
index 8b3f9cd..186f203 100644
--- a/apps/docs/src/content/docs/examples.md
+++ b/apps/docs/src/content/docs/examples.md
@@ -53,38 +53,17 @@ demo authorization header through its HTTP client middleware.
### Compare HTTP and RPC
-The HTTP panel uses `createHttpApiQueryUtils` from `effect-api-query`; the RPC panels
-use `createRpcQueryUtils` from the same package root. The application owns both ready clients,
-their runners, and the QueryClient. During disposal, it cancels queries before releasing client
-resources.
-
-Use the HTTP directory to read users, load another page, and create or delete a user. Each write
-explicitly invalidates both generated user prefixes, so the RPC directory reflects HTTP writes
-and the HTTP directory reflects RPC writes. The two adapters retain separate cache keys.
-Choose **Reset directory** to restore the deterministic shared data.
-
-The HTTP user selector passes `skipToken` until a user is selected. HTTP request inputs use
-structured decoded parts such as `params`, `query`, and `payload`; RPC inputs retain their
-payload-constructor defaults. Deleting a user demonstrates an HTTP no-content mutation whose
-result remains `undefined`.
-
-Trigger the HTTP failure to inspect `EffectHttpApiQueryError` and its preserved `Cause`.
-The package adds declaration identifiers to error metadata; upstream Causes can still contain
-request, response, or schema issue values.
-
-Choose **Start slow HTTP query**, wait for **HTTP: Ready to cancel**, then choose
-**Cancel HTTP query**. After the HTTP request aborts, the example observes server interruption for
-that operation. Each panel owns a distinct operation ID, so cancelling an RPC query leaves a
-concurrent HTTP query running. This cancels observation and work in this handler; it does not
-compensate completed mutations. The RPC cancellable-command panel demonstrates explicit domain
-cancellation.
-
-The executable sources are
-[application ownership](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/lib/application.ts),
-[HTTP contracts](https://github.com/ueberBrot/effect-api-query/tree/main/examples/contracts/src), and
-[server handlers](https://github.com/ueberBrot/effect-api-query/tree/main/examples/server/src).
-The repository type-checks the application against the public package root and exercises it
-through the real server and browser suites.
+| Try | Observable result | Complete source |
+| ------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
+| Create/delete a user in either directory | Both adapters refresh through explicit cross-prefix invalidation | [application.ts](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/lib/application.ts) |
+| Trigger a declared HTTP failure | HTTP execution metadata and preserved Cause | [http-section.tsx](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/components/sections/http-section.tsx) |
+| Start a slow query, wait for **Ready to cancel**, then cancel | Only that operation is interrupted; completed writes remain | [Cancellation](/effect-api-query/guides/cancellation/) |
+| Switch cache owner or reload | Private caches retire; allowlisted directory DTOs may persist | [owner-cache.ts](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/lib/owner-cache.ts) |
+
+Copy [shared contracts](https://github.com/ueberBrot/effect-api-query/tree/main/examples/contracts/src),
+[ready-client ownership](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/lib/application.ts),
+and [server handlers](https://github.com/ueberBrot/effect-api-query/tree/main/examples/server/src).
+The application owns clients, runners, providers, cross-adapter invalidation and disposal.
## Run TanStack Start
@@ -92,45 +71,39 @@ through the real server and browser suites.
vp run tanstack-start-dev
```
-This task starts one full-stack process. The browser and server-rendering clients call the
-Start application's `/rpc` and `/api/$` routes. Choose **HTTP users** to inspect the server-rendered directory
-and first page, reuse the hydrated cache, and try the same HTTP operations as in Vite React.
-Choose **HTTP SSR failure** to see the browser retry a failed server query that was omitted
-from dehydration.
+This task starts one full-stack process at `http://127.0.0.1:3000`, serving `/rpc` and `/api/$`.
+Choose **HTTP users** for server-rendered data and hydrated navigation, or **HTTP SSR failure**
+for browser refetch of a failure omitted from dehydration. Each request owns its cache and
+clients; the browser owns separate resources.
-Server rendering uses the trusted origin `http://127.0.0.1:3000`. If the Start server listens
-elsewhere, set the server-only `EXAMPLE_API_ORIGIN` environment variable to its HTTP(S) origin,
-without a path, credentials, query, or fragment. Browser requests stay on the same origin.
-See [TanStack Start](/effect-api-query/guides/tanstack-start/) for request ownership, authentication,
-cache isolation, and hydration setup.
+Copy the [router](https://github.com/ueberBrot/effect-api-query/blob/main/examples/tanstack-start/src/router.tsx),
+[SSR codecs](https://github.com/ueberBrot/effect-api-query/blob/main/examples/tanstack-start/src/lib/query-ssr.ts),
+and [failure route](https://github.com/ueberBrot/effect-api-query/blob/main/examples/tanstack-start/src/routes/http-failure.tsx).
+See [TanStack Start](/effect-api-query/guides/tanstack-start/) for the library integration.
-## Pause a query until a user is selected
+## Try cancellable commands
+
+Use the **Cancellable commands** panel to run two commands with independent operation IDs and
+cancel one while the other progresses. The [complete workflow](/effect-api-query/examples/cancellable-commands/)
+explains its start/status/cancel protocol, same-ID retries, and application-owned workers.
-In either application, find **Choose before fetching**. With **No user selected**, the generated
-query uses `{ input: skipToken }` and sends no lookup request. Select **User 2: Edsger Dijkstra** to
-load the user summary, then clear and reselect it within 30 seconds to reuse the cached result.
+## Pause a query until a user is selected
-The skipped and active queries preserve the same `select` and `staleTime` options. The example uses
-ordinary `useQuery`; the TanStack Start loader leaves this interactive query paused during server rendering.
+In either app's **Choose before fetching** panel, **No user selected** sends no lookup.
+Select a user to fetch its summary; clear and reselect within 30 seconds to reuse the cache.
+Skipped and active options retain the same `select` and `staleTime`.
## Compare full and bounded stream history
-In either application, let the diagnostic stream finish, then choose **Replay newest 2**.
-The accumulated history retains only "Workspace synchronized" and "Ready"; earlier updates disappear
-as new ones arrive. Choose **Replay full history** to retain all four states again. The live query
-continues to show only "Ready".
-
-The bounded replay supplies `maxChunks: 2` to `streamedOptions`. Both controls reuse the generated
-streamed key: the bound changes retention policy, not RPC identity. The application keeps the selected
-policy for subsequent refetches. TanStack Start also demonstrates this after hydrating its server snapshot.
+After diagnostics finish, **Replay newest 2** retains the latest two states; **Replay full history**
+retains all four. The live view shows only the latest state. Each accumulated policy has its own
+key. See [Choose Stream History](/effect-api-query/guides/choose-stream-history/).
## Inspect request-local metadata
-In either application's diagnostics panel, choose **Trigger declared failure**. Its generated
-mutation options supply the `x-request-source: diagnostics-panel` RPC header. Application-wide
-authorization still comes from the shared client runner. The same `rpcOptions` input works with
-queries, infinite queries, and both stream builders; see
-[Generated Builders](/effect-api-query/reference/generated-builders/#request-local-rpc-options).
+**Trigger declared failure** supplies the request-local `x-request-source: diagnostics-panel`
+RPC header while shared authorization stays on the client runner. See
+[Request-local RPC Options](/effect-api-query/reference/generated-builders/#request-local-rpc-options).
## Build the examples
diff --git a/apps/docs/src/content/docs/examples/cancellable-commands.md b/apps/docs/src/content/docs/examples/cancellable-commands.md
new file mode 100644
index 0000000..3958b94
--- /dev/null
+++ b/apps/docs/src/content/docs/examples/cancellable-commands.md
@@ -0,0 +1,104 @@
+---
+title: Cancellable Commands
+description: Run the example's explicit command protocol without treating mutation cancellation as rollback.
+---
+
+This application workflow demonstrates long-running server work with an operation ID, observable
+progress, and an explicit cancellation request. Run the
+[Vite React example](/effect-api-query/examples/#run-vite-react) and use the **Cancellable commands**
+panel. The Start application serves the same contract and handlers.
+
+The library supplies ordinary generated query and mutation options. The application supplies the
+command protocol, server workers, progress policy, and retention. For query signals and iterator
+cleanup, see the [Cancellation contract](/effect-api-query/guides/cancellation/).
+
+## Cancel a command while its mutation is pending
+
+Use an explicit cancel RPC for long-running commands. The Vite React example provides
+`commands.start`, `commands.status`, and `commands.cancel` in the shared contract. Each command
+has a client-generated operation ID. The start mutation waits for a terminal result; a separate
+query observes progress, and a separate mutation requests cancellation.
+
+In the React component setup, import `useState`, `useQuery`, and `useMutation` from their native
+packages. With the example's ready `rpcQuery` and QueryClient:
+
+```ts
+const [operationId] = useState(() => crypto.randomUUID())
+const input = { operationId }
+const reconcile = async () => {
+ await queryClient.invalidateQueries({
+ queryKey: rpcQuery.commands.status.queryKey(input),
+ })
+}
+
+const start = useMutation(rpcQuery.commands.start.mutationOptions({ onSettled: reconcile }))
+const cancel = useMutation(rpcQuery.commands.cancel.mutationOptions({ onSettled: reconcile }))
+const status = useQuery(
+ rpcQuery.commands.status.queryOptions({
+ input,
+ enabled: start.status !== 'idle',
+ refetchInterval: (query) =>
+ query.state.data?.state === 'running' ||
+ query.state.status === 'error' ||
+ query.state.data === undefined ||
+ (query.state.data === null && start.isPending)
+ ? 100
+ : false,
+ }),
+)
+```
+
+In the start and cancel button handlers, call the corresponding mutation:
+
+```ts
+start.mutate(input)
+cancel.mutate(input)
+```
+
+Disable start while pending, after success, or when status confirms an accepted command.
+After a failed start with no accepted command, retry with the same operation ID; an uncertain
+response must not create a second command. Disable cancel before start, while cancellation is
+pending, or after a terminal status. The
+[complete command panel](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/components/sections/commands-section.tsx)
+includes the UI.
+
+The cancel handler signals the worker and waits until it has stopped. The cancel mutation's
+`onSettled` callback then invalidates the generated status key. The active query refetches the
+server's status even if the cancel request failed. Poll unresolved or failed status reads and
+running commands. Stop at a terminal status, or when a settled start has no corresponding command.
+The application chooses this invalidation policy.
+
+A cancelled command returns `{ state: 'cancelled', ... }` successfully. TanStack therefore reports
+both mutations as `success` and runs their normal callbacks. The domain state does not add a
+`cancelled` MutationCache state. Each operation ID has its own query key and worker, so cancelling
+one command leaves another running.
+
+Run the Vite React example and use the **Cancellable commands** panel to try two concurrent
+commands. The TanStack Start application hosts the same contract and handlers at `/rpc`; its
+`application.rpcQuery.commands` exposes these same framework-neutral options for hooks, loaders,
+and QueryClient. It can reuse the workflow above with its own QueryClient.
+
+## Choose what cancellation means
+
+| Action | Result |
+| ------------------------- | ------------------------------------------------------------------------------------------- |
+| Stop observing a query | Removes local observation; whether work stops depends on the query lifecycle and transport. |
+| Interrupt an Effect | Requests cooperative interruption and runs its finalizers. |
+| Call `commands.cancel` | Requests cooperative server cancellation by operation ID and waits for a terminal state. |
+| Compensate committed work | Requires a separate application operation that reverses or offsets prior effects. |
+
+Transport interruption is cooperative and depends on transport support. An explicit cancel RPC is the
+durable application contract for requesting server cancellation. The slow-query demo
+adds a transport-specific `diagnostics.cancel` call when its local Effect is interrupted; the
+package itself does not provide that behavior.
+
+The command example owns workers in the server Scope. Unmounting a view or interrupting the
+client's wait does not cancel these workers automatically. A cancel request stops future steps;
+completed steps remain recorded. Cancellation after completion returns the completed result without
+promising a rollback. Repeating a start with the same ID returns the existing result; a cancel
+that arrives before start reserves that ID as cancelled.
+
+This example stores operation records in memory until the example is reset or the server stops.
+Production applications need their own authorization, durable storage, and retention policy if
+operations must survive restarts. The explicit RPC contract does not make this in-memory example
+a durable job queue.
diff --git a/apps/docs/src/content/docs/getting-started/compatibility-and-stability.md b/apps/docs/src/content/docs/getting-started/compatibility-and-stability.md
index f605a6c..dbeebb0 100644
--- a/apps/docs/src/content/docs/getting-started/compatibility-and-stability.md
+++ b/apps/docs/src/content/docs/getting-started/compatibility-and-stability.md
@@ -7,16 +7,17 @@ Both factories use the same public `effect-api-query` package root and peer depe
The package's [manifest](https://github.com/ueberBrot/effect-api-query/blob/main/package.json)
defines peer requirements; the [workspace catalog](https://github.com/ueberBrot/effect-api-query/blob/main/pnpm-workspace.yaml)
records the versions tested in this repository. See the
-[compatibility reference](/effect-api-query/reference/compatibility-and-limits/) for how these
-requirements are tested.
+[compatibility reference](/effect-api-query/reference/compatibility-and-limits/) for integration versions and limits.
The package is ESM-only and targets ES2022. Enable strict TypeScript checking.
The tested Effect release is stable, but its RPC and HTTP API modules declare unstable APIs.
-The package therefore pins one exact Effect peer version. Upgrade Effect and this package together.
+The package therefore pins one exact Effect peer version. Keep runtime, testing, and platform
+packages on a compatible coordinated Effect set that matches it. Before changing that set, verify
+the peer requirements and tested integrations of the selected package release.
-The first release is still pending, so breaking changes remain possible. Review the release notes
-when upgrading. Query Core's streamed-query interface is experimental and may change between v5 releases.
+Query Core's streamed-query interface is experimental and may change between v5 releases. Keep
+framework Query wrappers aligned with their application's Query Core version.
Choose the [RPC quick start](/effect-api-query/getting-started/quick-start/) or
[HTTP quick start](/effect-api-query/getting-started/http-quick-start/) for your declaration.
diff --git a/apps/docs/src/content/docs/getting-started/feature-support.md b/apps/docs/src/content/docs/getting-started/feature-support.md
index 6782212..ae4e62b 100644
--- a/apps/docs/src/content/docs/getting-started/feature-support.md
+++ b/apps/docs/src/content/docs/getting-started/feature-support.md
@@ -7,23 +7,23 @@ description: Choose the RPC or HTTP adapter and find its supported TanStack Quer
definitions. Use `createRpcQueryUtils` for RPC and `createHttpApiQueryUtils` for HTTP, both imported
from the package root.
-The [capability matrix](/effect-api-query/reference/compatibility-and-limits/#capability-matrix)
-compares RPC and HTTP support. It lists generated features, tested integrations, application
-responsibilities, deferred operations, and missing upstream integration points.
+Keep your native Effect declarations and ready clients. Effect and your application own the
+server, transport, authentication, and resource lifetime; this package derives the Query-facing
+keys, functions, and options.
## Pick the operation
-Use ordinary queries for cached reads, infinite queries for pagination, and mutations for commands.
-Unary RPCs and buffered HTTP endpoints without multipart provide all three builders. Buffered
-multipart HTTP endpoints provide mutations only. Writes refresh cached reads only when your
-application invalidates the affected keys.
+| Contract | Available views | Details |
+| -------------------------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| Unary RPC / buffered nonmultipart HTTP | Query, infinite query, mutation | [RPC Builders](/effect-api-query/reference/generated-builders/), [HTTP Factory](/effect-api-query/reference/http-factory/) |
+| Buffered nonmultipart HTTP | Separate decoded data/status/header metadata | [ETag workflow](/effect-api-query/guides/http-metadata/#update-with-an-etag) |
+| Buffered multipart HTTP | Mutation with explicit `FormData` | [Upload](/effect-api-query/guides/http-queries-and-mutations/#upload-a-file) |
+| RPC stream / unambiguous HTTP SSE | Accumulated history or latest value | [Choose Stream History](/effect-api-query/guides/choose-stream-history/) |
-RPC streams also have `streamedOptions` to accumulate values and `liveOptions` to retain the latest
-value. Buffered multipart HTTP uploads accept explicit `FormData` through `mutationOptions`;
-see [upload a file](/effect-api-query/guides/http-queries-and-mutations/#upload-a-file).
-HTTP streams, streaming multipart, and raw-response modes are deferred. The factory omits an
-HTTP endpoint from the generated utility tree if it has any streaming success or streaming multipart
-request alternative.
+Use queries for cached reads and mutations for commands; writes refresh reads only when the
+application invalidates them. Raw byte streams, mixed buffered/SSE successes, streaming
+multipart and raw-response modes are omitted, as are SSE endpoints with multipart payloads.
+See [Compatibility and Limits](/effect-api-query/reference/compatibility-and-limits/).
## Plan application ownership
@@ -35,8 +35,5 @@ Include a safe user or tenant identity in `keyPrefix` whenever client configurat
returned data. Keep credentials out of keys. See [semantic keys](/effect-api-query/concepts/semantic-keys/)
and [client lifecycle](/effect-api-query/concepts/client-lifecycle/).
-Start with the [RPC tutorial](/effect-api-query/getting-started/quick-start/) or
-[HTTP tutorial](/effect-api-query/getting-started/http-quick-start/), then use the shared guides for
-[conditional queries](/effect-api-query/guides/conditional-queries/),
-[cache management](/effect-api-query/guides/cache-management/), and
-[cancellation](/effect-api-query/guides/cancellation/).
+Start with the [RPC Quick Start](/effect-api-query/getting-started/quick-start/) or
+[HTTP Quick Start](/effect-api-query/getting-started/http-quick-start/).
diff --git a/apps/docs/src/content/docs/getting-started/http-quick-start.md b/apps/docs/src/content/docs/getting-started/http-quick-start.md
index 1fa18c7..887d1e4 100644
--- a/apps/docs/src/content/docs/getting-started/http-quick-start.md
+++ b/apps/docs/src/content/docs/getting-started/http-quick-start.md
@@ -1,21 +1,16 @@
---
title: HTTP Quick Start
-description: Declare an HttpApi, own a ready client, and run a generated query and mutation.
+description: Acquire an HttpApiClient and use generated query and mutation options.
---
-This tutorial connects an Effect HttpApi client to TanStack Query Core. You will declare two
-endpoints, acquire a ready client, read a user, and create another user.
+First [install the package](/effect-api-query/getting-started/installation/). The server must
+serve the same `usersApi` contract at `http://localhost:3000`. Share the contract between your
+server and browser application.
-First [install the package](/effect-api-query/getting-started/installation/). Use a server at
-`http://localhost:3000` that implements the declaration below and has an existing user with ID `1`.
-Change the base URL to your server. For browser requests, configure the server's CORS policy to
-allow the application's origin.
-For complete HTTP handlers and applications, [run the examples](/effect-api-query/examples/).
+## Acquire the client and execute requests
-## Declare, connect, and call
-
-Save this as `http-client.ts` in your application. Share the HttpApi declaration with your server;
-keep the runtime, client, and `QueryClient` in the application that manages their lifetime.
+This complete module defines the API, acquires the ready client through a ManagedRuntime,
+reads a user, writes a user, and releases its resources. Replace the base URL with your server.
```ts
import { MutationObserver, QueryClient } from '@tanstack/query-core'
@@ -73,35 +68,30 @@ try {
}
```
-`HttpApiClient.make` creates a ready client using the application's Fetch runtime. Pass that same
-runtime's `runPromiseExit` to the factory so generated calls use that runner and
-forward TanStack's query abort signal.
-
-HTTP input is the client's decoded request, with the `params`, `query`, `headers`, and `payload`
-containers declared by the endpoint. Pass `id` as a number; the client handles its wire encoding.
-The POST mutation receives `{ payload: { name: 'Ada' } }`.
-
-The request must supply `query: { locale: 'en' }` even though `locale` has a constructor default.
-HTTP builders do not construct RPC payloads or fill constructor defaults.
-
-Groups and endpoint identifiers retain their literal names. `users` and `get` produce
-`http.users.get`; a name containing a dot would require bracket access. A group declared with
-`topLevel: true` places its endpoints at the utility root.
-
-## Choose cache and resource ownership
-
-Buffered endpoints without multipart offer both query and mutation builders, regardless of HTTP method.
-Buffered multipart endpoints expose mutations only; see [upload a file](/effect-api-query/guides/http-queries-and-mutations/#upload-a-file).
-Choose a query for an idempotent cached read and a mutation for a command. After a write, invalidate
-the affected keys explicitly. RPC and HTTP have separate key namespaces, so applications that
-expose the same resource through both must invalidate the affected keys in both namespaces.
-
-The `finally` block cancels queries, clears the cache, and disposes the runtime. In a UI, keep these
-resources alive for the application lifetime and settle pending mutations before disposal. Include
-a safe user or tenant identity in `keyPrefix` whenever client configuration affects returned data.
-
-The repository compiles this complete snippet against the public package root in
-[`tests/types/docs-http-quick-start.ts`](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/docs-http-quick-start.ts)
-and checks that this page matches it. Continue with
-[HTTP queries and mutations](/effect-api-query/guides/http-queries-and-mutations/) and the
-[HTTP factory reference](/effect-api-query/reference/http-factory/).
+HTTP input is the **decoded request**. Supply the endpoint's declared `params`, `query`, `headers`,
+and `payload` containers; the client handles wire encoding. HTTP builders do not apply Schema
+constructor defaults: this request explicitly supplies `locale: 'en'`.
+
+The runtime provides the HTTP transport and forwards TanStack's signal through `runPromiseExit`.
+Keep the runtime and client resources alive while queries and mutations use them. Invalidation is
+application policy; this example refreshes the `users` endpoint prefix after creation.
+
+Buffered nonmultipart endpoints offer query and mutation builders regardless of HTTP method;
+buffered multipart endpoints offer mutations only. Literal group/endpoint names become utility
+paths; dots require bracket access, and `topLevel: true` places endpoints at the root.
+See [HTTP Factory](/effect-api-query/reference/http-factory/).
+
+## Keep a browser client alive
+
+The module above awaits its mutation before disposal. For components, acquire once before
+mounting and keep the client alive for the application lifetime. Follow
+[React client setup](/effect-api-query/guides/react-query/#acquire-and-mount-the-client) for a complete provider,
+component, and cleanup callback.
+
+For streams or concurrent writes, follow
+[Client Lifecycle](/effect-api-query/concepts/client-lifecycle/) before disposal. Continue with
+[pagination](/effect-api-query/guides/pagination/),
+[streaming](/effect-api-query/guides/streaming/), or
+[HTTP metadata](/effect-api-query/guides/http-metadata/).
+For request containers and file uploads, use
+[HTTP Requests and Uploads](/effect-api-query/guides/http-queries-and-mutations/).
diff --git a/apps/docs/src/content/docs/getting-started/installation.md b/apps/docs/src/content/docs/getting-started/installation.md
index f2f8f63..60d4c3d 100644
--- a/apps/docs/src/content/docs/getting-started/installation.md
+++ b/apps/docs/src/content/docs/getting-started/installation.md
@@ -14,7 +14,7 @@ by the package. If your application already pins Effect or disables automatic pe
install the Effect version from the package's `peerDependencies` and resolve any peer mismatch
before continuing. The [package manifest](https://github.com/ueberBrot/effect-api-query/blob/main/package.json)
and [workspace catalog](https://github.com/ueberBrot/effect-api-query/blob/main/pnpm-workspace.yaml)
-are the source for supported and tested versions.
+define peer requirements and repository integration versions.
React applications also need `@tanstack/react-query`, matching their Query Core version:
@@ -23,8 +23,7 @@ pnpm add @tanstack/react-query
```
Use strict TypeScript checking, ESM, and an ES2022-capable application. See the
-[compatibility reference](/effect-api-query/reference/compatibility-and-limits/) for the tested
-compiler and framework integrations.
+[compatibility reference](/effect-api-query/reference/compatibility-and-limits/) for compiler and framework versions.
-Continue with the [RPC quick start](/effect-api-query/getting-started/quick-start/) or
-[HTTP quick start](/effect-api-query/getting-started/http-quick-start/).
+Continue with the [HTTP API quick start](/effect-api-query/getting-started/http-quick-start/) or
+[RPC quick start](/effect-api-query/getting-started/quick-start/).
diff --git a/apps/docs/src/content/docs/getting-started/quick-start.md b/apps/docs/src/content/docs/getting-started/quick-start.md
index 9361b7f..c47bb68 100644
--- a/apps/docs/src/content/docs/getting-started/quick-start.md
+++ b/apps/docs/src/content/docs/getting-started/quick-start.md
@@ -1,21 +1,16 @@
---
title: RPC Quick Start
-description: Declare an RPC group, own a ready client, and run a generated query and mutation.
+description: Acquire an RPC client and use generated query and mutation options.
---
-This tutorial connects an Effect RPC client to TanStack Query Core. You will declare two operations,
-acquire a ready flat client, read a user, and create another user.
+First [install the package](/effect-api-query/getting-started/installation/). The server must
+serve the same `usersRpc` contract at `http://localhost:3000/rpc` with Effect's JSON RPC protocol.
+Share the contract between your server and browser application.
-First [install the package](/effect-api-query/getting-started/installation/). Use a server at
-`http://localhost:3000/rpc` that implements the declaration below with JSON RPC serialization.
-The server must have an existing user with ID `1`. Change the URL to your server. For browser
-requests, configure the server's CORS policy to allow the application's origin. For a complete
-server and browser application, [run the examples](/effect-api-query/examples/).
+## Acquire the client and execute requests
-## Declare, connect, and call
-
-Save this as `rpc-client.ts` in your application. The declaration belongs in a shared module when
-you connect your own server and client. Only the client application imports `effect-api-query`.
+This complete module defines the contract, acquires a ready flat client, reads a user, writes a
+user, and releases its resources. Replace the URL with your server's RPC endpoint.
```ts
import { MutationObserver, QueryClient } from '@tanstack/query-core'
@@ -75,31 +70,28 @@ try {
}
```
-`RpcClient.make(..., { flatten: true })` acquires the ready client inside the application's scope.
-The factory derives the utility tree from that client and uses `Effect.runPromiseExit`
-unless you supply a custom runner.
-
-The query accepts the RPC payload's constructor input. Here `{ id: 1 }` is valid because the
-schema constructor supplies `locale: 'en'`. Use deterministic constructor defaults: key preparation
-and ready-client execution construct the payload separately.
+Dotted tags become nested paths: `users.get` becomes `rpc.users.get`. The factory uses
+`Effect.runPromiseExit` by default; supply a signal-aware `runPromiseExit` when execution needs
+services. Keep the client's Scope and runner alive while the utilities are used.
-Dotted RPC tags become nested properties: `users.get` becomes `rpc.users.get`. The query returns
-a decoded user. Pass mutation variables to `mutate`, then invalidate the cached reads affected by
-the write.
+Query input is the RPC payload's **constructor input**: `{ id: 1 }` works because its constructor
+supplies `locale: 'en'`. Defaults must be deterministic because key preparation and client execution
+construct the payload separately. The decoded response is the query data; each mutation receives
+its own variables when `mutate` runs.
-## Keep the owner alive
+Invalidation is application policy. This example refreshes all `users` reads after creation.
+A safe user or tenant identity belongs in `keyPrefix` when it affects returned data; credentials
+do not. RPC and HTTP keys have separate namespaces.
-The `finally` block cancels queries, clears their cache, and closes the client scope even when a
-call fails. This short program waits for its mutation before cleanup. In a UI, keep the owner alive
-for the application lifetime and settle pending mutations before disposal; query cancellation does
-not cancel mutations.
+## Keep a browser client alive
-Use a safe user or tenant identity in `keyPrefix` when client configuration affects which data
-the client can return. See [Client Lifecycle](/effect-api-query/concepts/client-lifecycle/) and
-[Cache Keys](/effect-api-query/concepts/semantic-keys/) before sharing clients or caches.
+The module above finishes each operation before disposing its resources. For an application,
+acquire once before mounting components and release after unmounting them. Use the
+[React client setup](/effect-api-query/guides/react-query/#acquire-and-mount-the-client) for a provider, component,
+and cleanup callback. Its HTTP client setup can be replaced with the RPC acquisition above.
-The repository compiles this complete snippet against the public package root in
-[`tests/types/docs-rpc-quick-start.ts`](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/docs-rpc-quick-start.ts)
-and checks that this page matches it. Continue with
-[queries and mutations](/effect-api-query/concepts/queries-and-mutations/) or the
-[generated RPC builders](/effect-api-query/reference/generated-builders/).
+Before disposing clients that also serve streams or concurrent mutations, stop consumers and
+drain queries, local stream cleanup, and accepted mutations. Follow
+[Client Lifecycle](/effect-api-query/concepts/client-lifecycle/).
+For hooks, continue with [React Query](/effect-api-query/guides/react-query/); for exact method
+and input contracts, use [RPC Builders](/effect-api-query/reference/generated-builders/).
diff --git a/apps/docs/src/content/docs/guides/angular-query.md b/apps/docs/src/content/docs/guides/angular-query.md
new file mode 100644
index 0000000..fa84c22
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/angular-query.md
@@ -0,0 +1,52 @@
+---
+title: Angular Query
+description: Rebuild generated options from Angular signals and keep client lifetime in the application.
+---
+
+Build generated options inside Angular's reactive accessor so input changes produce a new key
+and query function. This applies to both factories and every generated query view.
+
+The examples target Angular 22.2.1 with Angular Query experimental 5.104.0 and Query Core 5.104.0.
+
+Keep [captured inputs unchanged](/effect-api-query/concepts/data-normalization/#keep-captured-inputs-unchanged)
+while their options can execute.
+
+## Create queries in an injection context
+
+Register `provideTanStackQuery(queryClient)` in your application providers. Construct queries
+inside an Angular injection context and read the signal inside the accessor passed to `injectQuery`.
+Create `rpc` from your [ready client](/effect-api-query/getting-started/quick-start/).
+Here `users.read` accepts `{ id: number }` and returns a user with `name`.
+In an existing component's field initializers, with `signal` from `@angular/core` and
+`injectQuery` from `@tanstack/angular-query-experimental`:
+
+```ts
+readonly id = signal(1)
+readonly user = injectQuery(() =>
+ rpc.users.read.queryOptions({
+ input: { id: this.id() },
+ select: (user) => user.name,
+ }),
+)
+```
+
+Use `injectInfiniteQuery` with `infiniteOptions` and `injectMutation` with `mutationOptions`.
+Supply each mutation's input through its execution variables. Angular query results expose
+signals such as `data()`, `error()`, and `fetchStatus()`.
+
+Use the same accessor for `streamedOptions`, `liveOptions`, and HTTP `metadataOptions`.
+
+## Choose native options carefully
+
+Angular's defined-data overload accepts a query function rather than `skipToken`. A skipped query
+therefore retains `undefined` in its `data()` type even when it has defined `initialData`. An
+initial-data function that may return `undefined` also produces optional result data.
+
+## Own the native integration
+
+Follow the [shared integration lifetime](/effect-api-query/integrations/#own-the-cache-and-client-lifetime)
+for providers, observer removal, stream finalizers, and accepted mutations. Match this native
+wrapper to the application's Query Core and the framework's supported compiler/tooling.
+
+Angular core, common, compiler, and platform-browser should share one release. Server rendering
+and hydration remain application integrations.
diff --git a/apps/docs/src/content/docs/guides/cache-filters.md b/apps/docs/src/content/docs/guides/cache-filters.md
new file mode 100644
index 0000000..85b6428
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/cache-filters.md
@@ -0,0 +1,149 @@
+---
+title: Cache Keys and Filters
+description: Read typed entries and target native cache operations with generated prefixes and exact keys.
+---
+
+Use a generated concrete key for typed `getQueryData` and `setQueryData`. Use root, branch, leaf,
+or view prefixes for native `invalidateQueries`, `cancelQueries`, and query-state filters.
+Import `viewPrefix` from `effect-api-query` to select one supported cache view. Choose the scope before
+adding `type`, `stale`, `fetchStatus`, or `predicate` conditions:
+
+| Scope | Key | Matches |
+| --------------------- | ------------------------------------------------------ | ---------------------------------------------------------------------- |
+| Root | `rpc.key()` or `http.key()` | All cached query views in that utility tree |
+| Branch | `rpc.users.key()` | Every descendant leaf and query view |
+| Leaf | `rpc.users.get.key()` | Ordinary and infinite queries; HTTP leaves also include metadata views |
+| Operation | `viewPrefix(rpc.users.get, 'query')` | Ordinary queries for that leaf |
+| Encoded partial input | Operation prefix followed by an encoded partial object | Entries containing those encoded fields |
+| Exact entry | Generated concrete key with `exact: true` | One complete cache identity, including its stream policy |
+
+A streaming leaf prefix includes accumulated and live views. Use `viewPrefix(leaf, 'streamed')`
+or `viewPrefix(leaf, 'live')` to select one representation. HTTP buffered metadata uses `metadata`; pagination uses `infinite`.
+Mutation keys belong to TanStack's separate mutation cache, and query invalidation does not affect
+pending mutations.
+
+## Choose the cache operation
+
+Invalidation refreshes affected reads according to TanStack's native policy. It does not execute
+or cancel pending mutations. The application chooses which read keys a successful write affects.
+
+RPC roots append `rpc` to the caller prefix. HTTP roots append `http` and the HttpApi identifier.
+The factories keep separate caches even when the caller prefix is the same. Use the original
+caller prefix to deliberately match both; use a generated root to match one utility tree.
+
+For response seeding and rollback, follow [Optimistic Updates](/effect-api-query/guides/optimistic-writes/).
+Map delivered domain events with [Refresh from Events](/effect-api-query/guides/refresh-from-events/).
+[Switch Cache Owners](/effect-api-query/guides/switch-cache-owners/) covers private data when
+users, tenants, sessions, or permissions change. [Defaults and Policies](/effect-api-query/guides/query-defaults/)
+uses the same prefixes to register native cache policy.
+
+## Filter RPC queries
+
+These filters assume your own unary `users.get` and streaming `users.watch` declarations share
+these payload fields. In their contract module, import `Effect` and `Schema` from `effect`:
+
+```ts
+const payload = {
+ id: Schema.FiniteFromString,
+ locale: Schema.String.pipe(Schema.withConstructorDefault(Effect.succeed('en'))),
+}
+```
+
+Derive `rpc` from this group and its ready client using the factory setup in
+[RPC Quick Start](/effect-api-query/getting-started/quick-start/). In a cache callback, select
+every locale for user 1 with an encoded partial filter:
+
+```ts
+const queryPrefix = viewPrefix(rpc.users.get, 'query')
+await queryClient.invalidateQueries({
+ queryKey: [...queryPrefix, { id: '1' }],
+ type: 'inactive',
+ stale: false,
+})
+```
+
+For one complete request, preserve its generated DataTag and use `exact: true`:
+
+```ts
+const queryKey = rpc.users.get.queryKey({ id: 1, locale: 'en' })
+const user = queryClient.getQueryData(queryKey)
+await queryClient.invalidateQueries({ queryKey, exact: true })
+```
+
+Partial matching compares stored canonical key payloads. Here `FiniteFromString` encodes the numeric
+constructor input `1` as `"1"`, so the partial object must use `id: "1"`. A raw `id: 1` matches no
+entry. An omitted field places no constraint; specifying `locale: "en"` selects that locale.
+Nested objects match recursively, arrays match by position, and scalar values must match exactly.
+A scalar string filter does not perform substring matching.
+
+Use the concrete builder for complete constructor input. Calling `queryKey({ id: 1 })` materializes
+the default `locale: "en"`; its key therefore cannot express every locale for user 1. Passing only
+`{ locale: "en" }` rejects the missing required `id`. Do not cast partial constructor input into a
+key builder or run it through the full payload constructor to derive a broad filter.
+
+`[...viewPrefix(rpc.users.watch, 'streamed'), { id: '1' }]` stops before the stream-policy suffix and matches every retention bound and
+refetch mode for that encoded user. For one history, use
+`rpc.users.watch.streamedKey({ id: 1 }, { maxChunks: 2, refetchMode: 'append' })` with `exact: true`.
+The omitted policy and explicit unlimited/reset policy share the same normalized identity. Keep the
+remaining concrete suffix opaque; root, branch, leaf, and operation filters survive policy changes.
+
+## Filter HTTP queries
+
+HTTP filters retain labelled request containers. These filters assume your own `users.get`
+declares `id: Schema.FiniteFromString` in each of `params`, `query`, and `payload`, plus
+`'X-Locale': Schema.String` in `headers`. Its `users.watch` SSE endpoint declares
+`query: { id: Schema.FiniteFromString }`.
+
+Derive `http` from that HttpApi and its ready client using the factory setup in
+[HTTP Quick Start](/effect-api-query/getting-started/http-quick-start/). In a cache callback,
+choose the path parameter or header independently:
+
+```ts
+const queryPrefix = viewPrefix(http.users.get, 'query')
+await queryClient.invalidateQueries({ queryKey: [...queryPrefix, { params: { id: '1' } }] })
+await queryClient.invalidateQueries({
+ queryKey: [...queryPrefix, { headers: { 'x-locale': 'en' } }],
+})
+```
+
+For an exact read, supply the complete decoded request to the builder:
+
+```ts
+const key = http.users.get.queryKey({
+ params: { id: 1 },
+ query: { id: 7 },
+ headers: { 'X-Locale': 'en' },
+ payload: { id: 7 },
+})
+const user = queryClient.getQueryData(key)
+```
+
+The leaf prefix also includes metadata and infinite views. For every history policy of a
+`users.watch` request, use `[...viewPrefix(http.users.watch, 'streamed'), { query: { id: '1' } }]`.
+
+Default HTTP keys Schema-encode each request part, omit encoded `undefined` object members, and
+lowercase header names. In this contract, `params: { id: "1" }` is a meaningful partial object;
+`params: { id: 1 }` is not. Filter `headers: { 'x-locale': 'en' }` even when the decoded request uses
+`'X-Locale'`. Preserve `params`, `query`, `headers`, and `payload`: `{ query: { id: "7" } }` and
+`{ payload: { id: "7" } }` select different requests. An unlabelled `{ id: "7" }` matches neither.
+HTTP request input does not use RPC payload construction.
+
+## Bound partial filters to the encoded shape
+
+A custom encoder replaces the default encoded shape. If it returns
+`{ entity: { identifier: "1" }, language: "en" }`, filter by
+`{ entity: { identifier: "1" } }`, using the same operation prefix. `{ id: "1" }` no longer matches.
+If it returns the scalar `"1:en"`, native partial object matching cannot recover the original `id` or
+locale. HTTP custom encoders also replace request labels and header normalization.
+
+Applications that need partial matching can define an explicit JSON object projection in their
+encoder and build filters against that projection. Preserve every safe value that distinguishes
+results. Treat projection changes as cache-identity changes, including persisted-cache version
+busters. For opaque or noninvertible projections, use generated broad prefixes or a generated exact
+key. A custom predicate can inspect only the information retained in the key or other
+application-owned query metadata; it cannot reconstruct omitted input.
+
+Concrete builders retain DataTags for typed `getQueryData` and `setQueryData`. `viewPrefix` returns an immutable ordinary key for supported leaf views; it has no DataTag.
+Manually composed prefixes and partial keys carry no query-data tag, and native `getQueriesData` does not infer a
+homogeneous result from its filter. Keep broad reads as `unknown` until the application establishes
+the matched representation; an explicit generic or cast does not validate cached values.
diff --git a/apps/docs/src/content/docs/guides/cache-management.md b/apps/docs/src/content/docs/guides/cache-management.md
deleted file mode 100644
index 2f1d1b0..0000000
--- a/apps/docs/src/content/docs/guides/cache-management.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: Cache Management
-description: Invalidate and inspect caches with generated prefix keys.
----
-
-Every branch and leaf exposes `key()`. Use these prefixes to match related cache entries:
-
-```ts
-await queryClient.invalidateQueries({ queryKey: rpcQuery.users.key() })
-await queryClient.invalidateQueries({ queryKey: rpcQuery.users.get.key() })
-```
-
-Use `queryKey(input)` for one payload-specific query:
-
-```ts
-const input = { id: 1 }
-const key = rpcQuery.users.get.queryKey(input)
-
-const cachedUser = queryClient.getQueryData(key)
-await queryClient.invalidateQueries({ queryKey: key, exact: true })
-```
-
-Query keys have this flat shape:
-
-```ts
-;[
- ...keyPrefix,
- 'rpc',
- ...rpcTagSegments,
- 'query',
- canonicalPayload, // payload-bearing queries only
-]
-```
-
-Mutation keys end in `'mutation'` and never include variables. See
-[Semantic Keys](/effect-api-query/concepts/semantic-keys/) for normalization and hashing rules.
-
-## Manage HTTP caches
-
-HTTP utilities also expose branch prefixes and keys for individual queries. Supply the endpoint's
-decoded request input for a specific entry:
-
-```ts
-const key = http.users.get.queryKey({ params: { id: 1 } })
-const cachedUser = queryClient.getQueryData(key)
-await queryClient.invalidateQueries({ queryKey: http.users.key() })
-```
-
-HTTP keys include `'http'` and the HttpApi identifier after your `keyPrefix`. RPC keys include
-`'rpc'`, so the two factories keep separate caches even with the same caller prefix. Use the original
-caller prefix when you deliberately want to invalidate both.
-
-The [packed RPC consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/packed-consumer/runtime.mts) and
-[packed HTTP consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/packed-consumer/http-runtime.mts) exercise generated keys through QueryClient.
diff --git a/apps/docs/src/content/docs/guides/cancellation.md b/apps/docs/src/content/docs/guides/cancellation.md
index a3eea30..e570f9c 100644
--- a/apps/docs/src/content/docs/guides/cancellation.md
+++ b/apps/docs/src/content/docs/guides/cancellation.md
@@ -3,13 +3,14 @@ title: Cancellation
description: Cancel queries and request server-side cancellation for long-running commands.
---
-Generated query functions forward TanStack's `AbortSignal` to `runPromiseExit`:
+In the application client module, forward TanStack's `AbortSignal` to your runtime.
+Import `RunPromiseExit` from `effect-api-query`:
```ts
const runPromiseExit: RunPromiseExit = (effect, options) => runtime.runPromiseExit(effect, options)
```
-Cancel one request with its generated query key:
+In a loader or event handler using the ready RPC utility tree, cancel one request with its generated key:
```ts
const input = { durationMs: 60_000, operationId: 'slow-query' }
@@ -29,6 +30,13 @@ Infinite page requests, accumulated streams, and live queries use the same signa
stream query also calls `return()` on its AsyncIterator, which runs the Effect stream's finalizers.
TanStack also cancels an active stream when its last observer unmounts or a refetch supersedes it.
+These cancellation guarantees apply to ordinary query observers. TanStack documents that
+cancellation does not work with `useSuspenseQuery`, `useSuspenseQueries`, and
+`useSuspenseInfiniteQuery`; generated options and signal forwarding preserve that limitation.
+Choose ordinary hooks when your screen depends on cancellation, particularly for open streams.
+See [TanStack's limitations](https://tanstack.com/query/latest/docs/framework/react/guides/query-cancellation#limitations)
+and [Suspense and Error Recovery](/effect-api-query/guides/suspense-and-recovery/).
+
Mutations do not receive TanStack query signals, so generated mutation functions cannot cancel
a mutation automatically.
@@ -47,94 +55,27 @@ Reversing completed work requires a separate compensation operation.
HTTP mutations receive no query abort signal and keep TanStack's normal mutation lifecycle.
-## Cancel a command while its mutation is pending
-
-Use an explicit cancel RPC for long-running commands. The Vite React example provides
-`commands.start`, `commands.status`, and `commands.cancel` in the shared contract. Each command
-has a client-generated operation ID. The start mutation waits for a terminal result; a separate
-query observes progress, and a separate mutation requests cancellation.
-
-```tsx
-const [operationId] = useState(() => crypto.randomUUID())
-const input = { operationId }
-const reconcile = async () => {
- await queryClient.invalidateQueries({
- queryKey: rpcQuery.commands.status.queryKey(input),
- })
-}
-
-const start = useMutation(rpcQuery.commands.start.mutationOptions({ onSettled: reconcile }))
-const cancel = useMutation(rpcQuery.commands.cancel.mutationOptions({ onSettled: reconcile }))
-const status = useQuery(
- rpcQuery.commands.status.queryOptions({
- input,
- enabled: start.status !== 'idle',
- refetchInterval: (query) =>
- query.state.data == null || query.state.data.state === 'running' ? 100 : false,
- }),
-)
-
-return (
- <>
-
-
-
Server state: {status.data?.state ?? 'not started'}
- >
-)
-```
+## Request server cancellation explicitly
+
+Generated mutations receive no query abort signal. When long-running server work must be
+cancellable, assign an operation ID before starting it and provide an application operation
+that requests cancellation. Observe its terminal domain state through a separate read.
+
+An interrupted client or closed HTTP connection does not establish remote completion. Cancellation
+requests stop future work cooperatively; completed work needs a separate compensation operation.
+Use an application acknowledgement when you must wait for server cleanup.
+
+The [Cancellable Commands example](/effect-api-query/examples/cancellable-commands/) shows one
+protocol with start, status, and cancel operations. It also covers retries with the same operation ID,
+concurrent commands, and the limits of its in-memory workers.
+
+## Release resources after local cleanup
+
+Cancelling a query and releasing its services are separate steps. Native `cancelQueries` settlement
+can precede asynchronous iterator finalizers. Keep the ready client, its Scope, and the runner alive
+until application-owned cleanup signals settle. Mutations settle independently because they have
+no query abort signal.
-The cancel handler signals the worker and waits until it has stopped. The cancel mutation's
-`onSettled` callback then invalidates the generated status key. The active query refetches the
-server's status even if the cancel request failed, and polling stops at a terminal state.
-The application chooses this invalidation policy.
-
-A cancelled command returns `{ state: 'cancelled', ... }` successfully. TanStack therefore reports
-both mutations as `success` and runs their normal callbacks. The domain state does not add a
-`cancelled` MutationCache state. Each operation ID has its own query key and worker, so cancelling
-one command leaves another running.
-
-Run the Vite React example and use the **Cancellable commands** panel to try two concurrent
-commands. The TanStack Start application hosts the same contract and handlers at `/rpc`; its
-`application.rpcQuery.commands` exposes these same framework-neutral options for hooks, loaders,
-and QueryClient. It can reuse the workflow above with its own QueryClient.
-
-## Choose what cancellation means
-
-| Action | Result |
-| ------------------------- | ------------------------------------------------------------------------------------------- |
-| Stop observing a query | Removes local observation; whether work stops depends on the query lifecycle and transport. |
-| Interrupt an Effect | Requests cooperative interruption and runs its finalizers. |
-| Call `commands.cancel` | Requests cooperative server cancellation by operation ID and waits for a terminal state. |
-| Compensate committed work | Requires a separate application operation that reverses or offsets prior effects. |
-
-Transport interruption is cooperative and depends on transport support. An explicit cancel RPC is the
-durable application contract for requesting server cancellation. The slow-query demo
-adds a transport-specific `diagnostics.cancel` call when its local Effect is interrupted; the
-package itself does not provide that behavior.
-
-The command example owns workers in the server Scope. Unmounting a view or interrupting the
-client's wait does not cancel these workers automatically. A cancel request stops future steps;
-completed steps remain recorded. Cancellation after completion returns the completed result without
-promising a rollback. Repeating a start with the same ID returns the existing result; a cancel
-that arrives before start reserves that ID as cancelled.
-
-This example stores operation records in memory until the example is reset or the server stops.
-Production applications need their own authorization, durable storage, and retention policy if
-operations must survive restarts. The explicit RPC contract does not make this in-memory example
-a durable job queue.
-
-The [command panel](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/components/sections/commands-section.tsx)
-and [command tests](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/tests/commands.test.ts) exercise this workflow.
-The [HTTP transport tests](https://github.com/ueberBrot/effect-api-query/blob/main/tests/http-transport-cancellation.test.ts) verify cancellation through fetch.
+Follow [Client Lifecycle](/effect-api-query/concepts/client-lifecycle/) for disposal. Use
+[Stream Snapshots](/effect-api-query/guides/stream-snapshots/) for a finite capture that waits for
+local iterator cleanup before it settles.
diff --git a/apps/docs/src/content/docs/guides/choose-stream-history.md b/apps/docs/src/content/docs/guides/choose-stream-history.md
new file mode 100644
index 0000000..48e2ee1
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/choose-stream-history.md
@@ -0,0 +1,56 @@
+---
+title: Choose Stream History
+description: Choose retained history, transport buffering, and update rates for long-running streams.
+---
+
+Choose the cached representation from what the screen needs:
+
+| Need | Builder | Retained data |
+| ---------------------------- | ---------------------------------- | --------------------------------------------- |
+| Every emitted value in order | `streamedOptions` | Unlimited history by default. |
+| A recent event window | `streamedOptions` with `maxChunks` | Up to the specified number after an emission. |
+| Current state | `liveOptions` | The latest emitted value. |
+
+For a long-running event display, choose a finite `maxChunks`. For current progress or a full-state
+feed, choose a live query. Unlimited accumulation grows with the number of emissions; it suits
+finite histories or workloads where that growth is deliberate. Persist durable history outside
+the query cache when it must survive cache eviction or application restarts.
+
+These choices apply to both RPC streams and supported HTTP SSE endpoints. Live queries normalize
+successful `undefined` to `null`; accumulated histories preserve their emitted values.
+
+## Set retention and buffering separately
+
+`maxChunks` limits the number of cached elements after each new emission. Seeded or hydrated history
+can exceed the bound until another element arrives. One element can contain a large object or array,
+so this bound does not limit bytes. It discards older elements while preserving the remaining order.
+Use the same retention and refetch policy when building an exact key and its options.
+
+RPC `rpcOptions.streamBufferSize` controls the ready client's transport buffer before consumption.
+It does not set cache history or the rate of cache writes. HTTP transport buffering belongs to
+the ready HTTP API client. Changing a history bound does not slow the producer.
+
+An initial accumulated or live fetch exposes its first value while the stream remains open.
+An accumulated `replace` refetch publishes its replacement only after successful completion;
+an indefinitely open replacement therefore keeps showing the previous history. See
+[Stream Snapshots](/effect-api-query/guides/stream-snapshots/) for finite server captures.
+
+## Assess writes and references separately
+
+Accumulated streams build new history arrays without mutating previous publications. A history
+bound limits their length; each consumed value still contributes to cache updates. Live queries
+also accept each value, including repeated values. Native structural sharing can preserve equal
+data references without suppressing those cache writes.
+
+For JSON-compatible values, TanStack's default structural sharing can reuse unchanged objects and
+nested values. A moving window changes array positions, so sharing can also produce additional
+distinct references. Compare the data shape your application receives before choosing
+`structuralSharing: false` or a custom native policy.
+
+Cache notifications also include query creation and fetch lifecycle changes. Count data writes,
+data reference changes, and retained elements separately. Framework observer selection and
+render scheduling add their own behavior; cache notification counts do not count component renders.
+
+If the producer outruns the interface, set an explicit rate or sampling policy in the producer or
+an application-owned Effect Stream transformation. Sampling intentionally discards values.
+Retention and transport buffering serve different purposes from publication rate.
diff --git a/apps/docs/src/content/docs/guides/conditional-queries.md b/apps/docs/src/content/docs/guides/conditional-queries.md
index d48f2c9..5cc2041 100644
--- a/apps/docs/src/content/docs/guides/conditional-queries.md
+++ b/apps/docs/src/content/docs/guides/conditional-queries.md
@@ -3,8 +3,14 @@ title: Conditional Queries
description: Pause queries until their required input is available.
---
-Use `{ input: skipToken }` when an input-bearing query has no valid input yet and needs TanStack
-options such as `staleTime`, `select`, or `initialData`:
+In component setup, import the native `useQuery` hook and use your application's ready utility
+tree, named `rpcQuery` here. Its `users.get` RPC takes a numeric `id` with a default locale and
+returns a user with an `id` and `name`. Follow the [RPC quick start](/effect-api-query/getting-started/quick-start/)
+for the factory setup pattern.
+
+`userId` is the selected ID, which may be undefined. Use `{ input: skipToken }` when an
+input-bearing query has no valid input yet and needs TanStack options such as `staleTime`,
+`select`, or `initialData`:
```ts
import { skipToken } from 'effect-api-query'
@@ -21,7 +27,8 @@ const userOptions = rpcQuery.users.get.queryOptions({
const user = useQuery(userOptions)
```
-The same form works for HTTP request input:
+For an HTTP `users.get` endpoint with only a numeric `id` param and a user response, its complete
+decoded request contains only `params`:
```ts
const httpUserOptions = http.users.get.queryOptions({
@@ -41,17 +48,18 @@ possibly `undefined`, even with an initial value, because its defined-data overl
`skipToken`. `useInfiniteQuery` preserves its defined-data overload when `initialData` is a defined
value or factory, including for conditional and skipped inputs.
-The sentinel applies to input-bearing `queryOptions` and `infiniteOptions` in both adapters, and
-to RPC `streamedOptions` and `liveOptions`. Inputless operations run without input, and key and
+The sentinel applies to input-bearing `queryOptions`, `infiniteOptions`, `streamedOptions`, and
+`liveOptions` in both adapters, and buffered HTTP `metadataOptions`. Inputless operations run without input, and key and
mutation builders do not accept `skipToken`. TanStack suspense and prefetch-only hooks also reject
skipped options at the type level.
-`queryOptions`, RPC `streamedOptions`, and RPC `liveOptions` accept concrete input or `skipToken`,
+`queryOptions`, `metadataOptions`, `streamedOptions`, and `liveOptions` accept concrete input or `skipToken`,
including a conditional union. Keep the conditional input inside one builder call so the observer
has one consistent callback type. Concrete inputs and the literal `skipToken` retain their precise
key and query-function types; conditional inputs preserve both possibilities.
-The object form also works for accumulated streams and live queries:
+If your RPC group also declares `events.watch` with a string `channel` input and string
+emissions, build either view in that consumer:
```ts
rpcQuery.events.watch.streamedOptions({
@@ -66,22 +74,18 @@ rpcQuery.events.watch.liveOptions({
```
`refetchMode` configures accumulation. The builder removes it from the returned options even when
-the query is skipped. Infinite queries accept a page-to-input mapper or `skipToken`, including a
+the query is skipped. Retention, refetch, and HTTP SSE decoder policy validation still occurs for
+skipped streams. Infinite queries accept a page-to-input mapper or `skipToken`, including a
conditional union, with their required `initialPageParam` and `getNextPageParam`. Choose between
the mapper and sentinel in `input`; each mapper result must be valid input.
-When no caller options are needed, `queryOptions(skipToken)`, `streamedOptions(skipToken)`, and
-`liveOptions(skipToken)` remain available as shorthand. A skipped query has no executable query
-function, so manual `refetch()` cannot run it. Supply valid input to enable it. If a complete
+A skipped query has no executable query function, so manual `refetch()` cannot run it. Supply valid input to enable it. If a complete
request is available and you need manual refetch, use `enabled: false` instead.
For HTTP pagination, map each page parameter to the complete request and keep stable filters in
-every page. See [Load pages](/effect-api-query/guides/http-queries-and-mutations/#load-pages) for
+every page. See [Load pages](/effect-api-query/guides/pagination/) for
initial-request identity and cursor progression.
Try this in either [executable example](/effect-api-query/examples/#pause-a-query-until-a-user-is-selected).
The **Choose before fetching** control demonstrates pausing, selecting a user, and reusing fresh
cached data after clearing and reselecting the same user.
-
-The [public RPC consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/public-contract.ts) and
-[public HTTP consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/http-contract.ts) check skipped hook inference and rejected uses.
diff --git a/apps/docs/src/content/docs/guides/custom-key-encoders.md b/apps/docs/src/content/docs/guides/custom-key-encoders.md
index 379f3c9..15c09e3 100644
--- a/apps/docs/src/content/docs/guides/custom-key-encoders.md
+++ b/apps/docs/src/content/docs/guides/custom-key-encoders.md
@@ -6,8 +6,12 @@ description: Supply safe semantic identity for RPC payloads and HTTP requests.
## RPC payloads
By default, the factory constructs the RPC payload and synchronously encodes it with its Schema.
-Supply a custom encoder when encoding requires Effect services or the payload contains
-`Schema.Redacted` values, including schemas reached through `Schema.suspend`.
+Supply a custom encoder when encoding requires Effect services, uses opaque encoding middleware,
+or the payload contains `Schema.Redacted` values, including schemas reached through `Schema.suspend`.
+The runtime check treats middleware conservatively even when it is synchronous and service-free.
+
+In the application client module, configure the ready RPC client. Here `identifySecret` is
+your synchronous public-identity projection:
```ts
const rpcQuery = createRpcQueryUtils(rpcGroup, {
@@ -23,6 +27,10 @@ const rpcQuery = createRpcQueryUtils(rpcGroup, {
An encoder receives the normalized payload and must return a strict `JsonValue` synchronously. It
must not reveal secrets. Return a stable public identifier, digest, or other safe semantic identity.
+Broad payload declarations such as `Schema.Unknown`, `Schema.Any`, and void-containing unions
+accept encoders too. Their default keys still require strict JSON: an accepted RPC input such as
+`undefined`, a bigint, or a class instance may require an encoder to supply JSON-safe identity.
+
Define encoders as own enumerable properties keyed by literal payload-bearing RPC tags. TypeScript
requires entries for unsafe payloads; the factory also rejects missing or unknown entries at runtime.
@@ -39,6 +47,8 @@ Suppose a `forms` group's `submit` endpoint accepts a number encoded as text or
as JSON. Both schemas can encode to `"1"`, but the HTTP bodies differ. Preserve that distinction
in the key:
+In the HTTP client module, configure that endpoint's request projection:
+
```ts
const http = createHttpApiQueryUtils(contract, {
client,
@@ -76,9 +86,5 @@ that distinguishes results.
Return strict `JsonValue` synchronously. The factory copies and freezes the result; it rejects
undefined object members, undefined or sparse array entries, non-finite numbers, cycles, and
non-JSON objects. Custom output bypasses the default HTTP rules for omitting `undefined` members and normalizing headers.
-See the [HTTP reference](/effect-api-query/reference/http-factory/#cache-identity-and-failures) for
+See the [HTTP reference](/effect-api-query/reference/http-builders/#cache-identity-and-failures) for
failure codes. Underlying error Causes remain intact and may contain values supplied by Effect.
-
-The [public RPC consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/public-contract.ts) and
-[public HTTP consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/http-contract.ts) check encoder inputs and required services.
-The [HTTP key tests](https://github.com/ueberBrot/effect-api-query/blob/main/tests/http-semantic-keys.test.ts) verify alternative payload and binary projections.
diff --git a/apps/docs/src/content/docs/guides/handle-failures.md b/apps/docs/src/content/docs/guides/handle-failures.md
index b5697cb..c90a0cc 100644
--- a/apps/docs/src/content/docs/guides/handle-failures.md
+++ b/apps/docs/src/content/docs/guides/handle-failures.md
@@ -4,7 +4,7 @@ description: Inspect RPC and HTTP Causes and distinguish configuration and key e
---
A failed RPC `Exit` becomes `EffectRpcQueryError`. The error records the RPC tag, the generated
-operation that ran, and the complete Effect `Cause`:
+operation that ran, and the complete Effect `Cause`. In the application's error handler:
```ts
import { Cause } from 'effect'
@@ -18,9 +18,12 @@ const logRpcError = (error: unknown) => {
}
```
+Review the Cause for private messages and transport values before logging it.
+
These error classes distinguish failure stages:
-- `EffectRpcQueryConfigError` reports invalid factory or builder configuration synchronously.
+- `EffectRpcQueryConfigError` reports invalid configuration: synchronously during preparation,
+ or during stream execution with incompatible QueryClient hashing.
- `EffectRpcQueryKeyError` reports synchronous payload construction, encoding, or JSON
canonicalization failures.
- `EffectRpcQueryError` reports a failed RPC execution and preserves its Effect `Cause`.
@@ -28,6 +31,8 @@ These error classes distinguish failure stages:
If a custom runner rejects instead of returning an `Exit`, its rejection passes through unchanged.
See the [error reference](/effect-api-query/reference/errors/) for stable codes and metadata.
+Use [retry queries](/effect-api-query/guides/retry-queries/) for typed `Cause`/`Result` decisions,
+bounded attempt counts, and synchronous preparation errors.
## Inspect HTTP failures
@@ -41,14 +46,12 @@ The package adds only declaration identity to execution-error metadata. The pres
contain upstream request headers, bodies, concrete URLs, responses, or Schema issue values.
Review those values before logging or exposing them. The package does not sanitize the Cause.
-`EffectHttpApiQueryConfigError` reports invalid factory configuration synchronously.
+`EffectHttpApiQueryConfigError` reports invalid configuration with the same preparation and
+stream-execution timing as the RPC error.
`EffectHttpApiQueryKeyError` reports synchronous query-key preparation failures, before HTTP
execution. Mutations encode their request inside the ready client's Effect, so encoding failures
become `EffectHttpApiQueryError` instead. Runner rejections and user or TanStack callback failures
pass through unchanged when they produce no failed Exit.
-See the [HTTP factory reference](/effect-api-query/reference/http-factory/#cache-identity-and-failures)
+See the [HTTP factory reference](/effect-api-query/reference/http-builders/#cache-identity-and-failures)
for key-error codes.
-
-The [packed RPC consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/packed-consumer/runtime.mts) and
-[packed HTTP consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/packed-consumer/http-runtime.mts) verify error guards and preserved Causes.
diff --git a/apps/docs/src/content/docs/guides/http-metadata.md b/apps/docs/src/content/docs/guides/http-metadata.md
new file mode 100644
index 0000000..700423d
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/http-metadata.md
@@ -0,0 +1,59 @@
+---
+title: HTTP Metadata
+description: Read decoded HTTP data, response status, and headers in a separate cache view.
+---
+
+Buffered HTTP endpoints with query support expose `metadataOptions`. Use your ready `http` utility
+tree and QueryClient from the [HTTP quick start](/effect-api-query/getting-started/http-quick-start/).
+Here, `users.get` declares `params.id` and `query.locale` and returns a user with `id` and `name`.
+
+## Read status and headers
+
+```ts
+const input = { params: { id: 1 }, query: { locale: 'en' } }
+const metadataOptions = http.users.get.metadataOptions({ input })
+const current = await queryClient.query(metadataOptions)
+console.log(current.data.name, current.status)
+const etag = current.headers['etag']
+```
+
+The cache holds decoded `data`, numeric `status`, and raw string `headers` in a separate view.
+Fetched envelopes and copied headers are immutable. Decoded data keeps its ownership, including
+declared response-header wrappers. Choose safe headers before persistence or hydration.
+Use `metadataOptions.queryKey` or `metadataKey(input)` for exact access; the endpoint's `key()`
+matches ordinary and metadata views.
+
+## Update with an ETag
+
+If `users.get` supplies an ETag and `users.update` declares `params.id`, an `if-match` header,
+a `{ name }` payload, and its precondition failure, preserve the ETag for the write.
+Import `MutationObserver` from `@tanstack/query-core`:
+
+```ts
+if (etag === undefined) throw new Error('The server supplied no ETag')
+await queryClient.cancelQueries({ queryKey: http.users.get.key() })
+const updateUser = new MutationObserver(
+ queryClient,
+ http.users.update.mutationOptions({
+ onSuccess: () => queryClient.invalidateQueries({ queryKey: http.users.get.key() }),
+ }),
+)
+```
+
+Send the raw ETag **including quotes**, then read the refreshed metadata before another write:
+
+```ts
+await updateUser.mutate({
+ params: input.params,
+ headers: { 'if-match': etag },
+ payload: { name: 'Ada' },
+})
+const refreshed = await queryClient.query(metadataOptions)
+```
+
+The server enforces the precondition. Inspect its declared failure through the
+[HTTP execution error](/effect-api-query/guides/handle-failures/#inspect-http-failures).
+The invalidation prefix refreshes data and metadata entries.
+
+Native selection, initial data, skipping, and cancellation also apply. For precise immutability
+and structural-sharing behavior, see [Buffered Metadata](/effect-api-query/reference/http-builders/#buffered-metadata).
diff --git a/apps/docs/src/content/docs/guides/http-queries-and-mutations.md b/apps/docs/src/content/docs/guides/http-queries-and-mutations.md
index 5af7775..3c878b3 100644
--- a/apps/docs/src/content/docs/guides/http-queries-and-mutations.md
+++ b/apps/docs/src/content/docs/guides/http-queries-and-mutations.md
@@ -1,149 +1,38 @@
---
-title: HTTP Queries and Mutations
-description: Fetch and update data through an Effect HttpApi with TanStack Query.
+title: HTTP Requests and Uploads
+description: Supply decoded request parts and execute buffered multipart mutations.
---
-Use `createHttpApiQueryUtils` with your HttpApi definition and ready HttpApiClient. The client
-keeps its existing base URL, transport, and middleware configuration.
+Use the HTTP utility tree from the [HTTP quick start](/effect-api-query/getting-started/http-quick-start/).
+Keep base URL, middleware, authentication, and execution services on your ready client and runner.
+For shared builders, see [Queries](/effect-api-query/guides/queries/),
+[Mutations](/effect-api-query/guides/mutations/), [Pagination](/effect-api-query/guides/pagination/),
+[Streaming](/effect-api-query/guides/streaming/), and [HTTP Metadata](/effect-api-query/guides/http-metadata/).
-This example assumes your API has a `users` group with `get` and `create` endpoints. The `get`
-endpoint declares a decoded numeric `id` in `params`; `create` accepts `{ name: string }` in
-`payload`. Replace the application module imports with your own contract and client.
+## Supply decoded request parts
-## Create the utilities
+HTTP input contains the declared `params`, `query`, `headers`, and `payload` containers.
+Include each declared container even when its fields are optional. For `users.get` declaring
+`params.id` and `query.locale`:
```ts
-import { MutationObserver, QueryClient } from '@tanstack/query-core'
-import { createHttpApiQueryUtils } from 'effect-api-query'
-
-import { api } from './api.js'
-import { client } from './http-client.js'
-
-const queryClient = new QueryClient()
-const http = createHttpApiQueryUtils(api, {
- client,
- keyPrefix: ['my-app'],
-})
-```
-
-This client needs no additional execution services. If your client or its schemas require services,
-also supply a `runPromiseExit` backed by your application runtime. Forward the runner's options
-so [query cancellation](/effect-api-query/guides/cancellation/#cancel-an-http-query) reaches Effect.
-
-## Fetch a user
-
-```ts
-const userOptions = http.users.get.queryOptions({
- input: { params: { id: 1 } },
+const httpUserOptions = http.users.get.queryOptions({
+ input: { params: { id: 1 }, query: { locale: 'en' } },
staleTime: 30_000,
})
-
-const user = await queryClient.query(userOptions)
-```
-
-Pass decoded values in the endpoint's declared `params`, `query`, `headers`, and `payload`
-containers. For example, a `Schema.FiniteFromString` parameter takes a number; the ready client
-encodes it for transport. Include every declared container, even when its fields are optional.
-An endpoint without request input uses `queryOptions()`.
-
-React applications can pass `userOptions` directly to `useQuery`, `useSuspenseQuery`, or
-`usePrefetchQuery`. A `select` callback receives decoded response data; it changes the observer's
-data type without changing the cached value. `queryClient.getQueryData(userOptions.queryKey)`
-still infers the decoded user type.
-
-## Wait for request input
-
-Use `skipToken` until the complete request is available:
-
-```ts
-import { useQuery } from '@tanstack/react-query'
-import { skipToken } from 'effect-api-query'
-
-const user = useQuery(
- http.users.get.queryOptions({
- input: userId === undefined ? skipToken : { params: { id: userId } },
- staleTime: 30_000,
- select: (user) => user.name,
- }),
-)
-```
-
-`queryOptions(skipToken)` is shorthand when you need no other options. Skipping preserves caller
-options and performs no request encoding or client call. Its query function is TanStack's exact
-sentinel, so manual `refetch()` cannot execute it. Supply valid input to enable the query. Use
-`enabled: false` with a complete request when you need a query that can run through manual refetch.
-Suspense and prefetch-only hooks require executable options and reject skipped options. See
-[Conditional Queries](/effect-api-query/guides/conditional-queries/) for the shared contract.
-
-## Load pages
-
-For an endpoint `users.list` with decoded query fields `cursor: number` and `filter: string`, and
-a response `{ items: User[]; nextCursor: number | null }`, map each page parameter to a complete
-request:
-
-```ts
-import { useInfiniteQuery } from '@tanstack/react-query'
-
-const filter = 'active'
-const pageOptions = http.users.list.infiniteOptions({
- initialPageParam: 0,
- input: (cursor) => ({ query: { cursor, filter } }),
- getNextPageParam: (page) => page.nextCursor ?? undefined,
- select: (data) => data.pages.flatMap((page) => page.items),
-})
-
-const users = useInfiniteQuery(pageOptions)
-```
-
-TypeScript infers `cursor` from `initialPageParam`. Return every declared request container from
-`input`, including any `params`, `headers`, or `payload`; each page is a fresh decoded HTTP request.
-Use `users.fetchNextPage()` when `users.hasNextPage` is true. You control cursor progression through
-`getNextPageParam`: return the server's next cursor, or `undefined` or `null` when there are no more
-pages.
-
-The cache key uses `input(initialPageParam)` and an `infinite` discriminator. Keep all stable
-filters in the initial request and every later request. Rebuild the options when a filter
-changes so the first request produces a different key. Keep `input` deterministic and free of
-side effects: it runs during key construction and again for page execution. A custom key encoder
-must preserve these same filters because they affect results.
-
-TanStack owns page storage, invalidation, and refetching. `select` changes the hook result to the
-flattened users; the cache still holds `pages` and `pageParams`. Each page uses the same response
-normalization, wrapped failures, and cancellation as an ordinary HTTP query. To pause pagination, use
-`input: skipToken` with `initialPageParam` and `getNextPageParam`; the infinite builder accepts
-only this object form for skipping.
-
-## Create a user and refresh the cache
-
-```ts
-const createUser = new MutationObserver(
- queryClient,
- http.users.create.mutationOptions({
- onSuccess: () => queryClient.invalidateQueries({ queryKey: http.users.key() }),
- }),
-)
-
-await createUser.mutate({ payload: { name: 'Ada' } })
+const httpUser = await queryClient.query(httpUserOptions)
```
-Mutation variables use the same decoded request shape as query input. Choose the invalidation
-prefix for the data your write changes. React applications can pass the same mutation options to
-`useMutation`.
-
-Both builders return decoded response data. Successful `undefined` query data becomes `null`;
-mutation results retain `undefined`. Inspect execution failures with
-[`isEffectHttpApiQueryError`](/effect-api-query/guides/handle-failures/#inspect-http-failures).
+The ready client encodes decoded values; HTTP builders apply no RPC constructor defaults.
+Inputless endpoints use `queryOptions()`. Raw response controls are excluded from request input.
+Captured values remain caller-owned, so keep them unchanged while using the options.
## Upload a file
-Declare a buffered multipart payload in your shared API definition. For example, add this endpoint
-to the `users` group and include it in the server implementation:
+In the contract module, declare a buffered multipart payload. Import `Schema` from `effect`,
+`Multipart` from `effect/http`, and `HttpApiEndpoint` and `HttpApiSchema` from `effect/http-api`:
```ts
-import { Schema } from 'effect'
-import { Multipart } from 'effect/http'
-import { HttpApiEndpoint, HttpApiSchema } from 'effect/http-api'
-
const upload = HttpApiEndpoint.post('upload', '/users/:id/files', {
params: { id: Schema.Int },
payload: Schema.Struct({ file: Multipart.SingleFileSchema }).pipe(HttpApiSchema.asMultipart()),
@@ -151,9 +40,8 @@ const upload = HttpApiEndpoint.post('upload', '/users/:id/files', {
})
```
-Create the utilities from the updated API and ready client. This endpoint exposes `key()`,
-`mutationKey()`, and `mutationOptions()`. Build `FormData` explicitly and supply every other declared
-request container in its decoded type:
+Add the endpoint to your API's `users` group and create its utility tree. In the mutation module,
+import `MutationObserver` from `@tanstack/query-core` and prepare the upload:
```ts
const uploadFile = new MutationObserver(
@@ -162,46 +50,21 @@ const uploadFile = new MutationObserver(
onSuccess: () => queryClient.invalidateQueries({ queryKey: http.users.key() }),
}),
)
-
-const payload = new FormData()
-payload.set('file', new Blob(['profile notes'], { type: 'text/plain' }), 'notes.txt')
-const uploaded = await uploadFile.mutate({ params: { id: 1 }, payload })
```
-The adapter forwards the `FormData` to the ready client and returns the decoded success. React
-applications can use these options with `useMutation`; callback variables retain the complete request
-type. Request encoding and middleware still use your application's client and runner.
-
-A buffered multipart alternative makes the whole endpoint mutation-only, even when it also accepts
-plain payloads. Mixed alternatives retain Effect's client request union. Leave the endpoint out of
-`keyEncoders`: mutation keys contain no request variables, and encoder entries are rejected. Any
-streaming success or streaming multipart alternative omits the whole endpoint.
-
-## Keep cache entries separate
-
-Use generated keys for individual queries or whole branches:
+In the event handler, build `FormData` and supply the other declared request containers:
```ts
-const key = http.users.get.queryKey({ params: { id: 1 } })
-const cachedUser = queryClient.getQueryData(key)
-await queryClient.invalidateQueries({ queryKey: http.users.key() })
+const payload = new FormData()
+payload.set('file', new Blob(['profile notes'], { type: 'text/plain' }), 'notes.txt')
+const uploaded = await uploadFile.mutate({ params: { id: 1 }, payload })
```
-If client middleware changes results by user or tenant, include a safe user or tenant identifier in
-`keyPrefix`. Keep credentials out of keys. Use a
-[custom encoder](/effect-api-query/guides/custom-key-encoders/#http-requests) when request schemas
-need encoding services, contain redacted values, or allow multiple payload alternatives.
-
-Buffered HTTP endpoints without multipart expose ordinary query, infinite query, and mutation
-builders regardless of HTTP method. Choose the builder for the operation you intend. Buffered
-multipart endpoints expose mutations only. Streaming responses and streaming multipart requests
-are omitted; see the [HTTP factory reference](/effect-api-query/reference/http-factory/)
-for supported request formats and the complete builder contract.
-
-When your application or server request ends, cancel its active queries and clear its QueryClient
-before disposing client and runtime resources. See
-[Client Lifecycle](/effect-api-query/concepts/client-lifecycle/#http-clients-and-execution-services).
+The ready client owns encoding; the adapter returns decoded success. Any buffered multipart
+payload alternative makes the endpoint mutation-only. Mutation keys exclude variables and files,
+so omit these endpoints from `keyEncoders`; configured encoder entries are rejected.
+Streaming successes or streaming multipart alternatives omit the endpoint entirely.
-The [public HTTP consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/http-contract.ts) checks query, mutation,
-pagination, and skipped-input types. The [Vite React HTTP panel](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/components/sections/http-section.tsx)
-shows the contract, ready client, hooks, and cache invalidation in a running application.
+See the [HTTP Factory](/effect-api-query/reference/http-factory/) for exact capability boundaries
+and the [multipart example](https://github.com/ueberBrot/effect-api-query/blob/main/tests/http-multipart.test.ts)
+for a complete contract and execution.
diff --git a/apps/docs/src/content/docs/guides/hydrate-query-views.md b/apps/docs/src/content/docs/guides/hydrate-query-views.md
new file mode 100644
index 0000000..49afbfe
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/hydrate-query-views.md
@@ -0,0 +1,129 @@
+---
+title: Hydrate Query Views
+description: Preserve infinite pages, stream histories, live values, and HTTP metadata across JSON hydration and refetch.
+---
+
+Choose one codec for each cached representation. A success Schema describes a decoded result;
+infinite pages also contain page parameters, and HTTP metadata adds an envelope. Keep decoded
+values in the Query Client and encode only the snapshot sent to the browser.
+
+This task extends the [paired Profile codec](/effect-api-query/guides/hydrate-unary-data/).
+The server and browser own independent ready clients, runtimes, Scopes, and Query Clients.
+Use the same contract, input, key prefix, and Query Client hashing defaults on both sides.
+
+## Give each view an explicit codec
+
+Reserve a key prefix of `['hydration-views', codecId, ...applicationIdentity]` when creating each
+utility tree. The generated key suffix retains its usual operation, input, and view policies.
+Choose `codecId` from the map below; add your owner identity after it when data depends on an owner.
+
+| Codec ID | Cached representation |
+| ----------------- | ------------------------------------------------------------- |
+| `history` | Ordered `Profile`, `undefined`, and `null` elements |
+| `infinite` | Profile pages and explicitly encoded `Cursor` page parameters |
+| `live` | Latest Profile or normalized `null` |
+| `buffered` | Decoded HTTP header wrapper with either declared success |
+| `metadata` | Buffered wrapper, response status, and raw string headers |
+| `wrapped-history` | Ordered decoded HTTP header wrappers |
+| `wrapped-live` | Latest decoded HTTP header wrapper |
+
+Define the view codecs in the application's hydration module. Import `Schema` and
+`SchemaTransformation` from `effect`; reuse the paired `Profile` codec. The
+[complete typed recipe](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/docs-hydration-views.ts)
+includes wrapper codecs, codec dispatch, and awaited snapshot preparation.
+
+Use the linked module's `Cursor` and `BufferedProfile` declarations alongside these codecs.
+For infinite data, encode both pages and page parameters:
+
+```ts
+export const ProfilePage = Schema.Struct({
+ rows: Schema.Array(Profile),
+ next: Schema.NullOr(Schema.Finite),
+})
+const ProfilePages = Schema.Struct({
+ pages: Schema.Array(ProfilePage),
+ pageParams: Schema.Array(Cursor),
+})
+```
+
+For history, preserve an undefined element separately from a real `null`:
+
+```ts
+const UndefinedElement = Schema.Struct({ _tag: Schema.Literal('Undefined') }).pipe(
+ Schema.decodeTo(
+ Schema.Undefined,
+ SchemaTransformation.transform({
+ decode: () => undefined,
+ encode: () => ({ _tag: 'Undefined' as const }),
+ }),
+ ),
+)
+
+export const HistoryElement = Schema.Union([Profile, Schema.Null, UndefinedElement])
+const ProfileHistory = Schema.Array(HistoryElement)
+```
+
+For HTTP metadata, encode the decoded response wrapper and the metadata envelope:
+
+```ts
+const ProfileMetadata = Schema.Struct({
+ data: BufferedProfile,
+ status: Schema.Finite,
+ headers: Schema.Record(Schema.String, Schema.String),
+})
+```
+
+Use a `Cursor` as `infiniteOptions.initialPageParam`. Return the next Cursor from
+`getNextPageParam`, and let the deterministic `input` mapper convert its offset into your
+contract's request input. `ProfilePages` encodes both arrays: its page parameters become decimal
+strings at the JSON boundary and regain their Cursor prototype and methods during hydration.
+A result Schema alone cannot choose this page-parameter representation.
+
+Accumulated history preserves decoded `undefined` elements. Ordinary JSON would turn an
+undefined array element into `null`, so `UndefinedElement` encodes it as a distinct tagged value.
+A real `null` remains `null`. Live queries already normalize an entirely undefined emission to
+`null`; their codec retains that value.
+
+For an HTTP header wrapper, normalization applies to the whole emitted value. A wrapper whose
+`body` is undefined remains a wrapper with an undefined body. `WrappedElement` preserves that
+body with the same tagged encoding and reconstructs the wrapper with
+`HttpApiSchema.withHeaders`. `WithHeaders` is an HTTP declaration; use explicit body/header
+codecs at the JSON boundary so rich body values and decoded numeric headers regain their types.
+
+`BufferedProfile` includes both declared HTTP successes. Adapt that union to your endpoint and
+its status declarations. `ProfileMetadata` preserves decoded data, numeric status, and raw
+string headers. Hydrated envelopes belong to the application and remain unfrozen. A subsequent
+metadata fetch produces the library's frozen envelope and raw headers again; decoded data stays
+mutable. Select public response headers before sending metadata that contains private values.
+
+## Prepare the complete snapshot before continuing
+
+After prefetching finite queries, run `prepareViewSnapshot(serverQueryClient)` through the
+application's runner with `SnapshotEncoding` provided. Supply any asynchronous encoding work
+through `beforeEncode`, then await the returned JSON before publishing it through your framework.
+The original cache keeps decoded classes, bigint values, byte arrays, and page parameters.
+
+For an open HTTP or RPC stream, first await
+[fetchStreamSnapshot](/effect-api-query/guides/stream-snapshots/) with its exact generated stream
+options. It captures the first visible value and awaits local iterator cleanup. Keep exclusive
+ownership of that idle, unobserved key during capture. Only then prepare JSON and dispose the
+server's ready-client resources. Local cleanup does not acknowledge remote cancellation.
+
+On the browser, provide `SnapshotDecoding` and await `prepareViewHydration(browserQueryClient,
+json)` before querying or mounting observers. Encoding and decoding require separate services;
+one cannot satisfy the other. All selected data decodes before a single native `hydrate` call,
+so invalid codec data or an unknown codec ID leaves the browser cache untouched.
+
+The preparation helpers accept the matching trusted server's native dehydrated envelope and
+validate selected query data. Validate arbitrary external snapshots separately. Handle
+malformed JSON and preparation failures in the application's rendering or hydration error path.
+
+Only successful queries in the reserved family enter the snapshot. Mutations and failed-query
+errors/Causes are omitted. Hydration therefore leaves an omitted failed query available for a
+new browser fetch. Error hydration needs its own application-safe representation.
+
+Choose native freshness defaults to control duplicate reads. A successful fresh hydrated query
+can reuse its reconstructed data; later invalidation and refetch use the browser's independent
+ready client and the same decoded representation. For streams, explicit cached capture acquires
+no new work; fresh capture starts the browser stream again. Keep Effects and Promises outside
+query data and finish preparation before publishing or hydrating.
diff --git a/apps/docs/src/content/docs/guides/hydrate-unary-data.md b/apps/docs/src/content/docs/guides/hydrate-unary-data.md
new file mode 100644
index 0000000..89906ee
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/hydrate-unary-data.md
@@ -0,0 +1,140 @@
+---
+title: Hydrate Unary Data
+description: Keep DTOs or rich Schema values consistent across JSON hydration and client refetch.
+---
+
+Choose the cache representation before connecting server rendering to TanStack Query. The server
+and browser must use the same contract, key prefix, and inputs. Each owns its Query Client, ready
+Effect client, and runtime. Cancel outstanding queries before disposing a runtime.
+
+These recipes cover unary profile reads through either factory. They keep only successful profile
+queries and omit mutations. Use the [query-view recipe](/effect-api-query/guides/hydrate-query-views/)
+for infinite pages, stream snapshots, and HTTP metadata.
+
+## Keep DTOs in both caches
+
+Use a JSON-safe success schema when components need plain data. The contract below keeps credits
+as decimal strings and binary data as base64 strings. Return this DTO from the server operation;
+the ready RPC or HTTP client produces the same DTO on the server and browser.
+
+In the shared contract module, import `Schema` from `effect` and declare the DTO:
+
+```ts
+const ProfileDto = Schema.Struct({
+ name: Schema.String,
+ credits: Schema.String,
+ avatar: Schema.String.check(Schema.isBase64()),
+})
+```
+
+The [complete DTO recipe](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/docs-hydration-dto.ts)
+connects this schema to both factories and provides `snapshotDto` and `hydrateDto`.
+
+Prefetch with `queryClient.query(dtoRpcOptions(rpcClient))` or the HTTP equivalent, then publish
+`snapshotDto(queryClient)` through your framework's JSON transport. Call `hydrateDto` on the
+browser's Query Client before its first query. The 60-second freshness window avoids an immediate
+duplicate read; subsequent invalidation and refetch still produce DTOs.
+
+If your domain layer uses classes, convert them to this DTO in the operation or ready-client
+adapter on both sides. TanStack's `select` changes an observer's result; it does not change cached
+query data.
+
+## Reconstruct Schema classes with paired codecs
+
+Keep decoded domain objects in the cache when components need methods or rich values. Encode at
+the snapshot boundary and decode during hydration. This `Profile` encodes bigint credits as a
+string and its `Uint8Array` avatar as base64. Decoding reconstructs the class and its `summary`
+method.
+
+In the shared contract module, define the rich success schema:
+
+```ts
+export class Profile extends Schema.Class('Profile')({
+ name: Schema.String,
+ credits: Schema.BigIntFromString,
+ avatar: Schema.Uint8ArrayFromBase64,
+}) {
+ summary(): string {
+ return `${this.name}: ${this.credits} credits`
+ }
+}
+```
+
+In the server snapshot and browser hydration modules, pair
+`serializeData: Schema.encodeUnknownSync(Profile)` with
+`defaultOptions: { deserializeData: Schema.decodeUnknownSync(Profile) }`.
+The [complete rich-value recipe](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/docs-hydration-rich.ts)
+provides `snapshotProfile`, `hydrateProfile`, and options for both factories.
+
+Prefetch with `profileRpcOptions` or `profileHttpOptions`, publish `snapshotProfile`, then call
+`hydrateProfile` on the browser's Query Client. The hydrated value and a later browser refetch
+both have the `Profile` prototype, bigint credits, and byte array. Only the snapshot contains the
+encoded strings. The `'profile'` prefix in this recipe is reserved for unary `Profile` data;
+other query shapes need their own codec selection.
+
+`serializeData` and `deserializeData` are synchronous callbacks. The synchronous Schema functions
+must be able to finish without asynchronous work or required services. A codec failure throws;
+handle it through your rendering or hydration error path.
+
+`structuredClone` is not a paired JSON codec. It copies class properties without restoring the
+class prototype or methods. It preserves bigint and typed arrays in memory, but JSON still
+requires an encoding for those values. Cloning a server class alone also leaves hydration and a
+later class-valued refetch with different representations.
+
+## Finish effectful preparation before publishing or hydrating
+
+When a codec needs services or asynchronous work, prepare the entire snapshot outside TanStack's
+synchronous callbacks. This example adds a caller-owned preparation service to the same Profile
+codec. Its hooks can await application work before encoding or decoding.
+
+The application's hydration module decodes all entries before changing the cache.
+With `PreparedProfile` and its services from the
+[complete asynchronous recipe](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/docs-hydration-async.ts),
+that boundary is:
+
+```ts
+const prepareProfileHydration = Effect.fnUntraced(function* (
+ queryClient: QueryClient,
+ json: string,
+) {
+ const snapshot: DehydratedState = JSON.parse(json)
+ const queries = yield* Effect.forEach(snapshot.queries, (query) =>
+ Schema.decodeUnknownEffect(PreparedProfile)(query.state.data).pipe(
+ Effect.map((data) => ({ ...query, state: { ...query.state, data } })),
+ ),
+ )
+ yield* Effect.sync(() => hydrate(queryClient, { ...snapshot, queries }))
+})
+```
+
+Provide `HydrationPreparation` through your application Context or ManagedRuntime. Await the
+result of `prepareProfileSnapshot` before publishing its JSON. On the browser, await
+`prepareProfileHydration` before allowing queries or components to read the hydrated cache. The
+latter decodes every entry before calling `hydrate`, so decoding failure leaves the destination
+cache untouched. Keep the preparation runtime alive until the Effect completes, and dispose it
+through the application's lifecycle.
+
+Neither preparation function puts an Effect or Promise into query data. The server cache keeps
+`Profile` values, the published snapshot contains encoded data, and the browser cache receives
+fully decoded `Profile` values. The Schema codec validates each profile; the surrounding snapshot
+must come from the matching application encoder. Query keys and metadata must also satisfy your
+JSON transport.
+
+## Omit failed queries by default
+
+Retain `defaultShouldDehydrateQuery` so failed queries stay out of the snapshot. The browser can
+refetch them with its own client and receive a fresh `EffectRpcQueryError` or
+`EffectHttpApiQueryError` and Cause. The recipes above preserve this policy even when selecting a
+profile prefix.
+
+If you deliberately transfer failed queries, define a safe application error representation.
+Encode and decode both `state.error` and `state.fetchFailureReason`; `serializeData` and
+`deserializeData` transform query data, not those error fields. Allowlist public failure tags and
+fields, omit private messages, defects, and transport details, and reconstruct the error behavior
+your UI requires. JSON serialization of an Error or Cause does not supply that policy. A safe
+error DTO will not automatically become either package error class or pass its type guard.
+
+For normal retry and error handling, keep failures local to each client and follow
+[Handle Failures](/effect-api-query/guides/handle-failures/) and
+[Retry Queries](/effect-api-query/guides/retry-queries/). For router ownership and cleanup, see
+[TanStack Start](/effect-api-query/guides/tanstack-start/).
diff --git a/apps/docs/src/content/docs/guides/mutations.md b/apps/docs/src/content/docs/guides/mutations.md
new file mode 100644
index 0000000..9008856
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/mutations.md
@@ -0,0 +1,51 @@
+---
+title: Mutations
+description: Build typed RPC and HTTP writes and refresh affected queries.
+---
+
+Use your ready utility tree and QueryClient from the [RPC quick start](/effect-api-query/getting-started/quick-start/)
+or [HTTP quick start](/effect-api-query/getting-started/http-quick-start/).
+The examples assume `users.create` accepts a `name` and returns a user with `id` and `name`.
+Import `MutationObserver` from `@tanstack/query-core` for imperative execution.
+
+## Execute a write
+
+Build options once, then supply each mutation's variables when it runs:
+
+```ts
+const createUser = new MutationObserver(
+ queryClient,
+ rpc.users.create.mutationOptions({
+ onSuccess: () => queryClient.invalidateQueries({ queryKey: rpc.users.key() }),
+ }),
+)
+const created = await createUser.mutate({ name: 'Ada' })
+```
+
+HTTP variables contain the complete decoded request:
+
+```ts
+const createHttpUser = new MutationObserver(
+ queryClient,
+ http.users.create.mutationOptions({
+ onSuccess: () => queryClient.invalidateQueries({ queryKey: http.users.key() }),
+ }),
+)
+const createdHttpUser = await createHttpUser.mutate({ payload: { name: 'Ada' } })
+```
+
+Native mutation hooks accept the same options. Callbacks infer the result, variables, and
+execution errors. Mutation keys identify the operation and exclude variables. Successful
+`undefined` remains `undefined`.
+
+## Choose cache updates
+
+Writes refresh reads through your callback policy. Invalidate affected generated prefixes,
+seed a known result with `setQueryData`, or apply an
+[optimistic write](/effect-api-query/guides/optimistic-writes/).
+The library derives builders from the contract; the call site chooses read or write semantics.
+Buffered multipart endpoints support mutations only.
+
+See [HTTP uploads](/effect-api-query/guides/http-queries-and-mutations/#upload-a-file),
+[Handle Failures](/effect-api-query/guides/handle-failures/), and
+[Cancellation](/effect-api-query/guides/cancellation/) for their execution boundaries.
diff --git a/apps/docs/src/content/docs/guides/optimistic-writes.md b/apps/docs/src/content/docs/guides/optimistic-writes.md
new file mode 100644
index 0000000..dec7f55
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/optimistic-writes.md
@@ -0,0 +1,96 @@
+---
+title: Optimistic User Writes
+description: Seed typed entries, roll back individual writes, and reconcile overlapping mutations.
+---
+
+Use generated concrete keys to update the reads affected by a mutation. Keep the write workflow
+in the application, where the relationship between a domain operation and its reads is known.
+
+The Vite React example applies this workflow to its existing user forms and directory. Copy
+[the user-write module](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/lib/user-writes.ts)
+and compose it with your application's ready clients and QueryClient, as in
+[the application](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/lib/application.ts).
+Its RPC and HTTP forms use the same application workflow and maintain distinct cache entries.
+
+## Seed the mutation response
+
+After creating a user, the example replaces that mutation's temporary entry in each cached
+list with the returned `User`. It also seeds these concrete detail keys:
+
+- `rpcQuery.users.get.queryKey({ id: user.id, locale: user.locale })`
+- `httpQuery.users.get.queryKey({ params: { id: user.id }, query: { locale: user.locale } })`
+
+The locale is part of the read input. A response with locale `fr` does not satisfy a detail query
+whose constructor supplies the default locale `en`.
+
+Use the generated DataTag keys directly with `getQueryData` and `setQueryData`. QueryClient owns
+the hash function, including global and prefix defaults; the generated keys also serve native
+cancellation and invalidation. Do not hash the keys independently.
+
+## Apply and reconcile an optimistic write
+
+The example's mutation options perform these actions:
+
+1. Capture the original owner and reserve the write before awaiting anything.
+2. Cancel the related RPC and HTTP reads through their generated user branch prefixes.
+3. Snapshot the affected list and infinite entries. For deletion, keep the removed entity and its
+ positions. For creation, allocate a temporary negative ID that belongs to this write.
+4. Publish the optimistic change. Pending users cannot be deleted through the forms.
+5. Replace a created user's temporary ID with the response, or roll back the failed write.
+6. Invalidate both user branches when the final overlapping write settles.
+
+Mutation responses remain ordinary Effect success values. An optimistic rollback restores the
+application's cache; it cannot undo work the server has accepted.
+
+## Preserve infinite pages
+
+The example updates its existing four-user page views through their generated infinite keys.
+It retains every page, `pageParams`, and unrelated user. A failed deletion restores only the
+removed user at its former page position, preserving users created in the meantime.
+
+Creation adjusts the total count on cached pages. It appends the new user to the last loaded page
+only when that page has no next cursor. A partial directory waits for reconciliation to determine
+where the user belongs. Each reconstructed page retains the `UserPage` representation.
+
+Offset pagination can change after deletion or insertion. Preserving the current page structure
+keeps the optimistic view usable until settlement invalidation refreshes the server's page
+boundaries and cursors. Add concrete keys for any other page sizes or filters your application
+uses; this example registers only its existing page size and initial cursor.
+
+## Keep overlapping writes safe
+
+A full snapshot rollback can erase a later successful write. The example instead removes a
+failed creation's own temporary user, or restores one deleted user without replacing the list.
+Overlapping deletions retain their original relative order, even when their failures finish in a
+different order. Rollback places the removed user beside surviving original neighbors and keeps
+newly created users.
+An authoritative cache update supersedes the optimistic revision, even if its data is unchanged.
+A failed deletion leaves that newer update intact.
+Deletions started after a refresh capture the current user and position for rollback.
+Overlapping deletions of the same user share the first snapshot: one successful deletion prevents
+an older failure from restoring it, while all failed deletions restore the original entity once.
+
+Each new write cancels an earlier reconciliation fetch before publishing its optimistic change.
+Only the final pending write triggers settlement refetches, so an older settlement does not
+refresh over a newer optimistic result. Success callbacks also cancel reads before seeding the
+returned value. Native cancellation prevents a cancelled query from publishing a late result.
+
+All writes to these views must participate in the same application workflow. Background domain
+refreshes, manual cache replacement, and server-side write conflicts need their own coordination.
+The example does not infer server ordering or define a general conflict-resolution policy.
+
+## Retain the original owner
+
+The `onMutate` result carries the original owner's commit, rollback, and settlement actions.
+Callbacks invoke those actions and check that owner is active. A late response can neither refill
+a cleared retired cache nor seed or invalidate a replacement client's entries.
+
+Native MutationObserver option updates can replace callbacks on a pending mutation. Carrying the
+transaction in `onMutate` prevents a later callback closure from redirecting an already-started
+write. Remount mutation consumers when replacing an application owner: an options change while
+`onMutate` awaits cancellation can otherwise replace the mutation function before it starts.
+
+Track mutation-function completion before releasing the application's ready clients. These
+writes use `networkMode: 'always'` and `retry: false`, so a retired owner does not retain paused
+mutation work. They do not use a native mutation scope queue. Mutations have no query abort signal;
+retirement and cache clearing do not cancel an accepted server write.
diff --git a/apps/docs/src/content/docs/guides/pagination.md b/apps/docs/src/content/docs/guides/pagination.md
new file mode 100644
index 0000000..28d48d5
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/pagination.md
@@ -0,0 +1,53 @@
+---
+title: Pagination
+description: Map page parameters to typed RPC payloads and HTTP requests.
+---
+
+Use a ready [RPC](/effect-api-query/getting-started/quick-start/) or
+[HTTP](/effect-api-query/getting-started/http-quick-start/) utility tree.
+These examples assume `users.page` accepts numeric `cursor` and `pageSize` fields and returns
+`{ users, nextCursor }`, with `null` marking the last page.
+
+## Build page options
+
+Map each page parameter to RPC payload constructor input:
+
+```ts
+const rpcPages = rpc.users.page.infiniteOptions({
+ initialPageParam: 0,
+ input: (cursor) => ({ cursor, pageSize: 20 }),
+ getNextPageParam: (page) => page.nextCursor ?? undefined,
+})
+const pages = await queryClient.infiniteQuery(rpcPages)
+```
+
+For HTTP, return every declared request container from the mapper:
+
+```ts
+const httpPages = http.users.page.infiniteOptions({
+ initialPageParam: 0,
+ input: (cursor) => ({ query: { cursor, pageSize: 20 } }),
+ getNextPageParam: (page) => page.nextCursor ?? undefined,
+})
+```
+
+Pass these options to the native infinite-query hook to load further pages with `fetchNextPage`.
+Inputless operations omit `input`. Input-bearing operations can pause with `input: skipToken`;
+see [Conditional Queries](/effect-api-query/guides/conditional-queries/).
+
+## Keep page identity stable
+
+The mapped initial request determines cache identity. Keep filters in that request and every
+page; rebuild options when filters change. The mapper runs during key construction and page
+execution, so keep it deterministic.
+
+TanStack stores `pages` and `pageParams`. A native `select` can flatten returned data while cache
+reads retain the original pages and inferred page-parameter type:
+
+```ts
+const cachedPages = queryClient.getQueryData(httpPages.queryKey)
+```
+
+Infinite views have separate keys from ordinary queries. Every page uses the query runner and
+abort signal. See [RPC Builders](/effect-api-query/reference/generated-builders/#build-an-infinite-query)
+and [HTTP Builders](/effect-api-query/reference/http-builders/#pagination) for exact option contracts.
diff --git a/apps/docs/src/content/docs/guides/queries.md b/apps/docs/src/content/docs/guides/queries.md
new file mode 100644
index 0000000..6e68904
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/queries.md
@@ -0,0 +1,52 @@
+---
+title: Queries
+description: Build typed query options for cached RPC and HTTP reads.
+---
+
+Start with a ready utility tree and QueryClient from the [RPC quick start](/effect-api-query/getting-started/quick-start/)
+or [HTTP quick start](/effect-api-query/getting-started/http-quick-start/).
+Here, `users.get` returns a user with `id` and `name`; its RPC payload has an `id` and default locale.
+The HTTP endpoint declares `params.id` and `query.locale`.
+
+## Fetch decoded data
+
+Pass RPC payload constructor input to `queryOptions`:
+
+```ts
+const userOptions = rpc.users.get.queryOptions({ input: { id: 1 }, staleTime: 30_000 })
+const user = await queryClient.query(userOptions)
+```
+
+HTTP options take the complete decoded request. Include every declared container:
+
+```ts
+const httpUserOptions = http.users.get.queryOptions({
+ input: { params: { id: 1 }, query: { locale: 'en' } },
+ staleTime: 30_000,
+})
+const httpUser = await queryClient.query(httpUserOptions)
+```
+
+These options also work with native query, suspense, and prefetch hooks. An inputless operation
+uses `queryOptions()`. Queries cache decoded success, with top-level `undefined` converted to `null`.
+Keep captured input values unchanged while using the options.
+
+## Select returned data
+
+Native options such as `staleTime`, `retry`, and `select` pass through:
+
+```ts
+const nameOptions = rpc.users.get.queryOptions({
+ input: { id: 1 },
+ select: (user) => user.name,
+})
+const selectedName = await queryClient.query(nameOptions)
+const cachedUser = queryClient.getQueryData(nameOptions.queryKey)
+```
+
+Hooks, observers, and `queryClient.query` return the selected name. The cache and `getQueryData`
+retain the decoded user; generated keys preserve that type. Builders supply `queryKey` and `queryFn`.
+Configure hashing through [QueryClient defaults](/effect-api-query/guides/query-defaults/).
+
+Continue with [Conditional Queries](/effect-api-query/guides/conditional-queries/),
+[Cache Keys and Filters](/effect-api-query/guides/cache-filters/), or your framework's integration guide.
diff --git a/apps/docs/src/content/docs/guides/query-defaults.md b/apps/docs/src/content/docs/guides/query-defaults.md
new file mode 100644
index 0000000..d74d994
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/query-defaults.md
@@ -0,0 +1,120 @@
+---
+title: Defaults and Policies
+description: Reuse native cache defaults and typed query or mutation policies.
+---
+
+Choose where each setting belongs, then reuse it across generated builders:
+
+| Scope | Use | Suitable settings |
+| ------------------------ | ------------------------------------------- | --------------------------------------------------------------- |
+| Cache owner or namespace | QueryClient defaults and generated prefixes | Common freshness, retry, garbage collection, and hashing |
+| One leaf and query view | `withQueryPolicy` | Freshness and typed data/error callbacks |
+| One mutation leaf | `withMutationPolicy` | Typed invalidation and other mutation callbacks |
+| One call | The options builder | Input, selection, initial data, pagination, and local overrides |
+
+Use your existing utility tree and application-owned QueryClient. Policies preserve the original
+builder's inference; the library continues to supply its keys and execution functions.
+
+## Register native defaults
+
+In the cache module, import `QueryClient` from `@tanstack/query-core` and `viewPrefix` from
+`effect-api-query`:
+
+```ts
+const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: { staleTime: 30_000, gcTime: 600_000, retry: false, retryDelay: 250 },
+ mutations: { retry: false },
+ },
+})
+```
+
+After creating `rpc` with its ready client, register broader prefixes before narrower prefixes:
+
+```ts
+queryClient.setQueryDefaults(rpc.key(), { staleTime: 60_000 })
+queryClient.setQueryDefaults(rpc.users.key(), { retry: 2 })
+queryClient.setQueryDefaults(viewPrefix(rpc.users.get, 'query'), { staleTime: 120_000 })
+```
+
+TanStack merges global defaults, matching registered prefixes in registration order, and explicit
+builder options. It does not sort prefixes by specificity. Here `users.get` inherits
+`gcTime: 600_000`, `retry: 2`, and `staleTime: 120_000`; two retries allow at most three executions.
+
+`rpc.key()` covers the tree, `rpc.users.key()` covers its branch, and the view prefix covers only
+ordinary queries of that leaf, for every input. HTTP uses the same native APIs:
+
+```ts
+queryClient.setQueryDefaults(http.users.key(), { retry: 1 })
+queryClient.setQueryDefaults(viewPrefix(http.users.get, 'metadata'), { staleTime: 5_000 })
+```
+
+This five-second policy applies to metadata without changing the ordinary view's freshness.
+Register mutation defaults separately with native `setMutationDefaults` and `mutationKey()`.
+See [Cache Keys and Filters](/effect-api-query/guides/cache-filters/) for prefix scopes.
+
+Configure hashing through QueryClient defaults before using the cache, and keep it stable for the
+cache owner's lifetime. Builders reject per-call hashing overrides; see
+[Semantic Keys](/effect-api-query/concepts/semantic-keys/) for the identity contract.
+
+## Bind a reusable query policy
+
+Use `withQueryPolicy` when a policy belongs to one leaf and view. `QueryPolicy` gives reusable
+objects that leaf's native option types; retry and refetch callbacks retain its data and error types.
+Import both from `effect-api-query`:
+
+```ts
+const policy = {
+ staleTime: 30_000,
+ refetchOnWindowFocus: false,
+ retry: false,
+} satisfies QueryPolicy
+const userOptions = withQueryPolicy(rpc.users.get, 'query', policy)
+const user = userOptions({ input: { id: 1 }, select: (value) => value.name })
+const refreshUser = userOptions({ input: { id: 1 }, staleTime: 0, retry: false })
+```
+
+The returned builder keeps selected-data, defined-initial-data, skipped-input, and page-parameter
+inference. `QueryPolicy` supports only that leaf's query views: `query`, `infinite`,
+`metadata`, `live`, or `streamed`. Specify the view in the type when it is not `query`.
+See [Type Inference](/effect-api-query/reference/type-inference/) for cache and failure types, and
+[Retry Queries](/effect-api-query/guides/retry-queries/) for reusable domain-aware decisions.
+
+Policies accept applicable native freshness, retry, refetch, and cache settings. Keep input,
+`select`, initial and placeholder data, page parameters and mappers, and adapter controls at the
+call site. Stream retention and decoder policies determine cache identity and also stay local.
+
+A bound policy supplies explicit builder options, so it overrides QueryClient defaults. Call-site
+options override the bound policy. Omit a field to inherit it; use `staleTime: 0` or `retry: false`
+to replace an inherited setting.
+
+## Bind mutation invalidation
+
+Import `withMutationPolicy` from `effect-api-query`. Seed the returned user and invalidate affected
+reads once for every use of the creation builder:
+
+```ts
+const createUserOptions = withMutationPolicy(rpc.users.create, {
+ onSuccess: async (created) => {
+ queryClient.setQueryData(rpc.users.get.queryKey({ id: created.id }), created)
+ await queryClient.invalidateQueries({ queryKey: rpc.users.key() })
+ },
+})
+```
+
+Shared callbacks infer data, variables, and execution errors. `MutationPolicy` can annotate a
+reusable object. Its optimistic result is `unknown`: supply `onMutate` at each call site to infer
+that result in local callbacks. Here `reportCreationFailure` is the application's failure notifier:
+
+```ts
+const createUser = createUserOptions({
+ onMutate: (variables) => ({ submittedName: variables.name }),
+ onError: (error, _variables, context) => {
+ reportCreationFailure(context?.submittedName, error)
+ },
+})
+```
+
+A call-site callback replaces the corresponding shared callback. Compose callbacks explicitly
+when both must run. The [complete example](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/docs-policies.ts)
+includes ready-client types and the imports used here.
diff --git a/apps/docs/src/content/docs/guides/react-query.md b/apps/docs/src/content/docs/guides/react-query.md
index a79d954..7aa6075 100644
--- a/apps/docs/src/content/docs/guides/react-query.md
+++ b/apps/docs/src/content/docs/guides/react-query.md
@@ -1,76 +1,195 @@
---
title: React Query
-description: Use generated options with React Query hooks.
+description: Acquire a ready client and use generated options with native React Query hooks.
---
-Create the RPC utility tree beside the application's `QueryClient`, then provide both through your
-application context. Generated options pass directly to React Query hooks.
+Pass generated options directly to React Query's native hooks. Build the utility tree once for
+its ready client and cache owner. Rebuild options when component input changes; the builders
+capture plain input for that execution.
-In the example below, `AppRpcQuery` is your utility tree's type, such as `typeof rpcQuery`.
+## Acquire and mount the client
+
+Create a small client module and mount it once from your application entry point.
+This read-only example requires React, React DOM, `@tanstack/react-query`, Effect, and
+`effect-api-query`. The server must implement the shared contract below: `GET /users/:id`
+returns `{ id: number, name: string }`.
+
+### Contract and ready client
+
+Place this code in `users-app.tsx`. Move `usersApi` to your shared contract module when connecting
+it to a real server. `startUsersApplication` acquires the ready HTTP API client and keeps one runtime
+and QueryClient alive until `dispose` runs.
```tsx
-import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
-
-export const Users = ({ rpcQuery }: { rpcQuery: AppRpcQuery }) => {
- const queryClient = useQueryClient()
- const users = useQuery(rpcQuery.users.list.queryOptions())
- const removeUser = useMutation(
- rpcQuery.users.delete.mutationOptions({
- onSuccess: () => queryClient.invalidateQueries({ queryKey: rpcQuery.users.key() }),
+import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/react-query'
+import { ManagedRuntime, Schema } from 'effect'
+import { createHttpApiQueryUtils } from 'effect-api-query'
+import type { RunPromiseExit } from 'effect-api-query'
+import { FetchHttpClient } from 'effect/http'
+import { HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup } from 'effect/http-api'
+import { createRoot } from 'react-dom/client'
+
+const usersApi = HttpApi.make('users-api').add(
+ HttpApiGroup.make('users').add(
+ HttpApiEndpoint.get('get', '/users/:id', {
+ params: { id: Schema.Int },
+ success: Schema.Struct({ id: Schema.Int, name: Schema.String }),
}),
- )
-
- if (users.data === undefined) return null
-
- return (
-
- {users.data.map((user) => (
-
- {user.name}
-
-
- ))}
-
- )
+ ),
+)
+
+const startUsersApplication = async (baseUrl: string) => {
+ const runtime = ManagedRuntime.make(FetchHttpClient.layer)
+ const running = new Set>()
+ const runPromiseExit: RunPromiseExit = (effect, options) => {
+ const pending = runtime.runPromiseExit(effect, options)
+ running.add(pending)
+ void pending.then(
+ () => running.delete(pending),
+ () => running.delete(pending),
+ )
+ return pending
+ }
+ try {
+ const client = await runtime.runPromise(HttpApiClient.make(usersApi, { baseUrl }))
+ const queryClient = new QueryClient()
+ const http = createHttpApiQueryUtils(usersApi, {
+ client,
+ keyPrefix: ['users-app'],
+ runPromiseExit,
+ })
+ return {
+ http,
+ queryClient,
+ dispose: async () => {
+ try {
+ await queryClient.cancelQueries()
+ } finally {
+ try {
+ await Promise.allSettled([...running])
+ } finally {
+ queryClient.clear()
+ await runtime.dispose()
+ }
+ }
+ },
+ }
+ } catch (error) {
+ await runtime.dispose()
+ throw error
+ }
}
```
-Payload-bearing queries take constructor input inside the options argument:
+The supplied runner forwards TanStack's abort options and tracks in-flight reads. After cancellation,
+disposal waits for their Effect finalizers before releasing the runtime. Client acquisition finishes
+before React renders. Acquisition failures also dispose the runtime.
-```ts
-useQuery(rpcQuery.users.get.queryOptions({ input: { id: 1 } }))
-```
-
-Pass mutation variables when calling `mutate`:
+### Component and provider
-```ts
-const createUser = useMutation(rpcQuery.users.create.mutationOptions())
-createUser.mutate({ name: 'Ada' })
-```
+Continue in the same module. The component receives the ready utility tree through props;
+`QueryClientProvider` exposes the matching cache to React Query.
-Streaming RPCs use the ordinary `useQuery` and `useSuspenseQuery` hooks. Choose whether the cache
-should retain every value or only the latest value:
+```tsx
+type UsersApplication = Awaited>
+
+const User = ({ application }: { readonly application: UsersApplication }) => {
+ const user = useQuery(application.http.users.get.queryOptions({ input: { params: { id: 1 } } }))
+ if (user.isPending) {
+ return
Loading user…
+ }
+ if (user.isError) {
+ return
Could not load the user.
+ }
+ return
{user.data.name}
+}
-```ts
-const events = useQuery(rpcQuery.events.watch.streamedOptions())
-const latestEvent = useQuery(rpcQuery.events.watch.liveOptions())
+export const mountUsersApplication = async (element: HTMLElement, baseUrl: string) => {
+ const application = await startUsersApplication(baseUrl)
+ const root = createRoot(element)
+ root.render(
+
+
+ ,
+ )
+ return async () => {
+ root.unmount()
+ await application.dispose()
+ }
+}
```
-The package owns each generated `queryFn`, `queryKey`, `queryKeyHashFn`, `mutationFn`, and
-`mutationKey`. Stream builders own the same query fields. Other TanStack Query options, including `select`,
-`retry`, and lifecycle callbacks, retain their normal TanStack types.
+### Application entry point
-## Use an HTTP endpoint
-
-The same hooks accept HTTP options. For an endpoint that declares an `id` parameter, use:
+In `main.tsx`, mount into the root element supplied by your HTML page. Replace the base URL with
+your server's URL.
```ts
-const user = useQuery(http.users.get.queryOptions({ input: { params: { id: 1 } } }))
-```
+import { mountUsersApplication } from './users-app.tsx'
-Follow [HTTP Queries and Mutations](/effect-api-query/guides/http-queries-and-mutations/) to create
-the HTTP utilities and configure mutation invalidation.
+const element = document.getElementById('root')
+if (element === null) {
+ throw new Error('Missing application root element')
+}
+
+export const stopUsers = await mountUsersApplication(element, 'http://localhost:3000')
+```
-The [public RPC consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/public-contract.ts) and
-[public HTTP consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/http-contract.ts) compile these hook patterns.
-The [Vite React example](/effect-api-query/examples/) provides the application setup.
+The host calls and awaits `stopUsers()` when tearing down this application;
+it unmounts React, cancels outstanding reads, awaits their local finalizers, clears the cache,
+and disposes the runtime.
+A browser's unload event cannot guarantee that async cleanup finishes.
+
+This example has one buffered read. Before adding open streams or concurrent writes, use
+[Client Lifecycle](/effect-api-query/concepts/client-lifecycle/) to await their cleanup and settlement.
+For RPC, replace client acquisition with the Scope and protocol in
+[RPC Quick Start](/effect-api-query/getting-started/quick-start/) and pass the resulting RPC utility
+tree to the component. The provider and React hooks stay the same.
+
+## Choose the native hook
+
+The provider and component above use a buffered HTTP query. RPC uses the same hooks with its
+[constructor input](/effect-api-query/concepts/data-normalization/#query-stable-rpc-payloads);
+HTTP takes [decoded request input](/effect-api-query/concepts/data-normalization/#decoded-http-inputs).
+
+| Native consumer | Generated options | Cached representation |
+| ------------------ | -------------------------------------- | ------------------------------------------------------ |
+| `useQuery` | `queryOptions`, HTTP `metadataOptions` | Decoded data, or decoded data with status and headers |
+| `useInfiniteQuery` | `infiniteOptions` | Pages with their page parameters |
+| `useQuery` | `streamedOptions`, `liveOptions` | Retained history, or the latest emitted value |
+| `useMutation` | `mutationOptions` | Mutation result; variables supplied when `mutate` runs |
+
+Pass `select`, `staleTime`, retry policy, and other native options through the builder.
+`select` changes observer data while the cache retains the generated view's query data.
+Configure hashing on QueryClient before cache use. The package owns the generated key and function.
+See [RPC Builders](/effect-api-query/reference/generated-builders/) and
+[HTTP Builders](/effect-api-query/reference/http-builders/) for each view's exact contract.
+
+## Share policy and refresh affected reads
+
+Use [Defaults and Policies](/effect-api-query/guides/query-defaults/) to bind an endpoint-aware
+policy once, then reuse it in components, imperative queries, or route loaders. A call-site
+projection or callback keeps its native inference.
+
+For writes, pass generated mutation options to `useMutation` and supply variables through
+`mutate`. Choose the affected generated keys in the application: writes do not invalidate reads
+automatically. Use [Cache Keys and Filters](/effect-api-query/guides/cache-filters/) for broad or exact
+invalidation and [Optimistic Updates](/effect-api-query/guides/optimistic-writes/) for response seeding,
+rollback, and overlapping writes.
+
+## Streams and Suspense
+
+Ordinary hooks can show stream data while fetching continues. Choose
+[history retention](/effect-api-query/guides/choose-stream-history/) for accumulated views and keep
+clients alive until local iterator finalizers finish.
+
+TanStack documents that cancellation does not work with its Suspense hooks. Use ordinary query
+hooks when cancelling reads or stopping open stream work is part of the screen's lifecycle.
+For buffered reads with Suspense, use
+[Suspense and Error Recovery](/effect-api-query/guides/suspense-and-recovery/) for reset/retry,
+cached-data refetch failures, and independent loading with `useSuspenseQueries`.
+
+For router loaders and server rendering, continue with
+[Router and Start](/effect-api-query/guides/tanstack-start/).
+The [Vite React example](/effect-api-query/examples/#run-vite-react) is a complete application with
+reads, writes, streams, private cache owners, and resource disposal.
diff --git a/apps/docs/src/content/docs/guides/refresh-from-events.md b/apps/docs/src/content/docs/guides/refresh-from-events.md
new file mode 100644
index 0000000..4da4635
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/refresh-from-events.md
@@ -0,0 +1,101 @@
+---
+title: Refresh Reads from Domain Events
+description: Map domain delivery and Effect Reactivity to scoped native Query invalidation.
+---
+
+Use one application-owned consumer to map a domain event to the reads it changes. The mapping
+must name both adapters when RPC and HTTP represent the same domain: their generated cache roots
+remain separate.
+
+Copy [the user-event consumer](https://github.com/ueberBrot/effect-api-query/blob/main/tests/fixtures/user-events.ts)
+next to your owner, write, and client modules, adjusting its local application imports. Its inputs are the captured owner and
+an application-owned Effect Reactivity service. Supply your own decoded network stream; the module
+creates no connection, broker, provider, or second cache.
+
+## Map events to reads
+
+The `users.v1` envelope includes the consumer's `ownerKey`, a positive safe-integer cursor, and one
+of these event kinds:
+
+| Event | Reads invalidated |
+| -------------------------------------- | ----------------------------------------------------------------- |
+| `users.changed` | RPC and HTTP list/page prefixes, including infinite page entries. |
+| `user.changed`, with `id` and `locale` | Those directory prefixes and both exact user-detail keys. |
+| `users.reset` | Both complete user branches. |
+
+Other user IDs, locales, and diagnostic branches remain untouched by an ordinary detail event.
+Generated keys and native filters retain the owning QueryClient's global and prefix hash defaults.
+The mapping depends on the domain relationship, so the package does not infer it from mutation or
+event names.
+
+The `ownerKey` contains safe tenant, user, session, and permission-generation identity. It is a
+routing partition, not authentication. The application must authenticate the transport and
+validate which owner may receive each event.
+
+## Register one consumer for the owner
+
+`makeUserEventConsumer`, `decodeUserEvent` and `flush` are application helpers from the linked
+consumer module. Import `Effect` and `Stream` from `effect`; provide the captured `owner` and
+application `reactivity` service. Inside the owner's Effect Scope, acquire once:
+
+Acquire `consumer` with `yield* makeUserEventConsumer(owner, reactivity, { observedUsers:
+[{ id: 1, locale: 'en' }] })`. This registers the owner's selected local detail mappings.
+
+In that same scope, attach the supplied network stream with its existing service/error channels:
+
+```ts
+const consume = (events: Stream.Stream) =>
+ events.pipe(
+ Stream.mapEffect((event) => decodeUserEvent(event)),
+ Stream.runForEach(consumer.deliver),
+ Effect.ensuring(Effect.promise(consumer.flush)),
+ )
+```
+
+Run `consume(events)` with the application's runtime. The
+[complete typed attachment](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/docs-user-events.ts)
+shows composition. It rejects inactive/duplicate owners and unregisters listeners on Scope closure.
+A retired consumer ignores late delivery and cannot redirect it to a replacement QueryClient.
+Close its Scope, cancel/drain started reads, then release clients before replacing the owner.
+See [Switch Cache Owners](/effect-api-query/guides/switch-cache-owners/).
+
+## Coalesce local invalidation
+
+Use the consumer's `reactivityKeys.directory`, `reactivityKeys.all`, or
+`reactivityKeys.user({ id, locale })` with Effect Reactivity. Exact local user mappings exist for
+the `observedUsers` registered when the consumer starts; include every detail read your local
+writers must refresh. Delivered domain events can target any valid user.
+
+These keys are stable application strings. Reactivity hashes its own keys; a TanStack query tuple
+has no implied Reactivity subscription or prefix relationship. Register the deliberate mapping
+rather than passing generated tuples to both systems.
+
+The consumer coalesces invalidation intent and lets broad refreshes subsume narrow work.
+It defers refresh while its captured QueryClient has pending mutations, protecting optimistic
+writes; other refresh paths need the same application policy. `flush()` drains runnable batches,
+leaving intent queued during pending writes. Refresh-job errors go to `onRefreshError`; query
+errors retain native Query retry/state behavior. See the linked consumer for its bookkeeping
+bounds and [Optimistic User Writes](/effect-api-query/guides/optimistic-writes/) for overlap rules.
+
+## Resume delivery deliberately
+
+This recipe assumes one ordered, monotonically increasing cursor sequence per owner. It ignores
+cursors already accepted. A gap queues a full user-branch refresh and advances the accepted cursor.
+The cursor records accepted invalidation intent; it is not a durable acknowledgement or a claim
+that a read succeeded.
+
+Reconnect using `consumer.cursor()` as the last accepted cursor. Call `consumer.resume(true)` when
+the transport can replay subsequent events in order. Replayed duplicates remain harmless. If
+replay is unavailable, call `consumer.resume(false)` before accepting the new sequence: it resets
+the cursor and refreshes both user branches. Stop delivery from the old connection first.
+
+The application owns reconnect backoff, replay retention, cursor storage, source epochs, schema
+migration, authorization, acknowledgements, and out-of-order delivery handling. A new owner Scope
+starts at cursor zero. Fetch its authoritative reads on startup; this recipe does not promise
+durable or exactly-once delivery. Invalid envelopes fail Schema decoding before changing the cursor.
+
+## Choose a visible stream view
+
+Use a live query for complete snapshots or bounded history for recent events. The latest delta
+alone does not reconstruct state. An indefinitely open `replace` stream does not publish a
+replacement before completion; see [Choose Stream History](/effect-api-query/guides/choose-stream-history/).
diff --git a/apps/docs/src/content/docs/guides/retry-queries.md b/apps/docs/src/content/docs/guides/retry-queries.md
new file mode 100644
index 0000000..0e5da3c
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/retry-queries.md
@@ -0,0 +1,141 @@
+---
+title: Retry Queries
+description: Reuse bounded read policies with typed Effect failures and native Query options.
+---
+
+Bind a retry policy once with `withQueryPolicy`, then call the returned options builder wherever
+you need that read. Each call keeps native `select`, input, and initial-data inference. Call-site
+options replace matching defaults.
+
+The policy below permits two retries after the initial failure: at most three executions. It
+allows a declared `RetryLater` or an application-approved transport failure. Use it for idempotent
+reads whose transport does not already own retries.
+
+## Share the decision and delay
+
+Import `Cause`, `Result`, and `Schema` from `effect`. Define `RetryLater` with a finite
+`retryAfterMs` field in your contract, then reuse this application helper for RPC and HTTP:
+
+```ts
+const retryPolicy = (
+ causeOf: (error: Error) => Cause.Cause | undefined,
+ isTransient: (failure: Failure) => boolean,
+) => ({
+ retry: (failureCount: number, error: Error) => {
+ const cause = causeOf(error)
+ if (
+ !cause ||
+ failureCount >= 2 ||
+ Cause.hasDies(cause) ||
+ Cause.hasInterrupts(cause) ||
+ cause.reasons.length !== 1
+ ) {
+ return false
+ }
+ const failure = Cause.findError(cause)
+ return (
+ Result.isSuccess(failure) &&
+ (Schema.is(RetryLater)(failure.success) || isTransient(failure.success))
+ )
+ },
+ retryDelay: (attemptIndex: number, error: Error) => {
+ const cause = causeOf(error)
+ if (cause) {
+ const failure = Cause.findError(cause)
+ if (Result.isSuccess(failure) && Schema.is(RetryLater)(failure.success)) {
+ return Math.min(30_000, Math.max(0, failure.success.retryAfterMs))
+ }
+ }
+ return Math.min(1_000 * 2 ** attemptIndex, 30_000)
+ },
+})
+```
+
+This rejects defects, interruptions, and Causes with multiple reasons. `Cause.findError` returns
+a `Result`; the successful value retains the typed failure union. Schema refinement also handles
+unknown values safely. The adapter guard rejects custom runner failures that pass through unchanged.
+
+## Bind a typed RPC policy
+
+Import `withQueryPolicy`, `isEffectRpcQueryError`, and the type `InferQueryError` from
+`effect-api-query`, plus `RpcClientError` from `effect/rpc`. After acquiring your ready client and
+creating `rpc`, bind the profile read:
+
+```ts
+type Error = InferQueryError
+const read = withQueryPolicy(
+ rpc.profile.read,
+ 'query',
+ retryPolicy(
+ (error: Error) => (isEffectRpcQueryError(error) ? error.cause : undefined),
+ (failure) =>
+ Schema.is(RpcClientError.RpcClientError)(failure) &&
+ failure.reason._tag === 'HttpError' &&
+ failure.reason.kind === 'TransportError',
+ ),
+)
+return read()
+```
+
+This application allows only RPC's HTTP transport failures. Socket and worker reconnect policy
+belongs to the application that owns those transports.
+
+## Bind the same decision to HTTP
+
+Import `isEffectHttpApiQueryError` from `effect-api-query` and `HttpClientError` from `effect/http`. Keep the shared retry
+logic and supply HTTP's transport classifier:
+
+```ts
+type Error = InferQueryError
+const read = withQueryPolicy(
+ http.profile.read,
+ 'query',
+ retryPolicy(
+ (error: Error) => (isEffectHttpApiQueryError(error) ? error.cause : undefined),
+ (failure) =>
+ HttpClientError.isHttpClientError(failure) && failure.reason._tag === 'TransportError',
+ ),
+)
+return read()
+```
+
+Encoding, decoding, response, `NotFound`, and authentication failures receive no retry. Restore an
+expired session before invalidating its affected queries.
+
+The [complete compiled recipe](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/docs-retry.ts)
+contains the contracts and both ready-client factories. See [Query Defaults](/effect-api-query/guides/query-defaults/)
+for policy types, mutation callbacks, and precedence.
+
+## Set defaults deliberately
+
+| Execution | Native retry default without application overrides |
+| -------------------------------------------------------------- | -------------------------------------------------- |
+| Browser query observer, such as `useQuery` | Three retries after the initial attempt |
+| Server query observer | Zero retries |
+| Imperative `queryClient.query` and `queryClient.infiniteQuery` | Retries disabled |
+| Mutation | Retries disabled |
+
+QueryClient global and prefix defaults still apply. Set `retry` explicitly when attempt counts
+matter. `retry: 2` permits three executions; `retry: false` permits one.
+
+Choose one layer to own retries. Two retries in TanStack combined with two retries per invocation
+in Effect can make nine client attempts. A retry around iterable creation does not retry later
+stream consumption. Restart a stream only when safe for that operation; retention and refetch policy
+still govern cache publication. Mutation retries require application idempotency.
+
+`retryDelay` receives a zero-based attempt index and returns milliseconds. Query Core can evaluate
+it for terminal failures, so keep it pure. This recipe clamps server delays and exponential backoff
+to 30 seconds.
+
+## Handle preparation before execution
+
+Factory, builder, and key-generation errors are synchronous. Prepare options inside `try` when
+input or custom encoders may fail, then pass successful options to Query Core. Preparation failures
+never enter execution retry. An infinite page-input mapper runs later; its thrown errors pass
+through unchanged. Mutation encoding occurs inside the ready client's Effect and uses its Cause.
+
+Keep QueryClient hashing stable while entries remain cached. `UnsupportedQueryHash` rejects an
+incompatible stream cache policy; retries cannot repair it. Retire the cache before replacing its
+hasher. See [Failure Handling](/effect-api-query/guides/handle-failures/) for error-stage guards and
+[Client Lifecycle](/effect-api-query/concepts/client-lifecycle/#stream-creation-and-consumption)
+for stream execution boundaries.
diff --git a/apps/docs/src/content/docs/guides/solid-query.md b/apps/docs/src/content/docs/guides/solid-query.md
new file mode 100644
index 0000000..edec2ed
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/solid-query.md
@@ -0,0 +1,57 @@
+---
+title: Solid Query
+description: Rebuild generated options with a Solid accessor and keep client resources alive.
+---
+
+Pass generated options from either factory to Solid Query's native hooks. Configure
+`QueryClientProvider` and acquire the ready client before creating the utilities.
+
+The examples target Solid 1.9.15 with Solid Query 5.104.0 and Query Core 5.104.0.
+
+## Rebuild options when input changes
+
+Builders capture plain input when called. Build options inside Solid's options accessor so a
+changed input produces a new key and query function. Passing a builder's result once leaves the
+query attached to the original input.
+
+Keep [captured inputs unchanged](/effect-api-query/concepts/data-normalization/#keep-captured-inputs-unchanged)
+while their options can execute.
+
+In component setup, use `rpc` from your [ready client](/effect-api-query/getting-started/quick-start/)
+and pass the builder call as an accessor. Here `users.read` accepts an ID and returns a user
+with `name`:
+
+```ts
+import { useQuery } from '@tanstack/solid-query'
+import { skipToken } from 'effect-api-query'
+import { createSignal } from 'solid-js'
+
+import { rpc } from './queries.ts'
+
+const [userId] = createSignal(1)
+const user = useQuery(() => {
+ const id = userId()
+ return rpc.users.read.queryOptions({
+ input: id === undefined ? skipToken : { id },
+ select: (value) => value.name,
+ })
+})
+```
+
+Read the selected value from `user.data`. Apply the same accessor pattern to `infiniteOptions`,
+`streamedOptions`, `liveOptions`, and `metadataOptions` when their input changes. Use
+`useMutation(() => rpc.users.write.mutationOptions())` for writes, supplying each execution's
+input through `mutate(variables)`. Read reactive mutation settings inside the accessor.
+
+## Choose native options carefully
+
+Solid accepts Core's `enabled(query)` callback. Solid Query 5.104.0 query and infinite-query
+overloads accept defined initial data or absent initial data. A value or initializer that may
+return `undefined` does not match those overloads. Omit `initialData` or supply a defined seed.
+An explicit `initialData: undefined` overrides inherited QueryClient initial data.
+
+## Own the native integration
+
+Follow the [shared integration lifetime](/effect-api-query/integrations/#own-the-cache-and-client-lifetime)
+for providers, observer removal, stream finalizers, and accepted mutations. Match this native
+wrapper to the application's Query Core and the framework's supported compiler/tooling.
diff --git a/apps/docs/src/content/docs/guides/stream-snapshots.md b/apps/docs/src/content/docs/guides/stream-snapshots.md
new file mode 100644
index 0000000..b4d06c1
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/stream-snapshots.md
@@ -0,0 +1,80 @@
+---
+title: Stream Snapshots
+description: Capture an accumulated or live stream for server rendering and hydrate an independent browser cache.
+---
+
+Use `fetchStreamSnapshot` when server rendering needs data from an open RPC or HTTP SSE query.
+It waits for the first new cache publication or normal completion, cancels the exact query, and
+awaits its local iterator cleanup. Ordinary `queryClient.query` waits for an open stream to finish.
+
+## Capture data before dehydration
+
+Import `fetchStreamSnapshot` from `effect-api-query`. In the request loader or server snapshot
+module, use your existing `rpc`, request-local `queryClient` and abort `signal`. Keep the ready
+client and runner alive until capture settles. For the declared `updates.watch` stream:
+
+```ts
+const input = { channel: 'announcements' }
+const history = await fetchStreamSnapshot(
+ queryClient,
+ rpc.updates.watch.streamedOptions({
+ input,
+ retry: false,
+ maxChunks: 20,
+ }),
+ { signal, timeoutMs: 5_000 },
+)
+```
+
+In the same request, capture the independent latest-value view:
+
+```ts
+const latest = await fetchStreamSnapshot(
+ queryClient,
+ rpc.updates.watch.liveOptions({
+ input,
+ retry: false,
+ }),
+ { signal, timeoutMs: 5_000 },
+)
+```
+
+Then dehydrate successful data with your application's serializer, and dispose request resources
+after cleanup. HTTP SSE accepts the same helper with its generated options. The
+[complete typed recipe](https://github.com/ueberBrot/effect-api-query/blob/main/tests/types/docs-stream-snapshot.ts)
+includes contract/client composition; [Hydrate Query Views](/effect-api-query/guides/hydrate-query-views/)
+covers history, live values and paired codecs.
+
+The default `fresh` mode starts a new attempt even when cached or initial data has a future
+timestamp. Old data cannot settle that attempt. Native stream policies still apply: `append`
+includes existing history, and `replace` on a previously fetched query publishes only at completion.
+An open replacement stream therefore needs to complete or reach the timeout.
+
+Choose `mode: 'cached'` to return an existing successful value without starting or cancelling work.
+The helper applies native `select`, including QueryClient defaults. When no successful cache entry
+exists, cached mode starts a fresh capture.
+
+## Keep capture ownership exclusive
+
+Use a request-local QueryClient and reserve the exact key throughout capture. A fresh capture
+rejects a key that is fetching, paused, or observed. Other keys keep running. Avoid same-key writes,
+observers, or concurrent fetches until capture settles: an external `setQueryData` publication can
+otherwise be mistaken for the stream's first value. Configure hashing through QueryClient global
+or prefix defaults; per-call `queryHash` and `queryKeyHashFn` are rejected.
+
+The helper waits for the supplied query function to finish local cleanup before returning or rejecting.
+Dispose the server's ready client, Scope, or runtime after that settlement. This does not await a
+remote server's cancellation acknowledgement. A finalizer that never finishes also prevents
+settlement; `timeoutMs` limits the wait for data, not the duration of finalization.
+
+## Hydrate and reconnect in the browser
+
+Give the browser its own QueryClient, ready client, runner, and Scope. Hydrate the server snapshot
+using the same safe key prefix and input, then observe the generated stream options with your
+usual refetch policy. A new browser fetch reconnects with browser-owned resources; disposing the
+server's resources cannot dispose those resources.
+
+The [TanStack Start example](/effect-api-query/guides/tanstack-start/) captures server snapshots
+and reconnects accumulated and live views after hydration. The
+[helper reference](/effect-api-query/reference/public-exports/#fetchstreamsnapshot) defines timeout,
+abort, failure, empty-stream, and completion outcomes.
diff --git a/apps/docs/src/content/docs/guides/streaming.md b/apps/docs/src/content/docs/guides/streaming.md
new file mode 100644
index 0000000..fb82c49
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/streaming.md
@@ -0,0 +1,68 @@
+---
+title: Streaming
+description: Cache accumulated or latest values from RPC streams and HTTP SSE.
+---
+
+Streaming leaves provide two views: an accumulated streamed query caches emissions in order;
+a live query caches the latest value. Use ordinary query hooks or `QueryObserver` for both.
+Start with a ready [RPC](/effect-api-query/getting-started/quick-start/) or
+[HTTP](/effect-api-query/getting-started/http-quick-start/) utility tree.
+Here, `diagnostics.stream` is an inputless RPC emitting strings, and `events.watch` is an HTTP SSE
+endpoint declaring `query.channel` and emitting strings.
+
+## Accumulate values
+
+Choose a finite history for a long-running feed:
+
+```ts
+const history = rpc.diagnostics.stream.streamedOptions({
+ maxChunks: 100,
+ refetchMode: 'reset',
+})
+```
+
+HTTP SSE supports the same history controls and a separate decoder limit:
+
+```ts
+const sseHistory = http.events.watch.streamedOptions({
+ input: { query: { channel: 'news' } },
+ maxChunks: 100,
+ sseOptions: { maxEventSize: 1024 * 1024 },
+})
+```
+
+The first emission makes the query successful while fetching continues. `maxChunks` bounds
+cached elements after each emission; omitted means unlimited. It does not bound bytes or
+transport buffering. Refetch mode `reset` starts a new history, `append` adds to it, and `replace`
+keeps the old history until successful completion. An indefinitely open replacement keeps
+showing that old history. Accumulated streams can succeed without emissions.
+
+## Keep the latest value
+
+Choose live options for current state:
+
+```ts
+const latest = rpc.diagnostics.stream.liveOptions()
+const latestSse = http.events.watch.liveOptions({
+ input: { query: { channel: 'news' } },
+ sseOptions: { maxEventSize: 1024 * 1024 },
+})
+```
+
+Each emission replaces cached data; completion preserves it. Live queries convert top-level
+`undefined` to `null`, while accumulated elements retain `undefined`. Empty live completion
+raises the adapter's empty-stream error. Live options accept neither `maxChunks` nor `refetchMode`.
+
+## Address and stop a view
+
+Reuse the options' `queryKey` for exact cache access. Accumulated history policies and HTTP decoder
+policies affect identity; live and accumulated views remain separate. Endpoint prefixes match
+all their views.
+
+Cancellation closes the stream iterator. Your application owns reconnection, resume policy,
+and client lifetime. HTTP `sseOptions.maxEventSize` bounds pending parser text in JavaScript string
+code units; its default is 10 × 1024 × 1024 code units. Declared resume headers belong in `input.headers`.
+
+See [Choose Stream History](/effect-api-query/guides/choose-stream-history/) for retention and
+buffering, [Stream Snapshots](/effect-api-query/guides/stream-snapshots/) for finite server captures,
+and [Client Lifecycle](/effect-api-query/concepts/client-lifecycle/) for cleanup ownership.
diff --git a/apps/docs/src/content/docs/guides/suspense-and-recovery.md b/apps/docs/src/content/docs/guides/suspense-and-recovery.md
new file mode 100644
index 0000000..6b5c3da
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/suspense-and-recovery.md
@@ -0,0 +1,194 @@
+---
+title: Suspense and Error Recovery
+description: Reset failed Suspense queries, preserve cached data, and start independent reads together.
+---
+
+Use TanStack's native Suspense hooks inside an existing `QueryClientProvider`, such as the
+[React client setup](/effect-api-query/guides/react-query/#acquire-and-mount-the-client).
+`useSuspenseQuery` provides defined data after its loading boundary resolves. An initial failure
+reaches the nearest React error boundary after retries finish.
+
+TanStack documents that cancellation does not work with `useSuspenseQuery`,
+`useSuspenseQueries`, or `useSuspenseInfiniteQuery`. Choose `useQuery` or `useInfiniteQuery`
+when your screen depends on cancellation, including stopping open stream work when observation
+ends. Generated signal forwarding does not remove this native hook limitation.
+See [TanStack query cancellation](https://tanstack.com/query/latest/docs/framework/react/guides/query-cancellation#limitations).
+
+## Define a displayable failure
+
+This complete recipe uses a ready client for the following RPC contract. The application chooses
+which declared messages are suitable for users. Error boundaries receive `unknown`; recognize the
+execution wrapper and validate its Cause failure with Schema before reading a domain message.
+Transport failures, defects, and unexpected errors use a generic fallback.
+
+```tsx
+import {
+ QueryErrorResetBoundary,
+ useSuspenseQueries,
+ useSuspenseQuery,
+} from '@tanstack/react-query'
+import { Cause, Result, Schema } from 'effect'
+import { createRpcQueryUtils, isEffectRpcQueryError } from 'effect-api-query'
+import type { InferQueryData, InferQueryError } from 'effect-api-query'
+import { Rpc, RpcGroup } from 'effect/rpc'
+import type { RpcClient } from 'effect/rpc'
+import { Component, Suspense } from 'react'
+import type { ReactNode } from 'react'
+
+export class UserUnavailable extends Schema.TaggedError()('UserUnavailable', {
+ message: Schema.String,
+}) {}
+
+export const suspenseGroup = RpcGroup.make(
+ Rpc.make('users.get', {
+ payload: { id: Schema.Int },
+ success: Schema.Struct({ id: Schema.Int, name: Schema.String }),
+ error: UserUnavailable,
+ }),
+)
+
+export const makeSuspenseQueries = (
+ client: RpcClient.RpcClient.Flat, E>,
+) =>
+ createRpcQueryUtils(suspenseGroup, {
+ client,
+ keyPrefix: ['suspense-users'],
+ })
+
+export type Queries = ReturnType>
+
+export const failureMessage = (error: unknown): string => {
+ if (isEffectRpcQueryError(error)) {
+ const failure = Cause.findError(error.cause)
+ if (
+ error.cause.reasons.length === 1 &&
+ Result.isSuccess(failure) &&
+ Schema.is(UserUnavailable)(failure.success)
+ ) {
+ return failure.success.message
+ }
+ }
+ return 'The request failed. Please try again.'
+}
+```
+
+## Reset both boundaries
+
+React owns the error boundary below. `QueryErrorResetBoundary` supplies its `onReset` callback.
+The retry button first resets TanStack's failed-query boundary, then clears React's error state
+so the component can mount and fetch again. This uses React's built-in Component class and
+requires no additional error-boundary package.
+
+```tsx
+interface BoundaryProps {
+ readonly children: ReactNode
+ readonly onReset: () => void
+}
+
+interface BoundaryState {
+ readonly failed: boolean
+ readonly error: unknown
+}
+
+class RequestErrorBoundary extends Component {
+ override state: BoundaryState = { failed: false, error: undefined }
+
+ static getDerivedStateFromError(error: unknown): BoundaryState {
+ return { failed: true, error }
+ }
+
+ reset = () => {
+ this.props.onReset()
+ this.setState({ failed: false, error: undefined })
+ }
+
+ override render() {
+ if (this.state.failed) {
+ return (
+
+
{failureMessage(this.state.error)}
+
+
+ )
+ }
+ return this.props.children
+ }
+}
+```
+
+## Preserve data after a failed refresh
+
+Use both boundaries around the component. This example disables automatic retries so the user
+can choose when to retry. It retains native Suspense behavior: a failed initial load reaches the
+boundary; a failed background refetch keeps cached data visible and displays an inline error.
+The Refresh button retries that background request.
+
+```tsx
+const UserDetails = ({ rpc }: { readonly rpc: Queries }) => {
+ const user = useSuspenseQuery(
+ rpc.users.get.queryOptions({ input: { id: 1 }, retry: false, staleTime: 30_000 }),
+ )
+ return (
+ <>
+
}>
+
+
+
+ )}
+
+)
+```
+
+Suspense throws query failures by default only when cached data is absent. If your application
+must route failed refetches to the error boundary too, throw the observer error from the component
+after fetching stops. Handle intentional `null` query data explicitly when using a void contract.
+See [TanStack Suspense recovery](https://tanstack.com/query/latest/docs/framework/react/guides/suspense#resetting-error-boundaries).
+
+## Start independent reads together
+
+Sequential `useSuspenseQuery` calls in one component can create a waterfall: the first hook
+suspends before the later hook runs. Pass independent requests to `useSuspenseQueries` instead.
+With generated options, explicit query descriptors retain the data and error types through
+TanStack's parallel-hook overloads. Derive these descriptors from the leaf so changes to its
+contract update every consumer.
+
+```tsx
+export const TwoUsers = ({ rpc }: { readonly rpc: Queries }) => {
+ type UserQuery = {
+ queryFnData: InferQueryData
+ error: InferQueryError
+ }
+ const [ada, grace] = useSuspenseQueries<[UserQuery, UserQuery]>({
+ queries: [
+ rpc.users.get.queryOptions({ input: { id: 1 }, retry: false, staleTime: 30_000 }),
+ rpc.users.get.queryOptions({ input: { id: 2 }, retry: false, staleTime: 30_000 }),
+ ],
+ })
+ return (
+
+ {ada.data.name} and {grace.data.name}
+
+ )
+}
+```
+
+Render `TwoUsers` inside the same reset and Suspense boundaries. Both reads start together.
+Choose a `staleTime` long enough that an earlier completed query remains fresh while the other
+finishes; otherwise mounting after Suspense resolves can cause an immediate refetch.
diff --git a/apps/docs/src/content/docs/guides/svelte-query.md b/apps/docs/src/content/docs/guides/svelte-query.md
new file mode 100644
index 0000000..da59d24
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/svelte-query.md
@@ -0,0 +1,59 @@
+---
+title: Svelte Query
+description: Rebuild generated options from Svelte reactive input and keep client lifetime in the application.
+---
+
+Build generated options inside Svelte's reactive accessor so input changes produce a new key
+and query function. This applies to both factories and every generated query view.
+
+The examples target Svelte 5.57.1 with Svelte Query 6.3.0 and Query Core 5.104.0.
+
+Keep [captured inputs unchanged](/effect-api-query/concepts/data-normalization/#keep-captured-inputs-unchanged)
+while their options can execute.
+
+## Create native queries
+
+Create the utility tree in your application module from an acquired ready client. Provide a
+QueryClient through Svelte Query's `QueryClientProvider`, then read reactive inputs inside the
+accessor passed to `createQuery`. Keep the client's `Scope` and any serviceful runner alive while
+queries use them. Here `users.read` accepts an ID and returns a user with `name`.
+In the Svelte component script:
+
+```svelte
+
+```
+
+Use `createInfiniteQuery(() => rpc.users.list.infiniteOptions(...))` for pagination and
+`createMutation(() => rpc.users.write.mutationOptions(...))` for writes. A mutation's variables
+provide the input for each execution. Mutation options can be static when their callbacks and
+other settings do not depend on reactive state.
+
+Use the same accessor for `streamedOptions`, `liveOptions`, and HTTP `metadataOptions`.
+
+## Choose native options carefully
+
+A skipped query retains the defined-data type when it has defined `initialData`. An initial-data
+function that may return `undefined` produces optional result data.
+
+Compile the Svelte application with `module: "ESNext"` and `moduleResolution: "Bundler"`.
+Svelte Query 6 requires this resolution for its emitted `.svelte` declarations; strict NodeNext
+declaration checking reports an upstream `Box` import error.
+
+## Own the native integration
+
+Follow the [shared integration lifetime](/effect-api-query/integrations/#own-the-cache-and-client-lifetime)
+for providers, observer removal, stream finalizers, and accepted mutations. Match this native
+wrapper to the application's Query Core and the framework's supported compiler/tooling.
+
+Server rendering and hydration remain application integrations.
diff --git a/apps/docs/src/content/docs/guides/switch-cache-owners.md b/apps/docs/src/content/docs/guides/switch-cache-owners.md
new file mode 100644
index 0000000..cf0dda9
--- /dev/null
+++ b/apps/docs/src/content/docs/guides/switch-cache-owners.md
@@ -0,0 +1,121 @@
+---
+title: Switch Cache Owners
+description: Isolate private queries, pending writes, and persisted directory data when an owner changes.
+---
+
+Include every safe identity that changes a result in the key prefix: tenant, user, session
+generation, and permission generation. Use application identifiers and numeric generations;
+bearer credentials never belong in keys or storage names. A permission change needs a new generation
+even when the user and tenant stay the same. These values partition caches; the server still
+owns authorization.
+
+## Capture one owner
+
+In a consumer or mutation module, receive the ready `application` returned by
+[`startViteReactApplication(options)`](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/lib/application.ts).
+Capture that application and its existing utility trees and QueryClient:
+
+```ts
+const owner = application
+const { queryClient, rpcQuery: rpc, httpQuery: http } = owner
+```
+
+The application uses `ownerKeyPrefix(identity)` from its
+[owner-cache module](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/lib/owner-cache.ts)
+in both factories. It acquires clients, restores directory data, and exposes the original owner's
+guards and tracked mutation options. Keep its Scopes and runtimes alive until the owner's work
+finishes.
+
+In this owner's mutation options, guard each cache write and invalidation:
+
+```ts
+const invalidateUsers = async () => {
+ if (!owner.isActive()) {
+ return
+ }
+ await Promise.all([
+ queryClient.invalidateQueries({ queryKey: rpc.users.key() }),
+ queryClient.invalidateQueries({ queryKey: http.users.key() }),
+ ])
+}
+```
+
+```ts
+const createUser = owner.trackMutationOptions(
+ rpc.users.create.mutationOptions({
+ onSuccess: async (user) => {
+ if (!owner.isActive()) {
+ return
+ }
+ queryClient.setQueryData(rpc.users.get.queryKey({ id: user.id, locale: user.locale }), user)
+ await invalidateUsers()
+ },
+ onSettled: invalidateUsers,
+ }),
+)
+```
+
+The success callback captures its original owner. It checks that owner before seeding a concrete
+query, and settlement invalidation uses the same guard. An old callback never looks up a current
+application variable to choose where to write. Apply the guard to rollback, optimistic writes,
+manual cache updates, and any later work after an `await` too.
+
+## Replace the consumer boundary
+
+The [existing Vite application](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/lib/application.ts)
+provides `startViteReactApplication(options)`. Capture `previous`, unmount its consumer tree,
+and await `previous.dispose()` before starting and rendering the replacement application. This
+retires the old owner before constructing the new clients, QueryClient, and utilities. A failed acquisition leaves the
+old owner inactive; handle that failure in the surrounding application. Use the same unmount,
+retire, and replacement sequence when reconnecting clients with an unchanged semantic identity.
+
+[ViteReactExample](https://github.com/ueberBrot/effect-api-query/blob/main/examples/vite-react/src/app.tsx)
+keys its QueryClientProvider by a component key that changes with the application QueryClient.
+Replacing that client therefore remounts query and mutation consumers, including when the safe
+semantic identity stays the same. This component key is not part of query keys or persistence. Passing a new QueryClient through an existing
+provider alone does not replace the QueryClient captured by existing hooks. Reassigning options
+on a pending MutationObserver can also replace its callbacks. Capture originating ownership in
+mutation context and replace observers at the handoff; arbitrary observer reassignment is outside
+this recipe.
+
+Retirement immediately marks the captured owner inactive and removes its persisted snapshot.
+It cancels old queries and streams, clears both native caches, and waits for accepted mutation
+requests to settle. The application then releases its HTTP runtime and RPC client Scope. Complete
+local stream cleanup before acquiring the next owner. Native `cancelQueries()` settlement alone
+is not a finalizer acknowledgement, and local disposal is not a remote server acknowledgement.
+
+The example attempts mutations immediately with `networkMode: 'always'` and `retry: false`.
+It does not keep an offline mutation queue. `runMutation` tracks requests that have started;
+new requests are rejected after retirement. Requests already accepted may complete on the server,
+and switching owners does not undo them. Their `onSuccess` or `onSettled` callbacks may finish
+after the request drain, so the ownership guard remains necessary. A hanging request or local
+finalizer can delay the handoff; this policy supplies no completion deadline. Do not introduce
+serialized mutation queues without an explicit ownership and shutdown policy.
+
+## Restore a directory snapshot
+
+Pass application-approved Storage to the Vite application through `directoryStorage`. The browser
+entry uses sessionStorage. `persistDirectory()` writes only the RPC and HTTP `users.list` DTOs:
+arrays of `{ id: number, name: string, locale: string }`. It stores no mutations, errors, arbitrary
+query keys, classes, streams, infinite pages, or bearer credentials. A pending mutation removes
+the stored snapshot so an optimistic directory cannot be reused after reload.
+
+Storage names include the full safe owner tuple. Each envelope repeats that identity and includes
+`schemaVersion: 1` and `keyVersion: 1`. Restoration validates the complete envelope and all DTO
+entries, checks both busters and all owner fields, then writes through keys derived by the current
+utilities. Foreign or incompatible data is deleted before any cache write. A different owner's
+storage slot is never read. Bump the schema buster when DTO meaning changes and the key buster
+when the persisted view's key contract changes.
+
+Restored DTOs are plain data with `dataUpdatedAt: 0`, so ordinary queries refetch them. Class
+constructors and methods are not restored by this recipe; use a paired codec from
+[Hydrate Unary Data](/effect-api-query/guides/hydrate-unary-data/) when the domain requires them.
+
+Default `dispose()` and owner switches erase persistence. The browser's pagehide cleanup explicitly
+uses `dispose({ discardPersistence: false })` to snapshot a settled directory for a reload while
+retiring the old in-memory owner and releasing its clients. Old-owner persistence calls become
+no-ops. Explicit disposal rejects on storage failure after query, cache, and client cleanup runs.
+The pagehide and HMR callbacks await that cleanup and report a rejection through the console.
+
+Accepted tracked commands finish before a replacement owner is acquired. Retiring their client
+owner does not undo server work; use the explicit command cancellation operation when required.
diff --git a/apps/docs/src/content/docs/guides/tanstack-start.md b/apps/docs/src/content/docs/guides/tanstack-start.md
index 5889727..ac6b928 100644
--- a/apps/docs/src/content/docs/guides/tanstack-start.md
+++ b/apps/docs/src/content/docs/guides/tanstack-start.md
@@ -1,64 +1,36 @@
---
-title: TanStack Start
-description: Use generated query options in Start loaders, server rendering, and React components.
+title: TanStack Router and Start
+description: Reuse generated options in Router loaders and components, then connect Start request ownership and hydration.
---
-Use `effect-api-query` with your existing TanStack Start router and Effect contract. Choose the
-factory for your contract, then use its generated options with TanStack Query in loaders and
-components.
+Use generated options with TanStack Router loaders and native Query hooks. TanStack Start adds
+server rendering to the same Router/Query integration. Choose the factory for your Effect
+contract and expose its utility tree beside the QueryClient in router context.
-## Choose a factory
+Create `queryUtils` with the [RPC](/effect-api-query/getting-started/quick-start/) or
+[HTTP](/effect-api-query/getting-started/http-quick-start/) factory in your client module.
+Expose it and its QueryClient through router context. Use a safe identity prefix and a
+signal-aware runner. The application owns the router, providers, API host and authentication.
-For an Effect RPC group, pass your ready RPC client to `createRpcQueryUtils`:
-
-```ts
-import { createRpcQueryUtils } from 'effect-api-query'
-
-const queryUtils = createRpcQueryUtils(rpcGroup, {
- client: rpcClient,
- keyPrefix: ['app', identity],
- runPromiseExit,
-})
-```
-
-For an Effect HTTP API, use `createHttpApiQueryUtils` with your ready `HttpApiClient` instead:
-
-```ts
-import { createHttpApiQueryUtils } from 'effect-api-query'
-
-const queryUtils = createHttpApiQueryUtils(httpApi, {
- client: httpClient,
- keyPrefix: ['app', identity],
- runPromiseExit,
-})
-```
-
-Use `identity` to partition the cache safely by the current user or tenant. `runPromiseExit`
-is your application's runner. Configure transport URLs, authentication, and required services when
-creating the client and runner. Use a trusted server destination for SSR and a browser-accessible
-destination for client requests.
-
-The [RPC factory reference](/effect-api-query/reference/factory/) and
-[HTTP guide](/effect-api-query/guides/http-queries-and-mutations/) cover client setup, optional
-runners, and request inputs. The package generates query options; your application owns the API
-host, router, and providers.
-
-## Prefetch in a loader and read in a component
+## Reuse options in a Router loader and component
Expose your `queryUtils` and `QueryClient` through the router context. For a
contract with a `users.list` operation, the same generated options work in both places:
+In the route module, register the loader and the existing `UsersRoute` component:
+
```tsx
export const Route = createFileRoute('/users')({
loader: ({ context }) => context.queryClient.query(context.queryUtils.users.list.queryOptions()),
component: UsersRoute,
})
+```
+
+Inside `UsersRoute`, read the same options with the native hook:
-function UsersRoute() {
- const { queryUtils } = Route.useRouteContext()
- const users = useSuspenseQuery(queryUtils.users.list.queryOptions())
- return