@pyric/cli 0.1.0-alpha.11 → 0.1.0-alpha.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
- package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use.js +2 -2
- package/dist/conformance/.generated/can-i-use.js.map +1 -1
- package/dist/serve/docs-ui/docs/_rhythm/index.html +1 -1
- package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +1 -1
- package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +1 -1
- package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +1 -1
- package/dist/serve/docs-ui/docs/ai-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/api-reference/index.html +2 -2
- package/dist/serve/docs-ui/docs/api-reference.md +1 -1
- package/dist/serve/docs-ui/docs/app-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/auth-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/ai-logic/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/authentication/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +1 -1
- package/dist/serve/docs-ui/docs/build/realtime-database/index.html +1 -1
- package/dist/serve/docs-ui/docs/conformance-scores/index.html +1 -1
- package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/database-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/firestore-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +1 -1
- package/dist/serve/docs-ui/docs/get-started/start-building/index.html +1 -1
- package/dist/serve/docs-ui/docs/index.json +200 -25
- package/dist/serve/docs-ui/docs/messaging-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +1 -1
- package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +1 -1
- package/dist/serve/docs-ui/docs/overview/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-admin-messaging-reference-api/index.html +916 -0
- package/dist/serve/docs-ui/docs/pyric-admin-messaging-reference-api.md +706 -0
- package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ai-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-auth-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api/index.html +131 -66
- package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api.md +130 -65
- package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-firestore-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-rules-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api/index.html +37 -14
- package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api.md +28 -8
- package/dist/serve/docs-ui/docs/pyric-storage-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
- package/dist/serve/docs-ui/docs/rules-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +1 -1
- package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
- package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +1 -1
- package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +1 -1
- package/dist/serve/docs-ui/docs/storage-compat/index.html +1 -1
- package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
- package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
- package/dist/serve/docs-ui/llms.txt +1 -1
- package/dist/serve/worker/host/core.js +1 -1
- package/dist/serve/worker/host/core.js.map +1 -1
- package/dist/serve/worker/host/firestore-writes.d.ts.map +1 -1
- package/dist/serve/worker/host/firestore-writes.js +3 -2
- package/dist/serve/worker/host/firestore-writes.js.map +1 -1
- package/dist/serve/worker/index.d.ts +2 -1
- package/dist/serve/worker/index.d.ts.map +1 -1
- package/dist/serve/worker/index.js +2 -1
- package/dist/serve/worker/index.js.map +1 -1
- package/dist/serve/worker/protocol.js +2 -2
- package/dist/serve/worker/protocol.js.map +1 -1
- package/package.json +5 -4
- package/src/assurance/.generated/conformance-verdicts.ts +1090 -0
- package/src/assurance/attachment.ts +211 -0
- package/src/assurance/browser.ts +80 -0
- package/src/assurance/campaign.ts +496 -0
- package/src/assurance/capabilities.ts +446 -0
- package/src/assurance/cases.ts +43 -0
- package/src/assurance/index.ts +75 -0
- package/src/assurance/runner.ts +885 -0
- package/src/assurance/tool-names.ts +15 -0
- package/src/assurance/tools.ts +830 -0
- package/src/assurance/types.ts +352 -0
- package/src/assurance/validation.ts +434 -0
- package/src/bridge/client/bridge.ts +550 -0
- package/src/bridge/client/dispatch.ts +137 -0
- package/src/bridge/client.ts +45 -0
- package/src/bridge/protocol.ts +351 -0
- package/src/bridge/server/audit.ts +53 -0
- package/src/bridge/server/bridge.ts +597 -0
- package/src/bridge/server/headless.ts +160 -0
- package/src/bridge/server/json-schema-to-zod.ts +108 -0
- package/src/bridge/server/local-bridge.ts +66 -0
- package/src/bridge/server/logger.ts +50 -0
- package/src/bridge/server/mcp-contract.ts +93 -0
- package/src/bridge/server/mcp.ts +129 -0
- package/src/bridge/server/peer.ts +232 -0
- package/src/bridge/server/standalone.ts +347 -0
- package/src/bridge/server/tool-metadata.ts +99 -0
- package/src/bridge/server.ts +28 -0
- package/src/cli/can-i-use.ts +50 -0
- package/src/cli/cli.test.ts +493 -0
- package/src/cli/database-rules.ts +329 -0
- package/src/cli/dev-runner.ts +282 -0
- package/src/cli/firebase-json.ts +100 -0
- package/src/cli/firestore-indexes.ts +70 -0
- package/src/cli/index.ts +425 -0
- package/src/cli/init.ts +260 -0
- package/src/cli/mcp-proxy.ts +196 -0
- package/src/cli/parse-args.ts +80 -0
- package/src/cli/rules.ts +259 -0
- package/src/cli/scope.ts +67 -0
- package/src/cli/serve.ts +996 -0
- package/src/cli/service-commands.ts +73 -0
- package/src/cli/snapshot.ts +164 -0
- package/src/cli/storage-rules.ts +172 -0
- package/src/cli/verify.ts +416 -0
- package/src/conformance/.generated/can-i-use-browser.ts +113 -0
- package/src/conformance/.generated/can-i-use.ts +117 -0
- package/src/conformance/.generated/conformance-docs.ts +14 -0
- package/src/conformance/browser.ts +24 -0
- package/src/conformance/can-i-use-tool.ts +51 -0
- package/src/conformance/can-i-use.ts +18 -0
- package/src/conformance/docs.ts +8 -0
- package/src/conformance/index.ts +20 -0
- package/src/conformance/tools.ts +16 -0
- package/src/credentials/core/memoize-ttl.ts +142 -0
- package/src/credentials/core/types.ts +10 -0
- package/src/credentials/node/from-adc.ts +96 -0
- package/src/credentials/node/from-service-account.ts +133 -0
- package/src/credentials/node/index.ts +6 -0
- package/src/discover/concurrency.ts +127 -0
- package/src/discover/crawler-adapter.ts +142 -0
- package/src/discover/crawler.ts +1127 -0
- package/src/discover/credential-free.ts +27 -0
- package/src/discover/findCollectionGroup.ts +131 -0
- package/src/discover/firestore-source.ts +59 -0
- package/src/discover/index.ts +5 -0
- package/src/discover/merge.ts +523 -0
- package/src/discover/session.ts +402 -0
- package/src/discover/tools.ts +201 -0
- package/src/discover/types.ts +187 -0
- package/src/discover/wire.ts +324 -0
- package/src/functions-rtdb/child.ts +382 -0
- package/src/functions-rtdb/delivery.ts +7 -0
- package/src/functions-rtdb/discovery.ts +136 -0
- package/src/functions-rtdb/event.ts +64 -0
- package/src/functions-rtdb/execution.ts +111 -0
- package/src/functions-rtdb/in-memory-delivery.ts +40 -0
- package/src/functions-rtdb/project.ts +74 -0
- package/src/functions-rtdb/projection.ts +104 -0
- package/src/functions-rtdb/reference-pattern.ts +20 -0
- package/src/functions-rtdb/remote-delivery.ts +23 -0
- package/src/pkg-version.ts +49 -0
- package/src/register/esm-exports.ts +63 -0
- package/src/register/hooks.ts +30 -0
- package/src/register/index.ts +150 -0
- package/src/register/mapping.ts +33 -0
- package/src/remote/index.ts +1050 -0
- package/src/rtdb/crawl-snapshot.ts +118 -0
- package/src/rtdb/inspection.ts +137 -0
- package/src/rtdb/load-rules-document.ts +56 -0
- package/src/rtdb/rules-generation-tool.ts +38 -0
- package/src/rtdb/rules-json.ts +29 -0
- package/src/serve/activity-guard.ts +29 -0
- package/src/serve/activity-route.ts +164 -0
- package/src/serve/activity-warning.ts +26 -0
- package/src/serve/bridge-mount.ts +200 -0
- package/src/serve/bundler.ts +493 -0
- package/src/serve/capture-store.ts +65 -0
- package/src/serve/discovery.ts +199 -0
- package/src/serve/entries/ai.ts +292 -0
- package/src/serve/entries/app-backend.ts +4 -0
- package/src/serve/entries/app-client.ts +26 -0
- package/src/serve/entries/app-session-store.ts +47 -0
- package/src/serve/entries/app.ts +11 -0
- package/src/serve/entries/auth-helper-core.ts +181 -0
- package/src/serve/entries/auth-helper-dom.ts +134 -0
- package/src/serve/entries/auth-helper-runtime.ts +20 -0
- package/src/serve/entries/auth.ts +255 -0
- package/src/serve/entries/bridge-url.ts +31 -0
- package/src/serve/entries/database.ts +129 -0
- package/src/serve/entries/firestore.ts +232 -0
- package/src/serve/entries/init.ts +46 -0
- package/src/serve/entries/keepalive.ts +46 -0
- package/src/serve/entries/messaging-sw.ts +75 -0
- package/src/serve/entries/messaging.ts +96 -0
- package/src/serve/entries/runtime.ts +540 -0
- package/src/serve/entries/session-store.ts +97 -0
- package/src/serve/entries/storage.ts +92 -0
- package/src/serve/entries/tab-sync-wiring.ts +274 -0
- package/src/serve/entries/worker-runtime.ts +75 -0
- package/src/serve/init-payload.ts +42 -0
- package/src/serve/namespace.ts +675 -0
- package/src/serve/open-browser.ts +68 -0
- package/src/serve/rules.ts +272 -0
- package/src/serve/sandbox-marker.ts +31 -0
- package/src/serve/server.ts +428 -0
- package/src/serve/standalone-assets.ts +180 -0
- package/src/serve/state-store.ts +166 -0
- package/src/serve/studio/disk-project-store.ts +185 -0
- package/src/serve/studio/disk-workspace.ts +162 -0
- package/src/serve/studio/index.ts +20 -0
- package/src/serve/studio/routes.ts +237 -0
- package/src/serve/studio/store-types.ts +48 -0
- package/src/serve/studio/studio-storage.test.ts +289 -0
- package/src/serve/vite-plugin.ts +1102 -0
- package/src/serve/worker/activity-bootstrap.ts +24 -0
- package/src/serve/worker/client/admin-firestore.ts +38 -0
- package/src/serve/worker/client/ai.ts +124 -0
- package/src/serve/worker/client/auth.ts +489 -0
- package/src/serve/worker/client/connection.ts +202 -0
- package/src/serve/worker/client/core.ts +350 -0
- package/src/serve/worker/client/disconnect.ts +45 -0
- package/src/serve/worker/client/firestore-reads.ts +181 -0
- package/src/serve/worker/client/firestore-refs.ts +226 -0
- package/src/serve/worker/client/firestore-writes.ts +232 -0
- package/src/serve/worker/client/handles.ts +91 -0
- package/src/serve/worker/client/messaging.ts +119 -0
- package/src/serve/worker/client/presence.ts +174 -0
- package/src/serve/worker/client/rtdb.ts +311 -0
- package/src/serve/worker/client/rules.ts +63 -0
- package/src/serve/worker/client/service-worker-connection.ts +59 -0
- package/src/serve/worker/client/snapshots.ts +86 -0
- package/src/serve/worker/client/storage.ts +195 -0
- package/src/serve/worker/client/studio.ts +88 -0
- package/src/serve/worker/client.ts +57 -0
- package/src/serve/worker/durable-persistence.ts +137 -0
- package/src/serve/worker/entry.ts +179 -0
- package/src/serve/worker/host/admin-firestore.ts +88 -0
- package/src/serve/worker/host/connection.ts +179 -0
- package/src/serve/worker/host/core.ts +387 -0
- package/src/serve/worker/host/dispatch.ts +316 -0
- package/src/serve/worker/host/firestore-reads.ts +117 -0
- package/src/serve/worker/host/firestore-writes.ts +456 -0
- package/src/serve/worker/host/presence.ts +312 -0
- package/src/serve/worker/host/rtdb.ts +136 -0
- package/src/serve/worker/host/rules.ts +128 -0
- package/src/serve/worker/host/storage.ts +312 -0
- package/src/serve/worker/host/studio.ts +75 -0
- package/src/serve/worker/host/subscriptions.ts +238 -0
- package/src/serve/worker/host-ai.ts +165 -0
- package/src/serve/worker/host-auth.ts +469 -0
- package/src/serve/worker/host-context.ts +273 -0
- package/src/serve/worker/host-events.ts +94 -0
- package/src/serve/worker/host-messaging.ts +240 -0
- package/src/serve/worker/host.ts +47 -0
- package/src/serve/worker/index.ts +196 -0
- package/src/serve/worker/presence-timing.ts +15 -0
- package/src/serve/worker/protocol.ts +1112 -0
- package/src/serve/worker/serve-init.ts +606 -0
- package/src/serve/worker/service-worker-channel.ts +33 -0
- package/src/serve/worker/service-worker-relay.ts +86 -0
- package/src/serve/writer-lock.ts +53 -0
- package/src/verify/cases.ts +233 -0
- package/src/verify/fixture.ts +258 -0
- package/src/verify/index.ts +519 -0
- package/src/verify/tools.ts +108 -0
- package/src/version/compat-target.ts +17 -0
- package/src/vite.ts +17 -0
- package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api/index.html +0 -31
- package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api.md +0 -29
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const CONFORMANCE_SUPPORTS = [{ "feature": "AbstractUserDataWriter", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AbstractUserDataWriter is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "ActionCodeInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ActionCodeInfo is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ActionCodeOperation", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ActionCodeOperation is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ActionCodeSettings", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ActionCodeSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ActionCodeURL", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ActionCodeURL is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "addDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "addDoc is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Auto-id format — prod uses 20-char base64-ish IDs; sandbox uses `pyric-admin`'s auto-id (also opaque, distinct format)", "divergence: IDs are opaque on both sides; format differs but consumer code never parses them. Oracle-locked: `packages/conformance/observations/firestore/firestore-adddoc-autoid-format.json` — prod auto-ids are 20 characters, all alphanumeric (mixed upper, lower, digits; no other chars). Example: `S3PJENMPOk4qcDXol8Ez`."] }, { "feature": "AdditionalUserInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AdditionalUserInfo is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AddPrefixToKeys", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AddPrefixToKeys is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AggregateField", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateField is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "aggregateFieldEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "aggregateFieldEqual is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Aggregate-field and aggregate-snapshot equality helpers are exported upstream but have no Pyric runtime implementation yet."] }, { "feature": "AggregateFieldType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateFieldType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AggregateQuerySnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateQuerySnapshot is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "aggregateQuerySnapshotEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "aggregateQuerySnapshotEqual is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Aggregate-field and aggregate-snapshot equality helpers are exported upstream but have no Pyric runtime implementation yet."] }, { "feature": "AggregateSpec", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateSpec is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AggregateSpecData", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateSpecData is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AggregateType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AI", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AI is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AIError", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AIError is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AIErrorCode", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AIErrorCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AIModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AIModel is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AIOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AIOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "allow", "surface": "firestore-rules", "importPaths": ["pyric/rules"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "allow is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "and", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "and is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AndroidConfig", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AndroidConfig is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AndroidFcmOptions", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AndroidFcmOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AndroidNotification", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AndroidNotification is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AnyOfSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AnyOfSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ApnsConfig", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ApnsConfig is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ApnsFcmOptions", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ApnsFcmOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ApnsPayload", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ApnsPayload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ApplicationVerifier", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ApplicationVerifier is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "applyActionCode", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "applyActionCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Aps", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Aps is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ApsAlert", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ApsAlert is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "arithmetic", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arithmetic is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "arrayRemove", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayRemove is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ArraySchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ArraySchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "arrayUnion", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayUnion is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "atoms", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "atoms is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AudioConversationController", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AudioConversationController is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AudioTranscriptionConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AudioTranscriptionConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "Auth", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Auth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "auth", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "auth is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "auth.token", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "auth.token is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "auth.uid", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "auth.uid is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "AuthCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AuthCredential is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AuthError", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AuthError is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AuthErrorCodes", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AuthErrorCodes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AuthErrorMap", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AuthErrorMap is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AuthProvider is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AuthSettings", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AuthSettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "average", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "average is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Backend", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Backend is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "BackendType", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "BackendType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "BaseMessage", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "BaseMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "BaseParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "BaseParams is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "beforeAuthStateChanged", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "beforeAuthStateChanged is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`sandbox.setUser` (the sandbox-only test driver) BYPASSES the gate entirely — it is a raw identity force with no prod analog (same bypass it already has for provider enforcement / `signInProvider` tracking), so no registered `beforeAuthStateChanged` callback runs and none can block it.", "`unit:sandbox-before-auth-state-changed.test.ts` (\"sandbox.setUser test driver bypasses the gate\")", "Served-worker path (SharedWorker-backed auth in `@pyric/cli`): the worker owns the shared user pool and commits transitions on its own side of the port, so a page-local `beforeAuthStateChanged` registration can't actually gate a worker-driven sign-in. Rather than silently accept a callback that could never run, registering THROWS immediately (`auth/operation-not-supported-in-this-environment`) — same defensive pattern as `signInWithCredential` over the worker.", "`packages/cli/src/serve/worker/client.ts` (`beforeAuthStateChanged` throws `makeUnsupported`)"] }, { "feature": "BlockReason", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "BlockReason is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "BooleanSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "BooleanSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "browserCookiePersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "browserCookiePersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "browserLocalPersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "browserLocalPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "browserPopupRedirectResolver", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "browserPopupRedirectResolver is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "browserSessionPersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "browserSessionPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "Bytes", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Bytes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "bytes.size", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "bytes.size is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "bytes.toBase64", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "bytes.toBase64 is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "bytes.toHexString", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "bytes.toHexString is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "CACHE_SIZE_UNLIMITED", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CACHE_SIZE_UNLIMITED is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "cast.bool", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "cast.bool is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "cast.float", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "cast.float is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`int`/`float` division and type distinction (RULES-B5) in rules — truncating int÷int, float division stays float, div-by-zero denies, `is int`/`is float` distinct", "`oracle:rules-firestore-int-float-and-division` — production Firestore Rules Test API verdicts for corpus scenario \"int-float-and-division\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator narrows a float-valued payload field toward int on the float-payload case, unlike production which preserves the float type — pinned KNOWN_DIVERGENCE"] }, { "feature": "cast.int", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "cast.int is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`int`/`float` division and type distinction (RULES-B5) in rules — truncating int÷int, float division stays float, div-by-zero denies, `is int`/`is float` distinct", "`oracle:rules-firestore-int-float-and-division` — production Firestore Rules Test API verdicts for corpus scenario \"int-float-and-division\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator narrows a float-valued payload field toward int on the float-payload case, unlike production which preserves the float type — pinned KNOWN_DIVERGENCE"] }, { "feature": "cast.path", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "cast.path is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Path` wrapper, `path()` constructor, and `Path.bind()` (Item 5.4) in rules", "`oracle:rules-firestore-path-constructor-and-bind` — production Firestore Rules Test API verdicts for corpus scenario \"path-constructor-and-bind\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator treats `path()` as idempotent on an already-Path argument where production denies — pinned KNOWN_DIVERGENCE"] }, { "feature": "cast.string", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "cast.string is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ChatSession", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ChatSession is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ChatSessionBase", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ChatSessionBase is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "checkActionCode", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "checkActionCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "child", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "child is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["`child(ref, 'a/b')` joins a relative path, including embedded slashes", "upstream contract"] }, { "feature": "ChildUpdateFields", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ChildUpdateFields is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ChromeAdapter", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ChromeAdapter is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "Citation", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Citation is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "CitationMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CitationMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "clearIndexedDbPersistence", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "clearIndexedDbPersistence is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CodeExecutionResult", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CodeExecutionResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "CodeExecutionResultPart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CodeExecutionResultPart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "CodeExecutionTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CodeExecutionTool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "collection", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "collection is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "collectionGroup", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "collectionGroup is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CollectionReference", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CollectionReference is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "comparison", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "comparison is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "compileRtdbRules", "surface": "rtdb", "importPaths": ["pyric/rules/internal/rtdb"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "compileRtdbRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CompleteFn", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CompleteFn is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "compose", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "compose is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "concat", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "concat is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ConditionMessage", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ConditionMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Config", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Config is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ConfirmationResult", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ConfirmationResult is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "confirmPasswordReset", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "confirmPasswordReset is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "connectAuthEmulator", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "connectAuthEmulator is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "connectDatabaseEmulator", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "connectDatabaseEmulator is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["No-op on sandbox-target handles (the sandbox IS the local emulator)", "Phase 3", "A production target is intentionally absent; production code continues to use `connectDatabaseEmulator` from the unchanged `firebase/database` package"] }, { "feature": "connectFirestoreEmulator", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "connectFirestoreEmulator is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "connectStorageEmulator", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "connectStorageEmulator is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Exported by `firebase/storage`; reroutes a `FirebaseStorage` handle to a local emulator", "not implemented in `pyric/storage` — the sandbox IS the local-target alternative; emulator parity is out of scope per `index.ts`"] }, { "feature": "constructorAccess", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "constructorAccess is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Content", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Content is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ContextWindowCompressionConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ContextWindowCompressionConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "count", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "count is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Aggregates count documents server-side without paying read cost per doc in prod; sandbox computes locally (no cost model)", "divergence: cost behavior differs, observable shape identical. Oracle-locked: `packages/conformance/observations/firestore/firestore-count-aggregate-shape.json` — `getCountFromServer().data()` returns `{ count: <number> }` (single key, no other fields). Empty query returns `count: 0` (not `null`/`undefined`); seeded 3 docs returns `count: 3`; filtered query honors the `where` constraint (`count: 2`)."] }, { "feature": "countTokens", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "countTokens is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CountTokensRequest", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CountTokensRequest is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "CountTokensResponse", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CountTokensResponse is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "createUserWithEmailAndPassword", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "createUserWithEmailAndPassword is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CriticalSound", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "CriticalSound is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "crossTypeOperators", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "crossTypeOperators is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CustomErrorData", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CustomErrorData is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "CustomParameters", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CustomParameters is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "data", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "data is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "Database", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Database is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes are mirrored structurally in Pyric's type surface but are not exported as runtime constructor values; runtime identity remains unbuilt."] }, { "feature": "DatabaseEvent", "surface": "functions-rtdb", "importPaths": [], "evidenceSlug": "functions-rtdb-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "DatabaseEvent is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DatabaseReference", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DatabaseReference is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "DataMessagePayload", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "DataMessagePayload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DataSnapshot", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DataSnapshot is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes are mirrored structurally in Pyric's type surface but are not exported as runtime constructor values; runtime identity remains unbuilt."] }, { "feature": "Date", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Date is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "debug", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "debug is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "debugErrorMap", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "debugErrorMap is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "deleteAllPersistentCacheIndexes", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "deleteAllPersistentCacheIndexes is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "deleteApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "deleteApp is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Production permits a different configuration after deletion; Pyric retains the runtime backend lock and rejects the reinitialization", "oracle: `app-registry-delete-reinitialize-different-config` (firebase 12.13.0) + replay pins `app/multiple-configs-not-supported`", "Served worker mode rejects page-local custom AnswerEngine objects; a model retained from a deleted app rejects, while an equal-config sibling model remains usable through its own app-scoped worker port", "`packages/cli/test/e2e/app-deletion.pw.ts` observes AI code `unsupported` for a custom engine, then exercises retained and sibling models through canonical served imports after deleting one app; `packages/pyric/src/ai/sandbox-plane.ts` guards every model operation. A credentialed production AI lifecycle capture is still needed"] }, { "feature": "deleteDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "deleteDoc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "deleteField", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "deleteField is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "deleteObject", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "deleteObject is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Sandbox: no-op on missing path (does NOT throw)", "divergence: sandbox is no-op via `persistence.ts`'s `delete`. Prod's `deleteObject` on a missing path throws `storage/object-not-found`. Oracle-locked: `packages/conformance/observations/storage/storage-delete-missing-throws.json` (`code: 'storage/object-not-found'`, `name: 'FirebaseError'` against blockingfun, fb-js-sdk 12.13.0). Both sides pinned in `oracle-conformance.test.ts`; documented in `download.ts`."] }, { "feature": "deleteToken", "surface": "messaging", "importPaths": ["pyric/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "deleteToken is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "deleteUser", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "deleteUser is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "denyByDefault", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "denyByDefault is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Dependencies", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Dependencies is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "diff", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "diff is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "difference", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "difference is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "disableNetwork", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "disableNetwork is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Resolve in the sandbox mirror — no network exists to toggle; writes issued while \"disabled\" still commit immediately (no offline queue is simulated)", "`unit:firestore/persistence-network.test.ts`"] }, { "feature": "disablePersistentCacheIndexAutoCreation", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "disablePersistentCacheIndexAutoCreation is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "doc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "doc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentChange", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentChange is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "DocumentChangeType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentChangeType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "DocumentData", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentData is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "documentId", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentId is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentReference", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentReference is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "DocumentSnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentSnapshot is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "documentSnapshotFromJSON", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "documentSnapshotFromJSON is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Snapshot JSON reconstruction and listener-resume helpers depend on serialized snapshot state that the sandbox has not modeled."] }, { "feature": "duration", "surface": "firestore-rules", "importPaths": ["pyric/rules"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Duration", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Duration is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "duration.abs", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration.abs is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "duration.nanos", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "duration.nanos is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "duration.seconds", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "duration.seconds is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "duration.time", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration.time is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "duration.value", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration.value is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "duration.value", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration.value is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["duration.value(magnitude, unit) — a duration the evaluator returns as milliseconds so it adds to / subtracts from the millis-modeled timestamps, enabling the freshness idiom `request.time < resource.timeCreated + duration.value(1, 'h')`."] }, { "feature": "EmailAuthCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "EmailAuthCredential is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "EmailAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "EmailAuthProvider is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Custom scopes / params / language code", "sandbox ignores; prod forwards"] }, { "feature": "EmulatorConfig", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "EmulatorMockTokenOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorMockTokenOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "EmulatorMockTokenOptions", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorMockTokenOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "EmulatorMockTokenOptions", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorMockTokenOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "enableIndexedDbPersistence", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "enableIndexedDbPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Resolves in the sandbox mirror — persistence is already the default; does not reject with `'failed-precondition'` when called after other ops (deliberately more lenient than the real SDK — no cache-init race to protect)", "`unit:firestore/persistence-network.test.ts`"] }, { "feature": "enableLogging", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "enableLogging is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`enableLogging(logger?, persistent?)` — accepted no-op: the sandbox has no modular-SDK-style logger to wire a level/sink into (it uses host-level `console` logging directly, matching `pyric/firestore`'s `setLogLevel`). Accepted so init code that calls it compiles + runs", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "enableMultiTabIndexedDbPersistence", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "enableMultiTabIndexedDbPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Resolves in the sandbox mirror — the SharedWorker path already is the one shared store every tab talks to", "`unit:firestore/persistence-network.test.ts`"] }, { "feature": "enableNetwork", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "enableNetwork is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Resolve in the sandbox mirror — no network exists to toggle; writes issued while \"disabled\" still commit immediately (no offline queue is simulated)", "`unit:firestore/persistence-network.test.ts`"] }, { "feature": "enablePersistentCacheIndexAutoCreation", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "enablePersistentCacheIndexAutoCreation is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "endAt", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "endAt", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "endBefore", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endBefore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "endBefore", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endBefore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "EnhancedGenerateContentResponse", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EnhancedGenerateContentResponse is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ensureFirestoreConfigured", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ensureFirestoreConfigured is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["The upstream package publicly exports these low-level configuration/write helpers, but Pyric does not expose equivalent runtime plumbing yet."] }, { "feature": "equalTo", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "equalTo is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ErrorCode", "surface": "messaging", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ErrorCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ErrorDetails", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ErrorDetails is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ErrorFn", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ErrorFn is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "evaluateStorageRules", "surface": "storage-rules", "importPaths": ["pyric/storage"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "evaluateStorageRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "EventType", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EventType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ExecutableCode", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ExecutableCode is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ExecutableCodePart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ExecutableCodePart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "executeWrite", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "executeWrite is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["The upstream package publicly exports these low-level configuration/write helpers, but Pyric does not expose equivalent runtime plumbing yet."] }, { "feature": "exists", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "exists is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`get()` of a missing document (RULES-B8) in rules — resource identity (`id`/`__name__`) exposure on a mocked/missing get() result", "`oracle:rules-firestore-get-missing-doc` — production Firestore Rules Test API verdicts for corpus scenario \"get-missing-doc\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator synthesizes a resource identity (`id`, `__name__`) for mocked get() results that production leaves absent, on 2 scenario cases — pinned KNOWN_DIVERGENCE"] }, { "feature": "existsAfter", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "existsAfter is available, has diverged fidelity, and is ineligible for assurance.", "caveats": ["`getAfter()`/`existsAfter()` (Item 7) in rules — post-write document identity and existence semantics", "`oracle:rules-firestore-get-after-and-exists-after` — production Firestore Rules Test API verdicts for corpus scenario \"get-after-and-exists-after\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator does not model the post-write document identity/existence production compares against on 4 scenario cases (getAfter target identity, existsAfter on create/delete, existsAfter over an unrelated mocked path) — pinned KNOWN_DIVERGENCE", "Discrepancy: the simulator's evaluator implements existsAfter() (simulator/evaluator.ts case 'existsAfter'), but the parser validator's BUILTIN_FUNCTIONS set (grammar/FirestoreValidator.ts) lists only get/exists/getAfter/debug — existsAfter is absent there, so the validator alone would not recognize it as a builtin."] }, { "feature": "ExperimentalLongPollingOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ExperimentalLongPollingOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "experimentalSetDeliveryMetricsExportedToBigQueryEnabled", "surface": "messaging", "importPaths": ["pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "experimentalSetDeliveryMetricsExportedToBigQueryEnabled is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FacebookAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FacebookAuthProvider is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FactorId", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FactorId is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "FcmOptions", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FcmOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FcmOptions", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FcmOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "fetchSignInMethodsForEmail", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "fetchSignInMethodsForEmail is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Deprecated upstream as a security retraction, not a cosmetic one: the shipped @firebase/auth declaration states it \"returns an empty list when Email Enumeration Protection is enabled, irrespective of the number of authentication methods available\", and that \"migrating off of this method is recommended as a security best-practice\". Enumeration protection is on by default, so against a modern project the production function always returns []. A mirror that reproduced the pre-deprecation behavior would be MORE capable than prod and would silently mislead agent code that branches on the result; a mirror that reproduced the post-deprecation behavior would be a no-op. Same criterion applied to Imagen in firebase/ai — an API whose production counterpart is retiring is out of scope, because mirroring it freezes dead behavior.", "Not implemented; disposition `auth.email-enumeration` owns the reviewed availability and rationale.", "disposition:auth.email-enumeration; the `auth-fetchsigninmethodsforemail-deprecated` capture is retained but inconclusive because the oracle project's Email/Password provider is disabled."] }, { "feature": "FieldPath", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FieldPath is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FieldValue", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FieldValue is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FileData", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FileData is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FileDataPart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FileDataPart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FinishReason", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FinishReason is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirebaseApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseApp is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirebaseAppSettings", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseAppSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirebaseError", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FirebaseError is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FirebaseMessagingError", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FirebaseMessagingError is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FirebaseOptions", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirebaseServerApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseServerApp is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "FirebaseServerAppSettings", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseServerAppSettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "FirebaseStorage", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseStorage is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Firestore", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Firestore is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "firestore.exists", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "firestore.exists is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["Discrepancy: firestore.exists() — same standalone limitation as firestore.get(); resolved only with an injected FirestoreLookup, otherwise denies-with-reason."] }, { "feature": "firestore.get", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "firestore.get is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["Discrepancy: firestore.get() is in the official Storage rules language, but the standalone evaluator only resolves it when the enforcement layer injects a FirestoreLookup; the pure/test evaluator denies-with-reason (cross-document lookups are out of the standalone subset)."] }, { "feature": "FirestoreDataConverter", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreDataConverter is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirestoreError", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreError is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "FirestoreErrorCode", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreErrorCode is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "FirestoreLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreLocalCache is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "FirestoreSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "float", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "float is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "forceLongPolling", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "forceLongPolling is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`forceLongPolling()` — accepted no-op: transport selection is not applicable to the in-process/worker sandbox (it never opens a real socket). Accepted so init code that calls it compiles + runs", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "forceWebSockets", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "forceWebSockets is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`forceWebSockets()` — accepted no-op: transport selection is not applicable to the in-process/worker sandbox (see `forceLongPolling`)", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "FullMetadata", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FullMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "function", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "function is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "function", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "function is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FunctionCall", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionCall is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "functionCall", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "functionCall is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FunctionCallingConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionCallingConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FunctionCallingMode", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionCallingMode is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FunctionCallPart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionCallPart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "functionCalls", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "functionCalls is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FunctionDeclaration", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionDeclaration is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FunctionDeclarationsTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionDeclarationsTool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FunctionResponse", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionResponse is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FunctionResponsePart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionResponsePart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "generateContent", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "generateContent is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "GenerateContentCandidate", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerateContentCandidate is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerateContentRequest", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerateContentRequest is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerateContentResponse", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerateContentResponse is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerateContentResult", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerateContentResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "generateContentStream", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "generateContentStream is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["The aggregated response carries the final chunk `finishReason` and `usageMetadata`", "`unit:streaming.test.ts` test `ai#stream-aggregate-final-meta` (aggregation semantics derived from the framing capture)"] }, { "feature": "GenerateContentStreamResult", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerateContentStreamResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerationConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerationConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerativeContentBlob", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerativeContentBlob is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerativeModel is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GeoPoint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "GeoPoint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "get", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "get is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`get()` of a missing document (RULES-B8) in rules — resource identity (`id`/`__name__`) exposure on a mocked/missing get() result", "`oracle:rules-firestore-get-missing-doc` — production Firestore Rules Test API verdicts for corpus scenario \"get-missing-doc\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator synthesizes a resource identity (`id`, `__name__`) for mocked get() results that production leaves absent, on 2 scenario cases — pinned KNOWN_DIVERGENCE"] }, { "feature": "get", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAdditionalUserInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getAdditionalUserInfo is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAfter", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "getAfter is available, has diverged fidelity, and is ineligible for assurance.", "caveats": ["`getAfter()`/`existsAfter()` (Item 7) in rules — post-write document identity and existence semantics", "`oracle:rules-firestore-get-after-and-exists-after` — production Firestore Rules Test API verdicts for corpus scenario \"get-after-and-exists-after\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator does not model the post-write document identity/existence production compares against on 4 scenario cases (getAfter target identity, existsAfter on create/delete, existsAfter over an unrelated mocked path) — pinned KNOWN_DIVERGENCE"] }, { "feature": "getAggregateFromServer", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getAggregateFromServer is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAI", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getAI is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAI", "surface": "app", "importPaths": [], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "getAI is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Served worker mode rejects page-local custom AnswerEngine objects; a model retained from a deleted app rejects, while an equal-config sibling model remains usable through its own app-scoped worker port", "`packages/cli/test/e2e/app-deletion.pw.ts` observes AI code `unsupported` for a custom engine, then exercises retained and sibling models through canonical served imports after deleting one app; `packages/pyric/src/ai/sandbox-plane.ts` guards every model operation. A credentialed production AI lifecycle capture is still needed"] }, { "feature": "getApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getApp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getApps", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getApps is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAuth", "surface": "app", "importPaths": [], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getAuth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAuth", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "getAuth is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Without sandbox package swapping, canonical `firebase/auth` imports remain Firebase and never enter this mirror", "Direct mirror rejection is locked by `unit:package-resolution.test.ts`; an unswapped production-resolution observation is still needed"] }, { "feature": "getBlob", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getBlob is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getBytes", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getBytes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getCountFromServer", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getCountFromServer is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getDatabase", "surface": "app", "importPaths": [], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDatabase is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getDatabase", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "getDatabase is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["An in-module production target is intentionally absent; direct calls with a real `FirebaseApp` reject with package-resolution guidance", "`unit:modular.test.ts`; production remains the responsibility of the unchanged `firebase/database` package", "`getDatabase(ctx)` returns a tagged sandbox-target handle (frozen identity)", "Phase 3", "`getDatabase(sandbox)` returns a tagged sandbox-live handle (per-op identity)", "Inactive canonical `firebase/database` imports remain the upstream package; the mirror does not create tagged production targets", "package-resolution boundary; inactive RTDB canonical-import isolation is not yet claimed by this row", "Two `getDatabase(sandbox)` calls share state (same underlying `LocalEnvironment`)", "Handle dispatch by `TARGET_SYMBOL` brand — refs route to their owning target via a `refToTarget` WeakMap (mirror of firestore's pattern)"] }, { "feature": "getDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getDoc is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Rules denial throws `SandboxError('permission-denied', …)` on sandbox; `FirebaseError('permission-denied')` on prod", "divergence: same code, different class — both expose `.code === 'permission-denied'`. Oracle-locked: `packages/conformance/observations/firestore/firestore-rules-denied-error.json` — prod throws a `FirebaseError` (name + constructor name both `FirebaseError`), `.code === 'permission-denied'`, `.message === '7 PERMISSION_DENIED: Missing or insufficient permissions.'`, and the value is an `instanceof Error`."] }, { "feature": "getDocFromCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getDocFromCache is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Delegates to `getDoc` / `getDocs` in the sandbox mirror. Real Firebase THROWS `'unavailable'` here on a genuine cache miss; pyric never misses — the local store always has the answer (or a non-existent snapshot) — so it never throws for that reason", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "getDocFromServer", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDocFromServer is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getDocs", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getDocs is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Query-proof **prover scope is conservative, with full accounting and a fail-closed classifier** — user functions are inlined (nested helper-calling-helper and multi-parameter helpers included, matching production's rules-function inlining), and a `list` rule is provable only when its **entire** doc-dependence reduces to top-level AND-conjunct `resource.data.<field> == <literal>` equalities (with `request.auth.uid` pinned to the caller) each discharged by a `where(field, '==', value)` filter. Doc-dependence is decided by a fail-closed classifier: an expression counts as doc-independent only when every node is positively recognized as such — any touch of the `resource` root in any syntactic form (`resource.data`, `resource['data']`, slices, `resource.id`, path-literal segments feeding `exists`/`get` lookups) and any unrecognized node shape classifies doc-dependent. Any doc-dependent conjunct that is not a discharged equality — disjunctions over doc data, inequality/range predicates (`resource.data.score > 10` + `where('score','>',10)`), `in` / negated-`in` membership checks, `get(key, default)`, `keys().hasOnly(...)`, `is` type checks, nested-path predicates, data-keyed document lookups — makes the whole query conservatively DENY, even when every equality conjunct is discharged; production's prover may allow some of these. Divergence is deny-only: mixed equality + non-equality shapes are rejected up front rather than trusted to a residual evaluation that absent-tolerant predicates could pass vacuously.", "`unit:rules/simulator/query-proof.test.ts` (function-inlining provable cases; full-accounting rejections for mixed equality + `in`/`get`/`hasOnly`/range/`is` shapes in inline and helper form; fail-closed classifier probes: bracket-access `resource['data']`, `exists()` keyed by `resource.data` through path-literal segments, slice access, `resource.id`, and an unrecognized node shape), `unit:firestore/query-proof-enforcement.test.ts` (seeded end-to-end denials of the demonstrated attacks: forbidden-field absence check in member and bracket form, banned-owner `exists()` lookup, slice conjunct — each returning zero documents)"] }, { "feature": "getDocsFromCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getDocsFromCache is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Delegates to `getDoc` / `getDocs` in the sandbox mirror. Real Firebase THROWS `'unavailable'` here on a genuine cache miss; pyric never misses — the local store always has the answer (or a non-existent snapshot) — so it never throws for that reason", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "getDocsFromServer", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDocsFromServer is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getDownloadURL", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getDownloadURL is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Exported by `firebase/storage`; returns a token-signed HTTPS URL that fetches the blob", "Implemented with a two-sided pin. Production observation `storage-upload-bytes-roundtrip` records `urlIsHttps: true` and a byte-identical fetch. The sandbox oracle replay now calls the same public `getDownloadURL` + `fetch` path and proves byte-identical content, while explicitly asserting its URL starts with `blob:`. The client↔host integration proves SharedWorker mode creates that URL in the calling page after the rules-checked Blob crosses the port. The remaining divergence is URL identity and lifetime: the sandbox URL is a page-local snapshot, not token-signed HTTPS and not shareable outside that page."] }, { "feature": "getFirestore", "surface": "app", "importPaths": [], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getFirestore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getFirestore", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getFirestore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getGenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getGenerativeModel is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["A `models/`-prefixed name is accepted without double prefixing", "`unit:instances.test.ts` test `ai#model-name-prefixed` (no capture; normalization claim)"] }, { "feature": "getHistory", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getHistory is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`sendMessage` appends the user turn and the model turn; `getHistory()` returns the ordered `Content[]` with alternating roles", "`unit:chat-session.test.ts` test `ai#chat-history-threads` (no capture; history threading claim)", "Blocked prompts and blocked candidates are excluded from `getHistory()`", "`unit:chat-session.test.ts` test `ai#chat-history-excludes-blocked` (upstream JSDoc contract; exercised with a scripted blocked envelope)"] }, { "feature": "getIdToken", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getIdToken is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "getIdTokenResult", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getIdTokenResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "getImagenModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getImagenModel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior."] }, { "feature": "getLiveGenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getLiveGenerativeModel is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Live API is deferred, not out of scope — it is a bidirectional websocket protocol the sandbox can model with a scripted session engine, the same seam pattern the REST plane already uses; the work has not happened yet."] }, { "feature": "getMessaging", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getMessaging is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getMessaging", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getMessaging is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getMetadata", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "getMetadata is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`FullMetadata.md5Hash` populated on uploads", "divergence: sandbox does NOT compute `md5Hash`. Oracle-locked: `packages/conformance/observations/storage/storage-upload-then-getmetadata.json` confirms prod sets `md5Hash` (`hasMd5Hash: true` after a vanilla `uploadBytes`). Both sides pinned in `oracle-conformance.test.ts`. Aligning the sandbox is a one-spot fix in `upload.ts`'s `buildStoredMetadata`.", "`FullMetadata.ref` lazy population (prod populates lazily)", "not modeled in `pyric/storage` — `metadata.ts` explicitly omits `ref` from `FullMetadata`"] }, { "feature": "getMultiFactorResolver", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getMultiFactorResolver is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "getPersistentCacheIndexManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getPersistentCacheIndexManager is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "getPriority", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getPriority is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getRedirectResult", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getRedirectResult is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getStorage", "surface": "app", "importPaths": [], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getStorage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getStorage", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getStorage is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`getStorage(app, bucketUrl?)` accepts Firebase's bucket argument; the sandbox remains bound to its configured single bucket", "Package resolution owns production selection. The sandbox accepts the canonical argument but does not model production multi-bucket routing; `unit:service.test.ts` pins the configured `pyric-default` bucket."] }, { "feature": "getStorageSandbox", "surface": "storage", "importPaths": [], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getStorageSandbox is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getStream", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getStream is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["The Node-stream variant is deferred — not part of the browser-shaped v1 scope yet, but not genuinely un-modelable.", "Exported by `firebase/storage` (Node entry only); returns a Node `Readable`", "No `pyric/storage` implementation or behavioral probe exists; availability is classified by the owning surface contract."] }, { "feature": "getTemplateGenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getTemplateGenerativeModel is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Server-side templates are deferred, not out of scope — hosting template state is exactly the kind of server infrastructure the sandbox exists to model; the template store has not been built yet."] }, { "feature": "getTemplateImagenModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getTemplateImagenModel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Template-served Imagen models retire with the rest of Imagen (deprecated upstream, June 2026 shutdown); the template transport does not outlive the model family it serves."] }, { "feature": "getToken", "surface": "messaging", "importPaths": ["pyric/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getToken is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "GetTokenOptions", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GetTokenOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GithubAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GithubAuthProvider is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "goOffline", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "goOffline is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`goOffline(db)` — accepted no-op: there is no network connection in the local sandbox to toggle, so nothing is disconnected (we deliberately do NOT simulate a disconnect — pending writes, listeners, and `get()` keep working)", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "GoogleAIBackend", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleAIBackend is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GoogleAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "GoogleAuthProvider is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Custom scopes / params / language code", "sandbox ignores; prod forwards"] }, { "feature": "GoogleMaps", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleMaps is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GoogleMapsGroundingChunk", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleMapsGroundingChunk is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GoogleMapsTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleMapsTool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GoogleSearch", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleSearch is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GoogleSearchTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleSearchTool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "goOnline", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "goOnline is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`goOnline(db)` — accepted no-op: there is no connection to reopen (see `goOffline`)", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "GroundingChunk", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GroundingChunk is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GroundingMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GroundingMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GroundingSupport", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GroundingSupport is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "HarmBlockMethod", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HarmBlockMethod is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "HarmBlockThreshold", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HarmBlockThreshold is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "HarmCategory", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HarmCategory is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "HarmProbability", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HarmProbability is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "HarmSeverity", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HarmSeverity is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "hashing.crc32", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "hashing.crc32 is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "hashing.crc32c", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "hashing.crc32c is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "hashing.md5", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "hashing.md5 is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "hashing.sha256", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "hashing.sha256 is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "HybridParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HybridParams is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "IdTokenResult", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IdTokenResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ImageConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImageConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ImageConfigAspectRatio", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImageConfigAspectRatio is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ImageConfigImageSize", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImageConfigImageSize is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ImagenAspectRatio", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenAspectRatio is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior.", "Public type export is not mirrored."] }, { "feature": "ImagenGCSImage", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenGCSImage is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ImagenGenerationConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenGenerationConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ImagenGenerationResponse", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenGenerationResponse is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ImagenImageFormat", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenImageFormat is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior.", "Public type export is not mirrored."] }, { "feature": "ImagenInlineImage", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenInlineImage is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ImagenModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenModel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior.", "Public type export is not mirrored."] }, { "feature": "ImagenModelParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenModelParams is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ImagenPersonFilterLevel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenPersonFilterLevel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior.", "Public type export is not mirrored."] }, { "feature": "ImagenSafetyFilterLevel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenSafetyFilterLevel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior.", "Public type export is not mirrored."] }, { "feature": "ImagenSafetySettings", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenSafetySettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "increment", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "increment is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "increment", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "increment is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Two concurrent `increment` calls interleave correctly (last-write-wins is NOT the contract — both deltas accumulate)", "hard to observe deterministically from a single client; documented contract"] }, { "feature": "Index", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Index is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "IndexConfiguration", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IndexConfiguration is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "indexedDBLocalPersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "indexedDBLocalPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "IndexField", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IndexField is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "indexOn", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "indexOn is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "InferenceMode", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "InferenceMode is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Hybrid/on-device inference is deferred, not out of scope — the sandbox runs in the browser and can model the on-device path through the answer-engine seam; the mode has not been wired yet.", "Public type export is not mirrored."] }, { "feature": "InferenceSource", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "InferenceSource is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Deferred with hybrid/on-device inference — the source marker is meaningful once the hybrid mode lands.", "Public type export is not mirrored."] }, { "feature": "initializeApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "initializeApp is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Production permits a differently configured named app; Pyric rejects it because one runtime currently owns exactly one sandbox backend", "oracle: `app-registry-initializeapp-named-different-config` (firebase 12.13.0) + replay pins `app/multiple-configs-not-supported`; `packages/cli/test/e2e/app-multi-app.pw.ts` proves the same lock is enforced by the authoritative SharedWorker across same-origin tabs, not only by one page registry", "Production permits a different configuration after deletion; Pyric retains the runtime backend lock and rejects the reinitialization", "oracle: `app-registry-delete-reinitialize-different-config` (firebase 12.13.0) + replay pins `app/multiple-configs-not-supported`"] }, { "feature": "initializeAuth", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "initializeAuth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "initializeFirestore", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "initializeFirestore is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Delegates to sandbox `getFirestore(app)` and returns the same handle. Accepts the `settings` argument (so the explicit-init pattern doesn't crash at import) but no-ops the cache/network settings — persistence is always on", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "initializeRecaptchaConfig", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "initializeRecaptchaConfig is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "initializeServerApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "initializeServerApp is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Server-app (SSR) initialization: a FirebaseServerApp carries per-request auth/heartbeat state with no decided sandbox mirror pattern yet. Deferred, not out of scope — tracked as an unsupported registry row (registry/app.ts app#15).", "Not implemented; disposition `app.server-app` owns the reviewed availability and rationale", "disposition:app.server-app"] }, { "feature": "InlineDataPart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "InlineDataPart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "inlineDataParts", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "inlineDataParts is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "inMemoryPersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "inMemoryPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "int", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "int is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "IntegerSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IntegerSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "intersection", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "intersection is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "isSignInWithEmailLink", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "isSignInWithEmailLink is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "isSupported", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "isSupported is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "IteratedDataSnapshot", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IteratedDataSnapshot is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "keys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "keys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Language", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Language is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "LanguageModelCreateCoreOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelCreateCoreOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelCreateOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelCreateOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelExpected", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelExpected is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelMessage", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelMessage is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelMessageContent", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelMessageContent is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelMessageContentValue", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelMessageContentValue is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelMessageRole", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelMessageRole is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelMessageType", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelMessageType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelPromptOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelPromptOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LatLng", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LatLng is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "latlng", "surface": "firestore-rules", "importPaths": ["pyric/rules"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "latlng is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "latlng.distance", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "latlng.distance is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "latlng.latitude", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "latlng.latitude is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "latlng.longitude", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "latlng.longitude is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "latlng.value", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "latlng.value is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "let", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "let is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "let", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "let is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "lexicalScope", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "lexicalScope is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "LightSettings", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "LightSettings is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limit", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limit is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limitToFirst", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limitToFirst is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limitToLast", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "limitToLast is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`limitToLast(n)` — trailing n in ordered result (requires `orderBy`). Sandbox: the no-orderBy precondition throws a `FirestoreError` with `.code === 'invalid-argument'` (FS-B16; pre-fix plain `Error`s). Prod: the same precondition throws `.code === 'unimplemented'`", "divergence, oracle-locked by `packages/conformance/observations/firestore/firestore-limittolast-preconditions.json`: prod's no-orderBy `limitToLast` throws code `unimplemented`, the sandbox throws `invalid-argument`. Trailing-window semantics with `orderBy` conform (observed `[\"b\"]` matches). Both sides pinned in `oracle-conformance.test.ts`. Cursor composition + descending: `unit:upstream-query-probes.test.ts`. Cursor/empty-snapshot precondition codes remain per `unit:sandbox-target.test.ts` + `unit:admin-compat/cursors.test.ts` (verified failing pre-fix)"] }, { "feature": "limitToLast", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limitToLast is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "linkWithCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "linkWithCredential is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "linkWithPhoneNumber", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "linkWithPhoneNumber is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "linkWithPopup", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "linkWithPopup is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "linkWithRedirect", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "linkWithRedirect is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "List", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "List is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "list is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Paginated listing is deferred — listAll covers the v1 scope; pagination needs a stable pageToken shape, which is unbuilt design work rather than a sandbox limitation.", "Exported by `firebase/storage`; accepts `{ maxResults, pageToken }`, returns a `ListResult` with `nextPageToken` set when more pages remain", "No paginated `list` implementation or behavioral probe exists; availability is classified by the owning surface contract. `ListResult.nextPageToken` remains optional for forward-compatible consumer code."] }, { "feature": "list.concat", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.concat is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.hasAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.hasAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.hasAny", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.hasAny is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.hasOnly", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.hasOnly is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.join", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.join is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.removeAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.removeAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.size", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.toSet", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.toSet is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "listAll", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "listAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ListenOptions", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListenOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ListenSource", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListenSource is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ListOptions", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ListResult", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "LiveGenerationConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveGenerationConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveGenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveGenerativeModel is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Live API is deferred, not out of scope — it is a bidirectional websocket protocol the sandbox can model with a scripted session engine, the same seam pattern the REST plane already uses; the work has not happened yet.", "Public type export is not mirrored."] }, { "feature": "LiveModelParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveModelParams is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveResponseType", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveResponseType is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Live API is deferred, not out of scope — it is a bidirectional websocket protocol the sandbox can model with a scripted session engine, the same seam pattern the REST plane already uses; the work has not happened yet.", "Public type export is not mirrored."] }, { "feature": "LiveServerContent", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveServerContent is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveServerGoingAwayNotice", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveServerGoingAwayNotice is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveServerToolCall", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveServerToolCall is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveServerToolCallCancellation", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveServerToolCallCancellation is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveSession", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveSession is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Live API is deferred, not out of scope — it is a bidirectional websocket protocol the sandbox can model with a scripted session engine, the same seam pattern the REST plane already uses; the work has not happened yet.", "Public type export is not mirrored."] }, { "feature": "LiveSessionResumptionUpdate", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveSessionResumptionUpdate is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "loadBundle", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "loadBundle is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Bundle-loading depends on a protobuf packaging format not modeled in the sandbox yet — a data/parsing problem, not external infrastructure, so it is buildable rather than genuinely un-modelable."] }, { "feature": "LoadBundleTask", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LoadBundleTask is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Bundle-loading depends on a protobuf packaging format not modeled in the sandbox yet — a data/parsing problem, not external infrastructure, so it is buildable rather than genuinely un-modelable.", "Public type export is not mirrored."] }, { "feature": "LoadBundleTaskProgress", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LoadBundleTaskProgress is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LogLevel", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LogLevel is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "map.diff", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.diff is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Map.get", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Map.get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.get", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.hasAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "map.hasAll is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "map.hasAny", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "map.hasAny is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "map.hasOnly", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "map.hasOnly is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "map.keys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.keys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.size", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Map.values", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Map.values is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.values", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.values is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapdiff.addedKeys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapdiff.addedKeys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapdiff.affectedKeys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapdiff.affectedKeys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapdiff.changedKeys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapdiff.changedKeys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapdiff.removedKeys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapdiff.removedKeys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapdiff.unchangedKeys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapdiff.unchangedKeys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapMembership", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapMembership is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "matches", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "matches is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "matches", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "matches is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "matches", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "matches is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.abs", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.abs is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.ceil", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.ceil is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.floor", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.floor is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.isInfinite", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "math.isInfinite is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "math.isNaN", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.isNaN is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.pow", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.pow is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.round", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.round is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.sqrt", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.sqrt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MemoryCacheSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryCacheSettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "memoryEagerGarbageCollector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "memoryEagerGarbageCollector is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "MemoryEagerGarbageCollector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryEagerGarbageCollector is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MemoryGarbageCollector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryGarbageCollector is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "memoryLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "memoryLocalCache is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "MemoryLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryLocalCache is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "memoryLruGarbageCollector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "memoryLruGarbageCollector is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "MemoryLruGarbageCollector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryLruGarbageCollector is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "Message", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Message is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MessagePayload", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "MessagePayload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Messaging", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Messaging is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Messaging", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Messaging is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "messaging", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "messaging is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MessagingClientErrorCode", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "MessagingClientErrorCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MessagingOptions", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "MessagingOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MessagingPayload", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "MessagingPayload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MessagingTopicManagementResponse", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "MessagingTopicManagementResponse is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "missingFieldAccess", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "missingFieldAccess is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Modality", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Modality is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ModalityTokenCount", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ModalityTokenCount is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ModelParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ModelParams is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "multiFactor", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "multiFactor is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "MultiFactorAssertion", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorAssertion is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MultiFactorError", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorError is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MultiFactorInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorInfo is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MultiFactorResolver", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorResolver is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MultiFactorSession", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorSession is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MultiFactorUser", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorUser is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "namedQuery", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "namedQuery is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Bundle-loading depends on a protobuf packaging format not modeled in the sandbox yet — a data/parsing problem, not external infrastructure, so it is buildable rather than genuinely un-modelable."] }, { "feature": "NestedUpdateFields", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NestedUpdateFields is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "newData", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "newData is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "NextFn", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NextFn is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "NextFn", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NextFn is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "NextOrObserver", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NextOrObserver is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "Notification", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Notification is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "NotificationMessagePayload", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "NotificationMessagePayload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "NotificationPayload", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NotificationPayload is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "now", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "now is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "NumberSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NumberSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "OAuthCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "OAuthCredential is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "OAuthCredentialOptions", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OAuthCredentialOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "OAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OAuthProvider is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ObjectSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ObjectSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ObjectSchemaRequest", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ObjectSchemaRequest is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Observer", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Observer is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "off", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "off is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["When the same callback is registered more than once, each `off(ref, eventType, callback)` removes one registration without orphaning the others", "Pyric behavior is locked by `packages/pyric/test/app/multi-app-listener-auth.test.ts`; a production duplicate-registration oracle capture is still needed"] }, { "feature": "onAuthStateChanged", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onAuthStateChanged is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onBackgroundMessage", "surface": "messaging", "importPaths": ["pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onBackgroundMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onChildAdded", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "onChildAdded is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["**Divergence (DB-B12, honest doc):** the onChild* callbacks do NOT receive the `previousChildName` second argument; `onValue`/`onChild*` do NOT accept a `cancelCallback`; `onChildAdded`/`Changed`/`Removed`/`Moved` accept only plain refs (not `Query`); `child_moved` never fires (ordered-query move detection unmodeled). These listener-surface holes are out of scope for the current phase — consumers needing them use `firebase/database` directly.", "divergence documented; partial coverage: `{ onlyOnce }` IS implemented (M74)."] }, { "feature": "onChildChanged", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onChildChanged is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onChildMoved", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "onChildMoved is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`onChildMoved` under an ordered query. Prod: fires when a child's `orderByChild`/`orderByValue` priority changes — emitted only on ordered queries. Sandbox: **never fires on reorder** — `onChildMoved` supports the plain-ref (no-fire) case only; the ordered-query overload is unimplemented", "divergence, oracle-locked by `packages/conformance/observations/rtdb-modular/rtdb-modular-onchildmoved-with-orderby.json`: prod observed `firedOnMove: 1` under `query(ref, orderByChild('priority'))` after bumping a child's priority to a new sort position; the sandbox fires 0 on reorder. Partial alignment landed: all `onChild*` now ACCEPT a `Query` (previously threw a misleading `unrecognized reference` TypeError) with window-aware `child_added`/`child_changed`/`child_removed` diffs (`src/database/sandbox/backend.ts`); the two hold-lifting captures now exist: `rtdb-modular-onchildmoved-previouschildname-sequencing` pins prev-name sequencing (end/middle/front reorders yield prev k3/k2/null, no initial replay) and `rtdb-modular-childchanged-cofire-with-childmoved` pins co-fire semantics (a reorder fires BOTH `child_changed` and `child_moved`; a non-ordered-field change fires neither moved; prod fires `child_moved` on an ordered-field value change EVEN WHEN RANK IS UNCHANGED). Implementation of ordered `child_moved` is unblocked. Both sides pinned in `modular/oracle-conformance.test.ts` and `modular/sandbox-child-events.test.ts`. Sandbox Tier 2 locks the plain-ref no-fire case (M46)."] }, { "feature": "onChildRemoved", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onChildRemoved is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "OnDeviceParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OnDeviceParams is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "OnDisconnect", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OnDisconnect is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["onDisconnect requires a live connection lifecycle the in-memory sandbox has no equivalent for today — buildable as an honest no-op or inert token like the connection-management APIs, not genuinely un-modelable.", "Public type export is not mirrored."] }, { "feature": "onDisconnect", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "onDisconnect is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["onDisconnect requires a live connection lifecycle the in-memory sandbox has no equivalent for today — buildable as an honest no-op or inert token like the connection-management APIs, not genuinely un-modelable."] }, { "feature": "onIdTokenChanged", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onIdTokenChanged is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onLog", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onLog is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onMessage", "surface": "messaging", "importPaths": ["pyric/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onSnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onSnapshot is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onSnapshotResume", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "onSnapshotResume is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Snapshot JSON reconstruction and listener-resume helpers depend on serialized snapshot state that the sandbox has not modeled."] }, { "feature": "onSnapshotsInSync", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "onSnapshotsInSync is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Fires the callback once the current snapshot-delivery microtask queue settles — the closest honest approximation of \"every active listener has delivered its latest state\" available without a true cross-listener sync signal. Not scoped to real server round-trips like the real SDK's guarantee; scoped to local delivery only", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "onValue", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "onValue is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["**Divergence (DB-B12, honest doc):** the onChild* callbacks do NOT receive the `previousChildName` second argument; `onValue`/`onChild*` do NOT accept a `cancelCallback`; `onChildAdded`/`Changed`/`Removed`/`Moved` accept only plain refs (not `Query`); `child_moved` never fires (ordered-query move detection unmodeled). These listener-surface holes are out of scope for the current phase — consumers needing them use `firebase/database` directly.", "divergence documented; partial coverage: `{ onlyOnce }` IS implemented (M74).", "The returned value from `onValue(ref, cb)` is the unsubscribe function (NOT an object); calling it removes the listener", "upstream contract — locked indirectly by #131"] }, { "feature": "onValueCreated", "surface": "functions-rtdb", "importPaths": [], "evidenceSlug": "functions-rtdb-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "onValueCreated is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["A handler that throws or returns a rejected Promise is reported by the managed runtime; with retry disabled, the Eventarc request can still be acknowledged with HTTP 200.", "oracle: `functions-rtdb-onvaluecreated-failed-execution.json`; Pyric observes the rejected handler and marker, but has no Eventarc HTTP request seam with which to replay the captured 200 acknowledgement."] }, { "feature": "OperationType", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "OperationType is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.add", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.add is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.add", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.add is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.add", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.add is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.and", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.and is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.and", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.and is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.and", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.and is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.div", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "operator.div is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`int`/`float` division and type distinction (RULES-B5) in rules — truncating int÷int, float division stays float, div-by-zero denies, `is int`/`is float` distinct", "`oracle:rules-firestore-int-float-and-division` — production Firestore Rules Test API verdicts for corpus scenario \"int-float-and-division\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator narrows a float-valued payload field toward int on the float-payload case, unlike production which preserves the float type — pinned KNOWN_DIVERGENCE"] }, { "feature": "operator.div", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.div is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.div", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.div is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.eq", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.eq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.eq", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.eq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.gt", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.gt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.gt", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.gt is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.gt", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.gt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.gte", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.gte is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.gte", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.gte is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.gte", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.gte is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.in", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.in is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.in", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.in is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.index", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.index is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.index", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.index is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.index", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.index is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.is", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "operator.is is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`int`/`float` division and type distinction (RULES-B5) in rules — truncating int÷int, float division stays float, div-by-zero denies, `is int`/`is float` distinct", "`oracle:rules-firestore-int-float-and-division` — production Firestore Rules Test API verdicts for corpus scenario \"int-float-and-division\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator narrows a float-valued payload field toward int on the float-payload case, unlike production which preserves the float type — pinned KNOWN_DIVERGENCE"] }, { "feature": "operator.is", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.is is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.looseEq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.looseEq is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.looseNeq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.looseNeq is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.lt", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.lt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.lt", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.lt is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.lt", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.lt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.lte", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.lte is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.lte", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.lte is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.lte", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.lte is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.member", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.member is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.member", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.member is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.member", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.member is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.mod", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.mod is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.mod", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.mod is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.mod", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.mod is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.mul", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.mul is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.mul", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.mul is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.mul", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.mul is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.neg", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.neg is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.neq", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.neq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.neq", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.neq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.not", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.not is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.not", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.not is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.not", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.not is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.or", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.or is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.or", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.or is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.or", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.or is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.slice", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "operator.slice is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Range-slice `[i:j]` syntax for `List` and `String` (Item 4) in rules", "`oracle:rules-firestore-range-slice-list-and-string` — production Firestore Rules Test API verdicts for corpus scenario \"range-slice-list-and-string\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator clamps an out-of-bounds slice end to the collection length on both the list and string OOB-slice cases; production denies — pinned KNOWN_DIVERGENCE"] }, { "feature": "operator.slice", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.slice is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.strictEq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.strictEq is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.strictNeq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.strictNeq is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.sub", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.sub is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.sub", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.sub is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.sub", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.sub is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.ternary", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.ternary is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.ternary", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.ternary is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.ternary", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.ternary is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.unary-minus", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.unary-minus is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.unary-minus", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.unary-minus is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "or", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "or is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "orderBy", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderBy is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "orderByChild", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderByChild is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "OrderByDirection", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OrderByDirection is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "orderByKey", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderByKey is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "orderByPriority", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "orderByPriority is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Firebase's legacy priority ordering system is absent; the sandbox exposes orderByChild/Key/Value only today. Priority ordering is data-modelable as a sort key, so this is revisitable scope rather than a hard sandbox limitation."] }, { "feature": "orderByValue", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderByValue is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Outcome", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Outcome is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "parent", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "parent is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["`ref(db, path)` returns a tagged `DatabaseReference` carrying `key`, `parent`, `root`, `toString()`", "upstream `firebase/database` contract", "`ref(db)` with no path returns the root ref (`key === null`, `parent === null`)", "upstream contract", "`ref.parent` is `null` at root, otherwise the parent ref"] }, { "feature": "parseActionCodeURL", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "parseActionCodeURL is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ParsedToken", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ParsedToken is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "parseLink", "surface": "auth", "importPaths": [], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "parseLink is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "parseStorageRules", "surface": "storage-rules", "importPaths": ["pyric/storage"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "parseStorageRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Part", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Part is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PartialWithFieldValue", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PartialWithFieldValue is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PasswordPolicy", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PasswordPolicy is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PasswordValidationStatus", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PasswordValidationStatus is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "path.bind", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "path.bind is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Path` wrapper, `path()` constructor, and `Path.bind()` (Item 5.4) in rules", "`oracle:rules-firestore-path-constructor-and-bind` — production Firestore Rules Test API verdicts for corpus scenario \"path-constructor-and-bind\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator treats `path()` as idempotent on an already-Path argument where production denies — pinned KNOWN_DIVERGENCE"] }, { "feature": "pathParameters", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "pathParameters is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "path-variable", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "path-variable is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "path-variable", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "path-variable is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "path-variable", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "path-variable is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "pathVariables", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "pathVariables is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Persistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Persistence is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PersistenceSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistenceSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PersistentCacheIndexManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentCacheIndexManager is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope.", "Public type export is not mirrored."] }, { "feature": "PersistentCacheSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentCacheSettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "persistentLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "persistentLocalCache is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "PersistentLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentLocalCache is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "persistentMultipleTabManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "persistentMultipleTabManager is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "PersistentMultipleTabManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentMultipleTabManager is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "persistentSingleTabManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "persistentSingleTabManager is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "PersistentSingleTabManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentSingleTabManager is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PersistentSingleTabManagerSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentSingleTabManagerSettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PersistentTabManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentTabManager is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PhoneAuthCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneAuthCredential is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "PhoneAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneAuthProvider is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "PhoneInfoOptions", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneInfoOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PhoneMultiFactorAssertion", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneMultiFactorAssertion is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PhoneMultiFactorEnrollInfoOptions", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneMultiFactorEnrollInfoOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PhoneMultiFactorGenerator", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneMultiFactorGenerator is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "PhoneMultiFactorInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneMultiFactorInfo is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PhoneMultiFactorSignInInfoOptions", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneMultiFactorSignInInfoOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PhoneSingleFactorInfoOptions", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneSingleFactorInfoOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "policies", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "policies is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "PopupRedirectResolver", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PopupRedirectResolver is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "POSSIBLE_ROLES", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "POSSIBLE_ROLES is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "PrebuiltVoiceConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PrebuiltVoiceConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "Primitive", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Primitive is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "prodErrorMap", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "prodErrorMap is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "PromptFeedback", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PromptFeedback is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "providerData", "surface": "auth", "importPaths": [], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "providerData is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ProviderId", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ProviderId is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "push", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "push is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "pushKey", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "pushKey is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "query", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "query is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Index validation against `firestore.indexes.json` — sandbox uses `LocalEnvironment`'s lint pass; prod has its own server-side validation", "divergence: sandbox can mis-pass a query that prod would reject at the server with `failed-precondition` if no index exists"] }, { "feature": "Query", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Query is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "query", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "query is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["**Divergence (DB-B12, honest doc):** the onChild* callbacks do NOT receive the `previousChildName` second argument; `onValue`/`onChild*` do NOT accept a `cancelCallback`; `onChildAdded`/`Changed`/`Removed`/`Moved` accept only plain refs (not `Query`); `child_moved` never fires (ordered-query move detection unmodeled). These listener-surface holes are out of scope for the current phase — consumers needing them use `firebase/database` directly.", "divergence documented; partial coverage: `{ onlyOnce }` IS implemented (M74)."] }, { "feature": "Query", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Query is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryCompositeFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryCompositeFilterConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "QueryConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "QueryConstraint", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes are mirrored structurally in Pyric's type surface but are not exported as runtime constructor values; runtime identity remains unbuilt."] }, { "feature": "QueryConstraintType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraintType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "QueryConstraintType", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraintType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "QueryDocumentSnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryDocumentSnapshot is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "QueryEndAtConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryEndAtConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "queryEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "queryEqual is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`queryEqual(a, b)` is identity-only in the sandbox mirror; production's untouched Firebase SDK uses structural equality", "divergence: sandbox does identity-only; prod does deep structural. Oracle-locked: `packages/conformance/observations/firestore/firestore-queryequal-structural.json` — two independently-built queries with the same `where('x','==',1)` constraint compare equal in prod (`sameQueryBuiltTwice: true`), confirming structural semantics. Common use case (caching the same returned query) works on both."] }, { "feature": "QueryFieldFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryFieldFilterConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "QueryFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryFilterConstraint is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "QueryLimitConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryLimitConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "QueryNonFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryNonFilterConstraint is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "QueryOrderByConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryOrderByConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "QuerySnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QuerySnapshot is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "querySnapshotFromJSON", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "querySnapshotFromJSON is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Snapshot JSON reconstruction and listener-resume helpers depend on serialized snapshot state that the sandbox has not modeled."] }, { "feature": "QueryStartAtConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryStartAtConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "ReactNativeAsyncStorage", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ReactNativeAsyncStorage is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "reauthenticateWithCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "reauthenticateWithCredential is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "reauthenticateWithPhoneNumber", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "reauthenticateWithPhoneNumber is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "reauthenticateWithPopup", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "reauthenticateWithPopup is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "reauthenticateWithRedirect", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "reauthenticateWithRedirect is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "RecaptchaParameters", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "RecaptchaParameters is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "RecaptchaVerifier", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "RecaptchaVerifier is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "recursiveMatch", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "recursiveMatch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "recursiveWildcard", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "recursiveWildcard is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ref", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "ref is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`ref(db, path)` returns a tagged `DatabaseReference` carrying `key`, `parent`, `root`, `toString()`", "upstream `firebase/database` contract", "`ref(db)` with no path returns the root ref (`key === null`, `parent === null`)", "upstream contract", "`child(ref, 'a/b')` joins a relative path, including embedded slashes", "`ref.parent` is `null` at root, otherwise the parent ref", "`ref.key` is the final path segment, `null` for root", "Unknown ref (not produced by this package) → `TypeError` in shim ops", "Phase 3"] }, { "feature": "ref", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ref is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "refEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "refEqual is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "refFromURL", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "refFromURL is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`refFromURL(db, url)` — real alias: parses the path out of the absolute database URL and delegates to `ref(db, path)`, so the returned ref resolves + reads exactly like `ref(db, path)`. Divergence: the sandbox is single-database with no host/namespace, so the URL's HOST is NOT validated against the handle (the real SDK throws if the host doesn't match the db's namespace); only the path is honored", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "registerVersion", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "registerVersion is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "reload", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "reload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "remove", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "remove is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "removeAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "removeAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "replace", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "replace is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth.token", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth.token is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth.token", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth.token is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth.uid", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth.uid is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth.uid", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth.uid is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.method", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.method is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.method", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.method is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.path", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.path is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.path", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.path is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.query", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "request.query is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`request.path`/`request.query`/`resource.id`/`resource.__name__` globals (Item 6) in rules", "`oracle:rules-firestore-globals-request-path-and-resource-id` — production Firestore Rules Test API verdicts for corpus scenario \"globals-request-path-and-resource-id\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator models `request.query` as an empty map on the empty-query case where production denies the equivalent comparison — pinned KNOWN_DIVERGENCE. Contamination scope is `request.query` ALONE: the scenario's `request.path` cases conform, and its `resource.id`/`resource.__name__` cases conform because they run on a `create` (where `resource` is null pre-write). Resource identity on an EXISTING document is scoped to firestore-rules#183."] }, { "feature": "request.resource", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.resource", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.resource.contentType", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource.contentType is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.resource.data", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource.data is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.resource.id", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "request.resource.id is available, has diverged fidelity, and is ineligible for assurance.", "caveats": ["request.resource.id is in the official language, but production's Rules Test API does not populate it: request.resource is built from the supplied payload alone, so `.id` is an absent property and reading it errors → DENY. The simulator matches — its handler builds request.resource as `{ data }` only (simulator/handler.ts), so the evaluator's absent-key error yields production's verdict. The same now holds for the existing document: `resource` carries `data` ONLY, no synthesized `id`/`__name__` (RULES-B12, firestore-rules#183)."] }, { "feature": "request.resource.metadata", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource.metadata is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.resource.size", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.time", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.time is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.time", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.time is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "RequestOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "RequestOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "requiredFields", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "requiredFields is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "resource is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`resource` on a create where no object exists: the create-if-absent guard `allow create: if resource == null`", "divergence, over-permissive (the evaluator ALLOWs where production DENIEs, the highest-severity direction defined in `docs/storage/reference/conformance-gaps.md`). `oracle:rules-storage-verbs-umbrella-granular`, case \"create allowed when object does not exist (resource == null)\": production DENIES. Production raises a null value error on a `resource` reference in a create where no object exists, and the errored expression denies, so a `create` rule guarded by `resource == null` never allows. The evaluator models `resource` as null on create, evaluates the comparison as documented, and ALLOWS. Live-probed against production before pinning with both an omitted `resource` field and an explicit null, which denied identically, ruling out a capture-harness wire-shape bug. Both sides pinned in `unit:storage/rules-oracle-conformance.test.ts` KNOWN_DIVERGENCES. Same error-value class as the Firestore `resource` identity on a missing document."] }, { "feature": "resource.bucket", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.bucket is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["resource.bucket is the bucket the object resides in, sourced from the persisted record. Production returns it as a literal on the resource map; an absent bucket denies."] }, { "feature": "resource.contentType", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.contentType is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource.data", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.data is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource.id", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "resource.id is available, has diverged fidelity, and is ineligible for assurance.", "caveats": ["`get()` of a missing document (RULES-B8) in rules — resource identity (`id`/`__name__`) exposure on a mocked/missing get() result", "`oracle:rules-firestore-get-missing-doc` — production Firestore Rules Test API verdicts for corpus scenario \"get-missing-doc\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator synthesizes a resource identity (`id`, `__name__`) for mocked get() results that production leaves absent, on 2 scenario cases — pinned KNOWN_DIVERGENCE"] }, { "feature": "resource.metadata", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.metadata is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource.__name__", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "resource.__name__ is available, has diverged fidelity, and is ineligible for assurance.", "caveats": ["`get()` of a missing document (RULES-B8) in rules — resource identity (`id`/`__name__`) exposure on a mocked/missing get() result", "`oracle:rules-firestore-get-missing-doc` — production Firestore Rules Test API verdicts for corpus scenario \"get-missing-doc\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator synthesizes a resource identity (`id`, `__name__`) for mocked get() results that production leaves absent, on 2 scenario cases — pinned KNOWN_DIVERGENCE"] }, { "feature": "resource.name", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.name is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["resource.name is the object's FULL path within the bucket (GCS object-name convention, e.g. `uploads/pic.png`), sourced from the persisted record's fullPath — NOT the client SDK's last-path-segment name. Production returns it as a literal on the resource map; an absent name is an evaluation error that denies."] }, { "feature": "resource.size", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource.timeCreated", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.timeCreated is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["resource.timeCreated is a timestamp (ISO-8601 in the persisted record; the evaluator compares it as epoch millis against request.time). Production rejects an int in a timestamp comparison; an absent timeCreated denies."] }, { "feature": "resource.updated", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.updated is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["resource.updated is the object's last-update timestamp. The field is `updated` — the Storage rules language has NO `resource.timeUpdated` (live-probed: `timeUpdated` reads as an absent property). Renamed from the earlier mis-identified `storage.binding.resource.timeUpdated`."] }, { "feature": "ResponseModality", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ResponseModality is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "RetrievalConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "RetrievalConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "RetrievedContextAttribution", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "RetrievedContextAttribution is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "revokeAccessToken", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "revokeAccessToken is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Accepted no-op. In production this reaches OUTSIDE Firebase entirely — it tells the identity provider (in practice Apple) to revoke an OAuth access token, which is a call landing on Apple's servers. There is no external IdP behind a sandbox sign-in, so there is no token out there to revoke and nothing this call could truthfully do. It resolves (so the account-deletion flow Apple requires an app to ship runs end to end against the sandbox) and changes no sandbox state (because claiming otherwise would be a lie).", "`unit:types.test.ts` — the export resolves. Deliberately not oracle-probed: a successful probe would revoke a real token at a real IdP, which is a side effect on someone else's system that a conformance run has no business causing."] }, { "feature": "Role", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Role is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "root", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "root is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["`ref(db, path)` returns a tagged `DatabaseReference` carrying `key`, `parent`, `root`, `toString()`", "upstream `firebase/database` contract", "`ref(db)` with no path returns the root ref (`key === null`, `parent === null`)", "upstream contract", "`ref.parent` is `null` at root, otherwise the parent ref", "`ref.key` is the final path segment, `null` for root"] }, { "feature": "root", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "root is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-create", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-create is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-create", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-create is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-delete", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-delete is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-delete", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-delete is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-get", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-get", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-list", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-list is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-list", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-list is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-read", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-read is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-read", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-read is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-update", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-update is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-update", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-update is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-write", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-write is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-write", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-write is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.function", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.function is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.function", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.function is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.import", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.import is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Discrepancy: `import { fn } from 'module'` under `rules_version = '2+modules'` is a pyric resolver extension (rules/modules/resolver.ts), not stock Firebase rules — production Firestore only knows rules_version '1'/'2' and has no import statement."] }, { "feature": "rule-kind.indexOn", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.indexOn is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "rule-kind.let", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.let is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.let", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.let is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.location-wildcard", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.location-wildcard is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "rule-kind.match", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.match is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.match", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.match is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.read", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.read is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "rule-kind.rules_version", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.rules_version is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.rules_version", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.rules_version is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.validate", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.validate is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "rule-kind.write", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.write is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "ruleset", "surface": "rtdb", "importPaths": ["pyric/rules/internal/rtdb"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ruleset is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "runTransaction", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "runTransaction is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Retry behavior — prod retries on contention up to 5 times; sandbox is single-threaded, no contention possible", "divergence: contention story not modeled; sandbox just runs once"] }, { "feature": "runTransaction", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "runTransaction is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Concurrent contention / retry-on-conflict — single-client sandbox doesn't model real concurrency; the documented \"up to 25 retries\" contract is degenerate (the fn is invoked once)", "matrix #161 documents the same gap on the spec side; oracle observation hard to obtain from a single client (oracle row stays `?`)", "Concurrent contention — if another client writes between the read and write, the update fn is retried with the new current value (typically up to 25 retries by default)", "hard to observe deterministically from a single client"] }, { "feature": "SafetyRating", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SafetyRating is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SafetySetting", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SafetySetting is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SAMLAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "SAMLAuthProvider is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Schema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "Schema is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`Schema.enumString` serializes the enum values with type `string` and format `enum`", "`unit:helpers-schema.test.ts` test `ai#schema-string-enum` (upstream toJSON request shape; GoogleAI accepts only enum and date-time formats)"] }, { "feature": "SchemaInterface", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SchemaInterface is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SchemaParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SchemaParams is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SchemaRequest", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SchemaRequest is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SchemaShared", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SchemaShared is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SchemaType", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SchemaType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "script", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "script is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SDK_VERSION", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "SDK_VERSION is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SearchEntrypoint", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SearchEntrypoint is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Segment", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Segment is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "semantic.deny-by-default", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.deny-by-default is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.deny-by-default", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.deny-by-default is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.error-absorption-and", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.error-absorption-and is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.error-absorption-or", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.error-absorption-or is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.get-budget", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.get-budget is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.hierarchical-match-cascade", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.hierarchical-match-cascade is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.read-cascade", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.read-cascade is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.read-umbrella", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.read-umbrella is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.recursive-wildcard", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.recursive-wildcard is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.recursive-wildcard", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.recursive-wildcard is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.regex-literal", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.regex-literal is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.type-dispatch", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.type-dispatch is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.validate-non-cascade", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.validate-non-cascade is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.write-cascade", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.write-cascade is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.write-umbrella", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.write-umbrella is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "send", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "send is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sendEach", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "sendEach is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sendEachForMulticast", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "sendEachForMulticast is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sendEmailVerification", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "sendEmailVerification is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sendMessage", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "sendMessage is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`sendMessage` appends the user turn and the model turn; `getHistory()` returns the ordered `Content[]` with alternating roles", "`unit:chat-session.test.ts` test `ai#chat-history-threads` (no capture; history threading claim)"] }, { "feature": "sendMessageStream", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "sendMessageStream is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Exactly one user turn is recorded per `sendMessageStream` call; the mirror implements the 2.13.0 fixed semantics, not the installed 2.12.0 duplicate-user-turn bug", "`unit:chat-session.test.ts` test `ai#chat-stream-single-user-turn` (no capture; divergence pinned by ruling, see notes)"] }, { "feature": "sendPasswordResetEmail", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "sendPasswordResetEmail is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SendResponse", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "SendResponse is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sendSignInLinkToEmail", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "sendSignInLinkToEmail is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Prod rejects a continue URL whose domain is not on the project's authorized-domains list. The sandbox has NO domain allowlist and does not invent one: it accepts any parseable continue URL. A continue URL that would be rejected in production is accepted here.", "The sandbox has no project config to hold an authorized-domains list, so there is nothing to check against; inventing an allowlist would mean inventing a policy the user never set. The probe attempted the server arm (`auth-sendsigninlinktoemail-settings-validation`, `unauthorizedDomain`) but the oracle project has email-link sign-in disabled, so it answered `auth/operation-not-allowed` rather than `auth/unauthorized-continue-uri` — the divergence is declared from the documented contract, not from a capture we do not have."] }, { "feature": "serializeRtdbRules", "surface": "rtdb", "importPaths": ["pyric/rules/internal/rtdb"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "serializeRtdbRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "serverTimestamp", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "serverTimestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "serverTimestamp", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "serverTimestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SessionResumptionConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SessionResumptionConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "set", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "set is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Replaces the value at the path entirely; resolves to `undefined` (unlike `setDoc` which resolves to `void`, RTDB's `set` is documented as `Promise<void>`)", "upstream contract"] }, { "feature": "set.difference", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "set.difference is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "set.hasAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set.hasAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set.hasAny", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set.hasAny is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set.hasOnly", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set.hasOnly is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set.intersection", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "set.intersection is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "set.size", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set.union", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "set.union is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "setData", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setData is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setDoc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setIndexConfiguration", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "setIndexConfiguration is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "setLogLevel", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setLogLevel is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setLogLevel", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "setLogLevel is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Accepted no-op — the sandbox has no modular-SDK-style logger to wire a level into; it uses host-level `console` logging directly, gated by `pyric dev`'s own flags, not this call", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "SetOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SetOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "setPersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "setPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Actually changes where the auth state is persisted", "divergence: sandbox is a no-op. Prod respects the marker."] }, { "feature": "setPriority", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "setPriority is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Firebase's legacy priority ordering system is absent; the sandbox exposes orderByChild/Key/Value only today. Priority ordering is data-modelable as a sort key, so this is revisitable scope rather than a hard sandbox limitation."] }, { "feature": "setRules", "surface": "firestore", "importPaths": [], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "setRules is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["DEFERRED sub-items of row 138: strict bool in `&&`/`||`/ternary (`1 && true` should error) — corpus-coupled, needs emulator; a FLOAT stored in JSON test-data reads as int (`data.x is float`→false; prod uses the stored Firestore type tag) — needs a `__type:'float'` test-data revive marker; `resource`-null-on-create (RULES-B12 rest)", "DEFERRED — see the design rationale (limitation + sub-items); strict-bool also in `step-07`."] }, { "feature": "setRules", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setRules", "surface": "storage", "importPaths": [], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SettableMetadata", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SettableMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "setWithPriority", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "setWithPriority is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Firebase's legacy priority ordering system is absent; the sandbox exposes orderByChild/Key/Value only today. Priority ordering is data-modelable as a sort key, so this is revisitable scope rather than a hard sandbox limitation."] }, { "feature": "signInAnonymously", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "signInAnonymously is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Auto-generates a uid for fresh sign-ins (sandbox format: `anonymous-{N}`)", "`unit:sandbox-anonymous.test.ts` — prod uids are 28-char base64-ish; sandbox uses a readable counter for debuggability", "Anonymous users persist across page reload via configured `Persistence` (prod only — sandbox has no persistence layer)", "divergence: sandbox memory only; within one tab the user persists, across reload they don't"] }, { "feature": "SignInMethod", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "SignInMethod is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "signInWithCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "signInWithCredential is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Opens a popup window in prod", "divergence: sandbox skips the popup; mock pre-stage replaces the popup result", "Cancels with `auth/popup-closed-by-user` when the user dismisses the popup (prod)", "not modeled — would require the host to expose a \"cancel\" affordance on the mock"] }, { "feature": "signInWithCustomToken", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "signInWithCustomToken is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Throws `auth/invalid-custom-token` for a malformed token and for the empty string. The sandbox accepts a token in the two shapes it can honestly read: a JSON (optionally base64url) `{uid, claims}` payload — exactly what `admin.auth().createCustomToken` signs, so the pyric-admin mint and this redeem compose — or a real three-part JWT whose payload segment carries `uid`/`sub`. The SIGNATURE IS NOT VERIFIED: the sandbox has no service-account key. The identity is created if it does not exist, and the credential carries `providerId: null` (custom-token sign-in is not a federated provider).", "ORACLE-BACKED on the reject path: `auth-signinwithcustomtoken-invalid` captured `auth/invalid-custom-token` for both a malformed token and the empty string, replayed in `unit:oracle-conformance.test.ts`. Diverged on the ACCEPT path, declared rather than hidden: prod verifies an RS256 signature against the project's service-account key and the sandbox has no key, so it reads the token's claims WITHOUT verifying them. A forged token that prod would reject is accepted here. The happy path cannot be oracle-probed from a Web SDK client at all (it needs an Admin-SDK-signed JWT)."] }, { "feature": "signInWithEmailAndPassword", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "signInWithEmailAndPassword is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["An EMPTY password throws `auth/missing-password` (message \"A non-empty password must be provided\"), fired before the user-DB lookup so it can't be used to enumerate seeded emails. Upstream maps the `MISSING_PASSWORD` server error (`core/errors.ts:92,282,563`). ⚠ best-known semantics — message text not yet captured against a live project (STOP-flagged for an oracle pass; the `.code` is the load-bearing part).", "`unit:sandbox-cluster-b9-b12.test.ts` (locks AUTH-B11)"] }, { "feature": "signInWithEmailLink", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "signInWithEmailLink is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "signInWithPhoneNumber", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "signInWithPhoneNumber is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "signInWithPopup", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "signInWithPopup is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Opens a popup window in prod", "divergence: sandbox skips the popup; mock pre-stage replaces the popup result", "Cancels with `auth/popup-closed-by-user` when the user dismisses the popup (prod)", "not modeled — would require the host to expose a \"cancel\" affordance on the mock"] }, { "feature": "signInWithRedirect", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "signInWithRedirect is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "signOut", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "signOut is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Clears the active session's persistence in prod; sandbox has no persistence", "divergence: same memory-only constraint as the anonymous persistence row"] }, { "feature": "simulateRtdbRules", "surface": "rtdb", "importPaths": ["pyric/rules/internal/rtdb"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "simulateRtdbRules is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["The removed stateful simulator returned a generate-before-simulate error when no IR had been generated", "The stateless `simulateRtdbRules(compiled, input)` API requires a compiled rules tree and has no generate-before-simulate lifecycle.", "Cross-path `root.child(…).val()` reads return `null` for paths NOT present in `mockData` — divergence from real prod rules where the engine reads the live database", "divergence: the simulator uses ONLY what's in `mockData`. Real rules engine reads from the live RTDB. Documented in `validated.ts` (\"simulation uses empty mockData, so cross-path rule lookups … will evaluate as false\")"] }, { "feature": "SingleRequestOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SingleRequestOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "size", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "size is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "SlidingWindow", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SlidingWindow is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "snapshot.child", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.child is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.exists", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.exists is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.getPriority", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.getPriority is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.hasChild", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.hasChild is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.hasChildren", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.hasChildren is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.isBoolean", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.isBoolean is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.isNumber", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.isNumber is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.isString", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.isString is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.parent", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.parent is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.val", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.val is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshotEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "snapshotEqual is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`snapshotEqual(a, b)`. Prod: returns a boolean — true on identity, false even for two fetches of the same data. Sandbox: **throws** (`unrecognized reference`) for sandbox-target snapshots instead of returning a boolean", "divergence, oracle-locked by `packages/conformance/observations/firestore/firestore-snapshotequal-structural.json` (`identity: true`, `twoFetchesSameData: false` — prod is identity-only, NOT structural; an earlier structural guess was corrected by the oracle). The sandbox routes both args through the ref-tagging path, which does not recognize sandbox `QuerySnapshot`s, so `snapshotEqual` throws rather than comparing. Both sides pinned in `oracle-conformance.test.ts`. Fix candidate: identity-compare sandbox snapshots before the ref-tagging dispatch."] }, { "feature": "SnapshotListenOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SnapshotListenOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SnapshotMetadata", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SnapshotMetadata is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "SnapshotOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SnapshotOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "snapshotState", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshotState is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SpeechConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SpeechConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "startAfter", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAfter is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAfter", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAfter is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAt", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAt", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAudioConversation", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "startAudioConversation is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Deferred with the rest of the Live API family — the browser audio helper rides the Live session seam once that lands."] }, { "feature": "StartAudioConversationOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StartAudioConversationOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "startChat", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startChat is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "StartChatParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StartChatParams is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "StartTemplateChatParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StartTemplateChatParams is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "StorageError", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StorageError is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "StorageErrorCode", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StorageErrorCode is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["StorageErrorCode and StringFormat are mirrored as TypeScript types but not as Firebase-compatible runtime enum objects, so value imports remain unavailable."] }, { "feature": "StorageObserver", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StorageObserver is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "StorageReference", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StorageReference is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "String", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "String is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "String", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "String is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.beginsWith", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.beginsWith is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.contains", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.contains is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.endsWith", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.endsWith is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.length", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.length is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Discrepancy: length is a String PROPERTY in the official language (`ref.val().length`, accessed as member, no call), but the validator lists it inside STRING_METHODS alongside the callable methods (rules/rtdb/grammar/validator.ts)."] }, { "feature": "string.lower", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.lower is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.matches", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.matches is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.matches", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.matches is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.matches", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.matches is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.replace", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.replace is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.replace", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.replace is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.size", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.split", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.split is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.split", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.split is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.toLowerCase", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.toLowerCase is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.toUpperCase", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.toUpperCase is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Discrepancy: toUpperCase() is in the official RTDB String method set, but the parser validator's ALL_KNOWN_METHODS (rules/rtdb/grammar/validator.ts) lists toLowerCase without toUpperCase — the parser would reject it as UNKNOWN_METHOD."] }, { "feature": "string.toUtf8", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "string.toUtf8 is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "string.trim", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.trim is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.upper", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.upper is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "stringEscapes", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "stringEscapes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "StringFormat", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StringFormat is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["StorageErrorCode and StringFormat are mirrored as TypeScript types but not as Firebase-compatible runtime enum objects, so value imports remain unavailable."] }, { "feature": "StringSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StringSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "subscribeToTopic", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "subscribeToTopic is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sum", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "sum is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "takeAuthMail", "surface": "auth", "importPaths": [], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "takeAuthMail is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TaskEvent", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskEvent is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TaskState", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskState is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TaskState", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskState is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TemplateChatSession", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateChatSession is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TemplateFunctionDeclaration", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateFunctionDeclaration is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TemplateFunctionDeclarationsTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateFunctionDeclarationsTool is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TemplateGenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateGenerativeModel is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Server-side templates are deferred, not out of scope — hosting template state is exactly the kind of server infrastructure the sandbox exists to model; the template store has not been built yet.", "Public type export is not mirrored."] }, { "feature": "TemplateImagenModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateImagenModel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Template-served Imagen models retire with the rest of Imagen (deprecated upstream, June 2026 shutdown); the template transport does not outlive the model family it serves.", "Public type export is not mirrored."] }, { "feature": "TemplateTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateTool is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TemplateToolConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateToolConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "terminate", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "terminate is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Genuinely tears the sandbox target down by calling `Sandbox.dispose()`, which tears down listener registries on the sandbox's environment (idempotent, doesn't touch data). This differs from the real SDK in scope: `dispose()` operates on the whole `Sandbox`, not a Firestore-only slice, so if `pyric/database`/`pyric/storage` share the same `Sandbox` their listener registries are torn down too", "`unit:firestore/terminate.test.ts`"] }, { "feature": "ternary", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ternary is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ternary", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ternary is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "text", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "text is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TextPart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TextPart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ThenableReference", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ThenableReference is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ThinkingConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ThinkingConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ThinkingLevel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ThinkingLevel is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "thoughtSummary", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "thoughtSummary is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Timestamp", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Timestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp", "surface": "firestore-rules", "importPaths": ["pyric/rules"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Timestamp", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Timestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.date", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.date is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.date", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.date is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.day", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.day is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.dayOfWeek", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.dayOfWeek is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.dayOfYear", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.dayOfYear is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.hours", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.hours is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.minutes", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.minutes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.month", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.month is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.nanos", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.nanos is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.seconds", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.seconds is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.time", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.time is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.toMillis", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.toMillis is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.value", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.value is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.value", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.value is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.year", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.year is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TokenMessage", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "TokenMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Tool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Tool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ToolConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ToolConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "TopicMessage", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "TopicMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "toSet", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "toSet is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TotpMultiFactorAssertion", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TotpMultiFactorAssertion is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TotpMultiFactorGenerator", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TotpMultiFactorGenerator is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "TotpMultiFactorInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TotpMultiFactorInfo is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TotpSecret", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TotpSecret is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "Transaction", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Transaction is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "TransactionOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TransactionOptions", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TransactionResult", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionResult is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes are mirrored structurally in Pyric's type surface but are not exported as runtime constructor values; runtime identity remains unbuilt."] }, { "feature": "Transcription", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Transcription is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TwitterAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "TwitterAuthProvider is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TypedSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TypedSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "union", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "union is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "UnionToIntersection", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UnionToIntersection is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "unlink", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "unlink is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Unsubscribe", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Unsubscribe is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Unsubscribe", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Unsubscribe is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Unsubscribe", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Unsubscribe is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Unsubscribe", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Unsubscribe is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "unsubscribeFromTopic", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "unsubscribeFromTopic is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "unsupportedBuiltins", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "unsupportedBuiltins is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "update", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "update is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Update path validation — overlapping paths (e.g. `'/a'` and `'/a/x'` in the same call) throws synchronously before any write", "upstream contract — needs targeted probe"] }, { "feature": "updateCurrentUser", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "updateCurrentUser is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "UpdateData", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UpdateData is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "updateDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "updateDoc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "updateEmail", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "updateEmail is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Changes the stored email (via the same path as `sandbox.updateUser`, rejecting `auth/email-already-in-use` / `auth/invalid-email`) and mutates the held `user` in place, so the next sign-in resolves against the new email. Leniency vs prod: the sandbox does NOT enforce `auth/requires-recent-login` and is not routed through `verifyBeforeUpdateEmail` (which the real SDK requires when email-enumeration protection is on)", "`unit:fruit-aliases.test.ts` — stored email changes; re-sign-in works with the new email, fails with the old", "In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "updateMetadata", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "updateMetadata is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`updateMetadata` with `undefined` field values preserves the prior value (does NOT clear it)", "divergence: prod accepts `null` to explicitly clear a field. Sandbox doesn't model `null`-clear (per `metadata.ts` doc comment). Documented; not probe-locked.", "`FullMetadata.md5Hash` populated on uploads", "divergence: sandbox does NOT compute `md5Hash`. Oracle-locked: `packages/conformance/observations/storage/storage-upload-then-getmetadata.json` confirms prod sets `md5Hash` (`hasMd5Hash: true` after a vanilla `uploadBytes`). Both sides pinned in `oracle-conformance.test.ts`. Aligning the sandbox is a one-spot fix in `upload.ts`'s `buildStoredMetadata`.", "`FullMetadata.ref` lazy population (prod populates lazily)", "not modeled in `pyric/storage` — `metadata.ts` explicitly omits `ref` from `FullMetadata`"] }, { "feature": "updatePassword", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "updatePassword is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Sets the stored password (validated for strength). The sandbox DOES store and verify passwords, so this is a real mutation: a subsequent `signInWithEmailAndPassword` with the new password succeeds and the old one throws `auth/wrong-password`. Leniency vs prod: no `auth/requires-recent-login` enforcement", "`unit:fruit-aliases.test.ts` — new password signs in, old password throws `auth/wrong-password`", "In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "updatePhoneNumber", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "updatePhoneNumber is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Phone number mutation is deferred alongside the rest of the phone-auth family — buildable via a mocked SMS/verification-code resolver, the same shape as the OAuth resolver."] }, { "feature": "updateProfile", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "updateProfile is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "uploadBytes", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "uploadBytes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "uploadBytesResumable", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "uploadBytesResumable is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["The UploadTask and observer surface is deferred — v1 shipped the one-shot uploadBytes driver first; the resumable/observable variant is unbuilt, not unbuildable.", "Exported by `firebase/storage`; returns an `UploadTask` with `pause()` / `resume()` / `cancel()`", "No `pyric/storage` implementation or behavioral probe exists; availability is classified by the owning surface contract.", "`task.on('state_changed', next, error, complete)` fires `next` with `{bytesTransferred, totalBytes, state}` snapshots", "not implemented", "`task.pause()` flips `state` to `'paused'`; `task.resume()` continues", "`task.cancel()` rejects the upload with `storage/canceled`"] }, { "feature": "UploadMetadata", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadMetadata is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "UploadResult", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "uploadString", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "uploadString is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Sandbox: `format='base64url'` (or any unknown format) rejected with `storage/invalid-format` naming the bad format. Prod: `base64url` is ACCEPTED (upload succeeds); a genuinely-unrecognized format throws `storage/unknown`", "divergence, both halves oracle-locked by `packages/conformance/observations/storage/storage-uploadstring-unknown-format.json`: prod accepts `base64url` (`base64urlOk: true`) and throws `storage/unknown` for an unrecognized format — not `storage/invalid-format`. The v1 sandbox ships only `raw`/`base64`/`data_url` (matches `StringFormat`) and throws `storage/invalid-format` for anything else (ST-B3 replaced the old mis-parse-as-data_url behavior). Both sides pinned in `oracle-conformance.test.ts`; sandbox code path documented in `upload.ts`'s `decodeString`. Implementing base64url decoding is still one line in `decodeString`."] }, { "feature": "UploadTask", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadTask is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "UploadTaskSnapshot", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadTaskSnapshot is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "URLContext", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "URLContext is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "URLContextMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "URLContextMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "URLContextTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "URLContextTool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "URLMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "URLMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "URLRetrievalStatus", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "URLRetrievalStatus is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "UsageMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UsageMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "useDeviceLanguage", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "useDeviceLanguage is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Accepted no-op — the sandbox has no device locale to read, so there is no language to set; accepted so init code that calls it compiles + runs", "`unit:fruit-aliases.test.ts` — resolves/returns without error"] }, { "feature": "User", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "User is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`user.metadata.creationTime` / `lastSignInTime`", "client `User.metadata` not exposed (AUTH-GAP); the admin record carries `createdAt`/`lastLoginAt` (ISO)", "`user.reload()` / `user.delete()` / `user.toJSON()` / `user.refreshToken` / `user.tenantId`", "not modeled by the sandbox; retained as an explicit unsupported behavior row rather than synthesized (AUTH-GAP)"] }, { "feature": "UserCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UserCredential is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "UserInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UserInfo is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "UserMetadata", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UserMetadata is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "UserProfile", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UserProfile is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "validatePassword", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "validatePassword is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "vector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "vector is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "VectorValue", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "VectorValue is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "verifyBeforeUpdateEmail", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "verifyBeforeUpdateEmail is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "verifyPasswordResetCode", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "verifyPasswordResetCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "VertexAIBackend", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "VertexAIBackend is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "VideoMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "VideoMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "VoiceConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "VoiceConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "waitForPendingWrites", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "waitForPendingWrites is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Resolves immediately in the sandbox mirror — every accepted write is already committed locally by the time its own promise resolves, so there are never writes still pending a server round-trip", "`unit:firestore/persistence-network.test.ts`"] }, { "feature": "WebAttribution", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WebAttribution is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "WebGroundingChunk", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WebGroundingChunk is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "WebpushConfig", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "WebpushConfig is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "WebpushFcmOptions", "surface": "messaging-admin", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "WebpushFcmOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "where", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "where is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "WhereFilterOp", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WhereFilterOp is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "withConverter", "surface": "firestore", "importPaths": [], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "withConverter is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "WithFieldValue", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WithFieldValue is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "writeBatch", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "writeBatch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "WriteBatch", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WriteBatch is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }];
|
|
1
|
+
export const CONFORMANCE_SUPPORTS = [{ "feature": "AbstractUserDataWriter", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AbstractUserDataWriter is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "ActionCodeInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ActionCodeInfo is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ActionCodeOperation", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ActionCodeOperation is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ActionCodeSettings", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ActionCodeSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ActionCodeURL", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ActionCodeURL is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "addDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "addDoc is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Auto-id format — prod uses 20-char base64-ish IDs; sandbox uses `pyric-admin`'s auto-id (also opaque, distinct format)", "divergence: IDs are opaque on both sides; format differs but consumer code never parses them. Oracle-locked: `packages/conformance/observations/firestore/firestore-adddoc-autoid-format.json` — prod auto-ids are 20 characters, all alphanumeric (mixed upper, lower, digits; no other chars). Example: `S3PJENMPOk4qcDXol8Ez`."] }, { "feature": "AdditionalUserInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AdditionalUserInfo is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AddPrefixToKeys", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AddPrefixToKeys is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AggregateField", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateField is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "aggregateFieldEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "aggregateFieldEqual is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Aggregate-field and aggregate-snapshot equality helpers are exported upstream but have no Pyric runtime implementation yet."] }, { "feature": "AggregateFieldType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateFieldType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AggregateQuerySnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateQuerySnapshot is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "aggregateQuerySnapshotEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "aggregateQuerySnapshotEqual is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Aggregate-field and aggregate-snapshot equality helpers are exported upstream but have no Pyric runtime implementation yet."] }, { "feature": "AggregateSpec", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateSpec is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AggregateSpecData", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateSpecData is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AggregateType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AI", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AI is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AIError", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AIError is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AIErrorCode", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AIErrorCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AIModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AIModel is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AIOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AIOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "allow", "surface": "firestore-rules", "importPaths": ["pyric/rules"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "allow is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "and", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "and is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AndroidConfig", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AndroidConfig is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AndroidFcmOptions", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AndroidFcmOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AndroidNotification", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AndroidNotification is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AnyOfSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AnyOfSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ApnsConfig", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ApnsConfig is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ApnsFcmOptions", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ApnsFcmOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ApnsPayload", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ApnsPayload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ApplicationVerifier", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ApplicationVerifier is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "applyActionCode", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "applyActionCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Aps", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Aps is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ApsAlert", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ApsAlert is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "arithmetic", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arithmetic is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "arrayRemove", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayRemove is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ArraySchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ArraySchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "arrayUnion", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayUnion is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "atoms", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "atoms is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AudioConversationController", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AudioConversationController is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AudioTranscriptionConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AudioTranscriptionConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "Auth", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Auth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "auth", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "auth is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "auth.token", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "auth.token is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "auth.uid", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "auth.uid is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "AuthCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AuthCredential is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AuthError", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AuthError is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "AuthErrorCodes", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AuthErrorCodes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AuthErrorMap", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AuthErrorMap is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AuthProvider is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AuthSettings", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AuthSettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "average", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "average is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Backend", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Backend is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "BackendType", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "BackendType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "BaseMessage", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "BaseMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "BaseParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "BaseParams is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "beforeAuthStateChanged", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "beforeAuthStateChanged is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`sandbox.setUser` (the sandbox-only test driver) BYPASSES the gate entirely — it is a raw identity force with no prod analog (same bypass it already has for provider enforcement / `signInProvider` tracking), so no registered `beforeAuthStateChanged` callback runs and none can block it.", "`unit:sandbox-before-auth-state-changed.test.ts` (\"sandbox.setUser test driver bypasses the gate\")", "Served-worker path (SharedWorker-backed auth in `@pyric/cli`): the worker owns the shared user pool and commits transitions on its own side of the port, so a page-local `beforeAuthStateChanged` registration can't actually gate a worker-driven sign-in. Rather than silently accept a callback that could never run, registering THROWS immediately (`auth/operation-not-supported-in-this-environment`) — same defensive pattern as `signInWithCredential` over the worker.", "`packages/cli/src/serve/worker/client.ts` (`beforeAuthStateChanged` throws `makeUnsupported`)"] }, { "feature": "BlockReason", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "BlockReason is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "BooleanSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "BooleanSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "browserCookiePersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "browserCookiePersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "browserLocalPersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "browserLocalPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "browserPopupRedirectResolver", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "browserPopupRedirectResolver is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "browserSessionPersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "browserSessionPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "Bytes", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Bytes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "bytes.size", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "bytes.size is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "bytes.toBase64", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "bytes.toBase64 is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "bytes.toHexString", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "bytes.toHexString is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "CACHE_SIZE_UNLIMITED", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CACHE_SIZE_UNLIMITED is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "cast.bool", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "cast.bool is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "cast.float", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "cast.float is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`int`/`float` division and type distinction (RULES-B5) in rules — truncating int÷int, float division stays float, div-by-zero denies, `is int`/`is float` distinct", "`oracle:rules-firestore-int-float-and-division` — production Firestore Rules Test API verdicts for corpus scenario \"int-float-and-division\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator narrows a float-valued payload field toward int on the float-payload case, unlike production which preserves the float type — pinned KNOWN_DIVERGENCE"] }, { "feature": "cast.int", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "cast.int is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`int`/`float` division and type distinction (RULES-B5) in rules — truncating int÷int, float division stays float, div-by-zero denies, `is int`/`is float` distinct", "`oracle:rules-firestore-int-float-and-division` — production Firestore Rules Test API verdicts for corpus scenario \"int-float-and-division\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator narrows a float-valued payload field toward int on the float-payload case, unlike production which preserves the float type — pinned KNOWN_DIVERGENCE"] }, { "feature": "cast.path", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "cast.path is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Path` wrapper, `path()` constructor, and `Path.bind()` (Item 5.4) in rules", "`oracle:rules-firestore-path-constructor-and-bind` — production Firestore Rules Test API verdicts for corpus scenario \"path-constructor-and-bind\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator treats `path()` as idempotent on an already-Path argument where production denies — pinned KNOWN_DIVERGENCE"] }, { "feature": "cast.string", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "cast.string is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ChatSession", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ChatSession is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ChatSessionBase", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ChatSessionBase is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "checkActionCode", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "checkActionCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "child", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "child is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["`child(ref, 'a/b')` joins a relative path, including embedded slashes", "upstream contract"] }, { "feature": "ChildUpdateFields", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ChildUpdateFields is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ChromeAdapter", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ChromeAdapter is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "Citation", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Citation is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "CitationMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CitationMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "clearIndexedDbPersistence", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "clearIndexedDbPersistence is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CodeExecutionResult", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CodeExecutionResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "CodeExecutionResultPart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CodeExecutionResultPart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "CodeExecutionTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CodeExecutionTool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "collection", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "collection is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "collectionGroup", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "collectionGroup is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CollectionReference", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CollectionReference is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "comparison", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "comparison is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "compileRtdbRules", "surface": "rtdb", "importPaths": ["pyric/rules/internal/rtdb"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "compileRtdbRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CompleteFn", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CompleteFn is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "compose", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "compose is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "concat", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "concat is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ConditionMessage", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ConditionMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Config", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Config is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ConfirmationResult", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ConfirmationResult is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "confirmPasswordReset", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "confirmPasswordReset is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "connectAuthEmulator", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "connectAuthEmulator is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "connectDatabaseEmulator", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "connectDatabaseEmulator is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["No-op on sandbox-target handles (the sandbox IS the local emulator)", "Phase 3", "A production target is intentionally absent; production code continues to use `connectDatabaseEmulator` from the unchanged `firebase/database` package"] }, { "feature": "connectFirestoreEmulator", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "connectFirestoreEmulator is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "connectStorageEmulator", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "connectStorageEmulator is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Exported by `firebase/storage`; reroutes a `FirebaseStorage` handle to a local emulator", "not implemented in `pyric/storage` — the sandbox IS the local-target alternative; emulator parity is out of scope per `index.ts`"] }, { "feature": "constructorAccess", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "constructorAccess is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Content", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Content is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ContextWindowCompressionConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ContextWindowCompressionConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "count", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "count is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Aggregates count documents server-side without paying read cost per doc in prod; sandbox computes locally (no cost model)", "divergence: cost behavior differs, observable shape identical. Oracle-locked: `packages/conformance/observations/firestore/firestore-count-aggregate-shape.json` — `getCountFromServer().data()` returns `{ count: <number> }` (single key, no other fields). Empty query returns `count: 0` (not `null`/`undefined`); seeded 3 docs returns `count: 3`; filtered query honors the `where` constraint (`count: 2`)."] }, { "feature": "countTokens", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "countTokens is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CountTokensRequest", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CountTokensRequest is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "CountTokensResponse", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CountTokensResponse is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "createUserWithEmailAndPassword", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "createUserWithEmailAndPassword is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CriticalSound", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "CriticalSound is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "crossTypeOperators", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "crossTypeOperators is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CustomErrorData", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CustomErrorData is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "CustomParameters", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "CustomParameters is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "data", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "data is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "Database", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Database is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes are mirrored structurally in Pyric's type surface but are not exported as runtime constructor values; runtime identity remains unbuilt."] }, { "feature": "DatabaseEvent", "surface": "functions-rtdb", "importPaths": [], "evidenceSlug": "functions-rtdb-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "DatabaseEvent is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DatabaseReference", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DatabaseReference is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "DataMessagePayload", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "DataMessagePayload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DataSnapshot", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DataSnapshot is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes are mirrored structurally in Pyric's type surface but are not exported as runtime constructor values; runtime identity remains unbuilt."] }, { "feature": "Date", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Date is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "debug", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "debug is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "debugErrorMap", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "debugErrorMap is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "deleteAllPersistentCacheIndexes", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "deleteAllPersistentCacheIndexes is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "deleteApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "deleteApp is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Production permits a different configuration after deletion; Pyric retains the runtime backend lock and rejects the reinitialization", "oracle: `app-registry-delete-reinitialize-different-config` (firebase 12.13.0) + replay pins `app/multiple-configs-not-supported`", "Served worker mode rejects page-local custom AnswerEngine objects; a model retained from a deleted app rejects, while an equal-config sibling model remains usable through its own app-scoped worker port", "`packages/cli/test/e2e/app-deletion.pw.ts` observes AI code `unsupported` for a custom engine, then exercises retained and sibling models through canonical served imports after deleting one app; `packages/pyric/src/ai/sandbox-plane.ts` guards every model operation. A credentialed production AI lifecycle capture is still needed"] }, { "feature": "deleteDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "deleteDoc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "deleteField", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "deleteField is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "deleteObject", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "deleteObject is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Sandbox: no-op on missing path (does NOT throw)", "divergence: sandbox is no-op via `persistence.ts`'s `delete`. Prod's `deleteObject` on a missing path throws `storage/object-not-found`. Oracle-locked: `packages/conformance/observations/storage/storage-delete-missing-throws.json` (`code: 'storage/object-not-found'`, `name: 'FirebaseError'` against blockingfun, fb-js-sdk 12.13.0). Both sides pinned in `oracle-conformance.test.ts`; documented in `download.ts`."] }, { "feature": "deleteToken", "surface": "messaging", "importPaths": ["pyric/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "deleteToken is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "deleteUser", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "deleteUser is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "denyByDefault", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "denyByDefault is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Dependencies", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Dependencies is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "diff", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "diff is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "difference", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "difference is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "disableNetwork", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "disableNetwork is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Resolve in the sandbox mirror — no network exists to toggle; writes issued while \"disabled\" still commit immediately (no offline queue is simulated)", "`unit:firestore/persistence-network.test.ts`"] }, { "feature": "disablePersistentCacheIndexAutoCreation", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "disablePersistentCacheIndexAutoCreation is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "doc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "doc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentChange", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentChange is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "DocumentChangeType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentChangeType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "DocumentData", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentData is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "documentId", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentId is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentReference", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentReference is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "DocumentSnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentSnapshot is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "documentSnapshotFromJSON", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "documentSnapshotFromJSON is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Snapshot JSON reconstruction and listener-resume helpers depend on serialized snapshot state that the sandbox has not modeled."] }, { "feature": "duration", "surface": "firestore-rules", "importPaths": ["pyric/rules"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Duration", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Duration is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "duration.abs", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration.abs is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "duration.nanos", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "duration.nanos is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "duration.seconds", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "duration.seconds is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "duration.time", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration.time is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "duration.value", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration.value is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "duration.value", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration.value is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["duration.value(magnitude, unit) — a duration the evaluator returns as milliseconds so it adds to / subtracts from the millis-modeled timestamps, enabling the freshness idiom `request.time < resource.timeCreated + duration.value(1, 'h')`."] }, { "feature": "EmailAuthCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "EmailAuthCredential is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "EmailAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "EmailAuthProvider is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Custom scopes / params / language code", "sandbox ignores; prod forwards"] }, { "feature": "EmulatorConfig", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "EmulatorMockTokenOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorMockTokenOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "EmulatorMockTokenOptions", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorMockTokenOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "EmulatorMockTokenOptions", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorMockTokenOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "enableIndexedDbPersistence", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "enableIndexedDbPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Resolves in the sandbox mirror — persistence is already the default; does not reject with `'failed-precondition'` when called after other ops (deliberately more lenient than the real SDK — no cache-init race to protect)", "`unit:firestore/persistence-network.test.ts`"] }, { "feature": "enableLogging", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "enableLogging is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`enableLogging(logger?, persistent?)` — accepted no-op: the sandbox has no modular-SDK-style logger to wire a level/sink into (it uses host-level `console` logging directly, matching `pyric/firestore`'s `setLogLevel`). Accepted so init code that calls it compiles + runs", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "enableMultiTabIndexedDbPersistence", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "enableMultiTabIndexedDbPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Resolves in the sandbox mirror — the SharedWorker path already is the one shared store every tab talks to", "`unit:firestore/persistence-network.test.ts`"] }, { "feature": "enableNetwork", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "enableNetwork is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Resolve in the sandbox mirror — no network exists to toggle; writes issued while \"disabled\" still commit immediately (no offline queue is simulated)", "`unit:firestore/persistence-network.test.ts`"] }, { "feature": "enablePersistentCacheIndexAutoCreation", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "enablePersistentCacheIndexAutoCreation is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "endAt", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "endAt", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "endBefore", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endBefore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "endBefore", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endBefore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "EnhancedGenerateContentResponse", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EnhancedGenerateContentResponse is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ensureFirestoreConfigured", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ensureFirestoreConfigured is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["The upstream package publicly exports these low-level configuration/write helpers, but Pyric does not expose equivalent runtime plumbing yet."] }, { "feature": "equalTo", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "equalTo is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ErrorCode", "surface": "messaging", "importPaths": [], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ErrorCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ErrorDetails", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ErrorDetails is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ErrorFn", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ErrorFn is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "evaluateStorageRules", "surface": "storage-rules", "importPaths": ["pyric/storage"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "evaluateStorageRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "EventType", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EventType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ExecutableCode", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ExecutableCode is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ExecutableCodePart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ExecutableCodePart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "executeWrite", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "executeWrite is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["The upstream package publicly exports these low-level configuration/write helpers, but Pyric does not expose equivalent runtime plumbing yet."] }, { "feature": "exists", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "exists is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`get()` of a missing document (RULES-B8) in rules — resource identity (`id`/`__name__`) exposure on a mocked/missing get() result", "`oracle:rules-firestore-get-missing-doc` — production Firestore Rules Test API verdicts for corpus scenario \"get-missing-doc\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator synthesizes a resource identity (`id`, `__name__`) for mocked get() results that production leaves absent, on 2 scenario cases — pinned KNOWN_DIVERGENCE"] }, { "feature": "existsAfter", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "existsAfter is available, has diverged fidelity, and is ineligible for assurance.", "caveats": ["`getAfter()`/`existsAfter()` (Item 7) in rules — post-write document identity and existence semantics", "`oracle:rules-firestore-get-after-and-exists-after` — production Firestore Rules Test API verdicts for corpus scenario \"get-after-and-exists-after\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator does not model the post-write document identity/existence production compares against on 4 scenario cases (getAfter target identity, existsAfter on create/delete, existsAfter over an unrelated mocked path) — pinned KNOWN_DIVERGENCE", "Discrepancy: the simulator's evaluator implements existsAfter() (simulator/evaluator.ts case 'existsAfter'), but the parser validator's BUILTIN_FUNCTIONS set (grammar/FirestoreValidator.ts) lists only get/exists/getAfter/debug — existsAfter is absent there, so the validator alone would not recognize it as a builtin."] }, { "feature": "ExperimentalLongPollingOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ExperimentalLongPollingOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "experimentalSetDeliveryMetricsExportedToBigQueryEnabled", "surface": "messaging", "importPaths": ["pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "experimentalSetDeliveryMetricsExportedToBigQueryEnabled is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FacebookAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FacebookAuthProvider is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FactorId", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FactorId is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "FcmOptions", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FcmOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FcmOptions", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FcmOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "fetchSignInMethodsForEmail", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "fetchSignInMethodsForEmail is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Deprecated upstream as a security retraction, not a cosmetic one: the shipped @firebase/auth declaration states it \"returns an empty list when Email Enumeration Protection is enabled, irrespective of the number of authentication methods available\", and that \"migrating off of this method is recommended as a security best-practice\". Enumeration protection is on by default, so against a modern project the production function always returns []. A mirror that reproduced the pre-deprecation behavior would be MORE capable than prod and would silently mislead agent code that branches on the result; a mirror that reproduced the post-deprecation behavior would be a no-op. Same criterion applied to Imagen in firebase/ai — an API whose production counterpart is retiring is out of scope, because mirroring it freezes dead behavior.", "Not implemented; disposition `auth.email-enumeration` owns the reviewed availability and rationale.", "disposition:auth.email-enumeration; the `auth-fetchsigninmethodsforemail-deprecated` capture is retained but inconclusive because the oracle project's Email/Password provider is disabled."] }, { "feature": "FieldPath", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FieldPath is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FieldValue", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FieldValue is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FileData", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FileData is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FileDataPart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FileDataPart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FinishReason", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FinishReason is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirebaseApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseApp is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirebaseAppSettings", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseAppSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirebaseError", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FirebaseError is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FirebaseMessagingError", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FirebaseMessagingError is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FirebaseOptions", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirebaseServerApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseServerApp is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "FirebaseServerAppSettings", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseServerAppSettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "FirebaseStorage", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirebaseStorage is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Firestore", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Firestore is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "firestore.exists", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "firestore.exists is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["Discrepancy: firestore.exists() — same standalone limitation as firestore.get(); resolved only with an injected FirestoreLookup, otherwise denies-with-reason."] }, { "feature": "firestore.get", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "firestore.get is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["Discrepancy: firestore.get() is in the official Storage rules language, but the standalone evaluator only resolves it when the enforcement layer injects a FirestoreLookup; the pure/test evaluator denies-with-reason (cross-document lookups are out of the standalone subset)."] }, { "feature": "FirestoreDataConverter", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreDataConverter is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirestoreError", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreError is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "FirestoreErrorCode", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreErrorCode is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "FirestoreLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreLocalCache is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "FirestoreSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "float", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "float is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "forceLongPolling", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "forceLongPolling is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`forceLongPolling()` — accepted no-op: transport selection is not applicable to the in-process/worker sandbox (it never opens a real socket). Accepted so init code that calls it compiles + runs", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "forceWebSockets", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "forceWebSockets is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`forceWebSockets()` — accepted no-op: transport selection is not applicable to the in-process/worker sandbox (see `forceLongPolling`)", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "FullMetadata", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FullMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "function", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "function is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "function", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "function is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FunctionCall", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionCall is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "functionCall", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "functionCall is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FunctionCallingConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionCallingConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FunctionCallingMode", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionCallingMode is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FunctionCallPart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionCallPart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "functionCalls", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "functionCalls is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FunctionDeclaration", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionDeclaration is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FunctionDeclarationsTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionDeclarationsTool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FunctionResponse", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionResponse is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FunctionResponsePart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FunctionResponsePart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "generateContent", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "generateContent is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "GenerateContentCandidate", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerateContentCandidate is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerateContentRequest", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerateContentRequest is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerateContentResponse", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerateContentResponse is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerateContentResult", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerateContentResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "generateContentStream", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "generateContentStream is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["The aggregated response carries the final chunk `finishReason` and `usageMetadata`", "`unit:streaming.test.ts` test `ai#stream-aggregate-final-meta` (aggregation semantics derived from the framing capture)"] }, { "feature": "GenerateContentStreamResult", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerateContentStreamResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerationConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerationConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerativeContentBlob", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerativeContentBlob is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GenerativeModel is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GeoPoint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "GeoPoint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "get", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "get is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`get()` of a missing document (RULES-B8) in rules — resource identity (`id`/`__name__`) exposure on a mocked/missing get() result", "`oracle:rules-firestore-get-missing-doc` — production Firestore Rules Test API verdicts for corpus scenario \"get-missing-doc\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator synthesizes a resource identity (`id`, `__name__`) for mocked get() results that production leaves absent, on 2 scenario cases — pinned KNOWN_DIVERGENCE"] }, { "feature": "get", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAdditionalUserInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getAdditionalUserInfo is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAfter", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "getAfter is available, has diverged fidelity, and is ineligible for assurance.", "caveats": ["`getAfter()`/`existsAfter()` (Item 7) in rules — post-write document identity and existence semantics", "`oracle:rules-firestore-get-after-and-exists-after` — production Firestore Rules Test API verdicts for corpus scenario \"get-after-and-exists-after\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator does not model the post-write document identity/existence production compares against on 4 scenario cases (getAfter target identity, existsAfter on create/delete, existsAfter over an unrelated mocked path) — pinned KNOWN_DIVERGENCE"] }, { "feature": "getAggregateFromServer", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getAggregateFromServer is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAI", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getAI is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAI", "surface": "app", "importPaths": [], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "getAI is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Served worker mode rejects page-local custom AnswerEngine objects; a model retained from a deleted app rejects, while an equal-config sibling model remains usable through its own app-scoped worker port", "`packages/cli/test/e2e/app-deletion.pw.ts` observes AI code `unsupported` for a custom engine, then exercises retained and sibling models through canonical served imports after deleting one app; `packages/pyric/src/ai/sandbox-plane.ts` guards every model operation. A credentialed production AI lifecycle capture is still needed"] }, { "feature": "getApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getApp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getApps", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getApps is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAuth", "surface": "app", "importPaths": [], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getAuth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getAuth", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "getAuth is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Without sandbox package swapping, canonical `firebase/auth` imports remain Firebase and never enter this mirror", "Direct mirror rejection is locked by `unit:package-resolution.test.ts`; an unswapped production-resolution observation is still needed"] }, { "feature": "getBlob", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getBlob is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getBytes", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getBytes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getCountFromServer", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getCountFromServer is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getDatabase", "surface": "app", "importPaths": [], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDatabase is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getDatabase", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "getDatabase is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["An in-module production target is intentionally absent; direct calls with a real `FirebaseApp` reject with package-resolution guidance", "`unit:modular.test.ts`; production remains the responsibility of the unchanged `firebase/database` package", "`getDatabase(ctx)` returns a tagged sandbox-target handle (frozen identity)", "Phase 3", "`getDatabase(sandbox)` returns a tagged sandbox-live handle (per-op identity)", "Inactive canonical `firebase/database` imports remain the upstream package; the mirror does not create tagged production targets", "package-resolution boundary; inactive RTDB canonical-import isolation is not yet claimed by this row", "Two `getDatabase(sandbox)` calls share state (same underlying `LocalEnvironment`)", "Handle dispatch by `TARGET_SYMBOL` brand — refs route to their owning target via a `refToTarget` WeakMap (mirror of firestore's pattern)"] }, { "feature": "getDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getDoc is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Rules denial throws `SandboxError('permission-denied', …)` on sandbox; `FirebaseError('permission-denied')` on prod", "divergence: same code, different class — both expose `.code === 'permission-denied'`. Oracle-locked: `packages/conformance/observations/firestore/firestore-rules-denied-error.json` — prod throws a `FirebaseError` (name + constructor name both `FirebaseError`), `.code === 'permission-denied'`, `.message === '7 PERMISSION_DENIED: Missing or insufficient permissions.'`, and the value is an `instanceof Error`."] }, { "feature": "getDocFromCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getDocFromCache is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Delegates to `getDoc` / `getDocs` in the sandbox mirror. Real Firebase THROWS `'unavailable'` here on a genuine cache miss; pyric never misses — the local store always has the answer (or a non-existent snapshot) — so it never throws for that reason", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "getDocFromServer", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDocFromServer is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getDocs", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getDocs is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Query-proof **prover scope is conservative, with full accounting and a fail-closed classifier** — user functions are inlined (nested helper-calling-helper and multi-parameter helpers included, matching production's rules-function inlining), and a `list` rule is provable only when its **entire** doc-dependence reduces to top-level AND-conjunct `resource.data.<field> == <literal>` equalities (with `request.auth.uid` pinned to the caller) each discharged by a `where(field, '==', value)` filter. Doc-dependence is decided by a fail-closed classifier: an expression counts as doc-independent only when every node is positively recognized as such — any touch of the `resource` root in any syntactic form (`resource.data`, `resource['data']`, slices, `resource.id`, path-literal segments feeding `exists`/`get` lookups) and any unrecognized node shape classifies doc-dependent. Any doc-dependent conjunct that is not a discharged equality — disjunctions over doc data, inequality/range predicates (`resource.data.score > 10` + `where('score','>',10)`), `in` / negated-`in` membership checks, `get(key, default)`, `keys().hasOnly(...)`, `is` type checks, nested-path predicates, data-keyed document lookups — makes the whole query conservatively DENY, even when every equality conjunct is discharged; production's prover may allow some of these. Divergence is deny-only: mixed equality + non-equality shapes are rejected up front rather than trusted to a residual evaluation that absent-tolerant predicates could pass vacuously.", "`unit:rules/simulator/query-proof.test.ts` (function-inlining provable cases; full-accounting rejections for mixed equality + `in`/`get`/`hasOnly`/range/`is` shapes in inline and helper form; fail-closed classifier probes: bracket-access `resource['data']`, `exists()` keyed by `resource.data` through path-literal segments, slice access, `resource.id`, and an unrecognized node shape), `unit:firestore/query-proof-enforcement.test.ts` (seeded end-to-end denials of the demonstrated attacks: forbidden-field absence check in member and bracket form, banned-owner `exists()` lookup, slice conjunct — each returning zero documents)"] }, { "feature": "getDocsFromCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getDocsFromCache is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Delegates to `getDoc` / `getDocs` in the sandbox mirror. Real Firebase THROWS `'unavailable'` here on a genuine cache miss; pyric never misses — the local store always has the answer (or a non-existent snapshot) — so it never throws for that reason", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "getDocsFromServer", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDocsFromServer is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getDownloadURL", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getDownloadURL is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Exported by `firebase/storage`; returns a token-signed HTTPS URL that fetches the blob", "Implemented with a two-sided pin. Production observation `storage-upload-bytes-roundtrip` records `urlIsHttps: true` and a byte-identical fetch. The sandbox oracle replay now calls the same public `getDownloadURL` + `fetch` path and proves byte-identical content, while explicitly asserting its URL starts with `blob:`. The client↔host integration proves SharedWorker mode creates that URL in the calling page after the rules-checked Blob crosses the port. The remaining divergence is URL identity and lifetime: the sandbox URL is a page-local snapshot, not token-signed HTTPS and not shareable outside that page."] }, { "feature": "getFirestore", "surface": "app", "importPaths": [], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getFirestore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getFirestore", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getFirestore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getGenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getGenerativeModel is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["A `models/`-prefixed name is accepted without double prefixing", "`unit:instances.test.ts` test `ai#model-name-prefixed` (no capture; normalization claim)"] }, { "feature": "getHistory", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getHistory is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`sendMessage` appends the user turn and the model turn; `getHistory()` returns the ordered `Content[]` with alternating roles", "`unit:chat-session.test.ts` test `ai#chat-history-threads` (no capture; history threading claim)", "Blocked prompts and blocked candidates are excluded from `getHistory()`", "`unit:chat-session.test.ts` test `ai#chat-history-excludes-blocked` (upstream JSDoc contract; exercised with a scripted blocked envelope)"] }, { "feature": "getIdToken", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getIdToken is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "getIdTokenResult", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getIdTokenResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "getImagenModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getImagenModel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior."] }, { "feature": "getLiveGenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getLiveGenerativeModel is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Live API is deferred, not out of scope — it is a bidirectional websocket protocol the sandbox can model with a scripted session engine, the same seam pattern the REST plane already uses; the work has not happened yet."] }, { "feature": "getMessaging", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getMessaging is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getMessaging", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getMessaging is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getMetadata", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "getMetadata is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`FullMetadata.md5Hash` populated on uploads", "divergence: sandbox does NOT compute `md5Hash`. Oracle-locked: `packages/conformance/observations/storage/storage-upload-then-getmetadata.json` confirms prod sets `md5Hash` (`hasMd5Hash: true` after a vanilla `uploadBytes`). Both sides pinned in `oracle-conformance.test.ts`. Aligning the sandbox is a one-spot fix in `upload.ts`'s `buildStoredMetadata`.", "`FullMetadata.ref` lazy population (prod populates lazily)", "not modeled in `pyric/storage` — `metadata.ts` explicitly omits `ref` from `FullMetadata`"] }, { "feature": "getMultiFactorResolver", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getMultiFactorResolver is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "getPersistentCacheIndexManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getPersistentCacheIndexManager is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "getPriority", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getPriority is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getRedirectResult", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getRedirectResult is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getStorage", "surface": "app", "importPaths": [], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getStorage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getStorage", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "getStorage is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`getStorage(app, bucketUrl?)` accepts Firebase's bucket argument; the sandbox remains bound to its configured single bucket", "Package resolution owns production selection. The sandbox accepts the canonical argument but does not model production multi-bucket routing; `unit:service.test.ts` pins the configured `pyric-default` bucket."] }, { "feature": "getStorageSandbox", "surface": "storage", "importPaths": [], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getStorageSandbox is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getStream", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getStream is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["The Node-stream variant is deferred — not part of the browser-shaped v1 scope yet, but not genuinely un-modelable.", "Exported by `firebase/storage` (Node entry only); returns a Node `Readable`", "No `pyric/storage` implementation or behavioral probe exists; availability is classified by the owning surface contract."] }, { "feature": "getTemplateGenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getTemplateGenerativeModel is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Server-side templates are deferred, not out of scope — hosting template state is exactly the kind of server infrastructure the sandbox exists to model; the template store has not been built yet."] }, { "feature": "getTemplateImagenModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "getTemplateImagenModel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Template-served Imagen models retire with the rest of Imagen (deprecated upstream, June 2026 shutdown); the template transport does not outlive the model family it serves."] }, { "feature": "getToken", "surface": "messaging", "importPaths": ["pyric/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getToken is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "GetTokenOptions", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GetTokenOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GithubAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GithubAuthProvider is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "goOffline", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "goOffline is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`goOffline(db)` — accepted no-op: there is no network connection in the local sandbox to toggle, so nothing is disconnected (we deliberately do NOT simulate a disconnect — pending writes, listeners, and `get()` keep working)", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "GoogleAIBackend", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleAIBackend is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GoogleAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "GoogleAuthProvider is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Custom scopes / params / language code", "sandbox ignores; prod forwards"] }, { "feature": "GoogleMaps", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleMaps is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GoogleMapsGroundingChunk", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleMapsGroundingChunk is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GoogleMapsTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleMapsTool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GoogleSearch", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleSearch is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GoogleSearchTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GoogleSearchTool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "goOnline", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "goOnline is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`goOnline(db)` — accepted no-op: there is no connection to reopen (see `goOffline`)", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "GroundingChunk", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GroundingChunk is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GroundingMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GroundingMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "GroundingSupport", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "GroundingSupport is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "HarmBlockMethod", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HarmBlockMethod is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "HarmBlockThreshold", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HarmBlockThreshold is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "HarmCategory", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HarmCategory is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "HarmProbability", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HarmProbability is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "HarmSeverity", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HarmSeverity is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "hashing.crc32", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "hashing.crc32 is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "hashing.crc32c", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "hashing.crc32c is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "hashing.md5", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "hashing.md5 is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "hashing.sha256", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "hashing.sha256 is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "HybridParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "HybridParams is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "IdTokenResult", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IdTokenResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ImageConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImageConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ImageConfigAspectRatio", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImageConfigAspectRatio is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ImageConfigImageSize", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImageConfigImageSize is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ImagenAspectRatio", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenAspectRatio is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior.", "Public type export is not mirrored."] }, { "feature": "ImagenGCSImage", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenGCSImage is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ImagenGenerationConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenGenerationConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ImagenGenerationResponse", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenGenerationResponse is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ImagenImageFormat", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenImageFormat is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior.", "Public type export is not mirrored."] }, { "feature": "ImagenInlineImage", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenInlineImage is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ImagenModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenModel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior.", "Public type export is not mirrored."] }, { "feature": "ImagenModelParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenModelParams is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ImagenPersonFilterLevel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenPersonFilterLevel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior.", "Public type export is not mirrored."] }, { "feature": "ImagenSafetyFilterLevel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenSafetyFilterLevel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Imagen is deprecated upstream; all Imagen models shut down as early as June 2026 (upstream 2.11.0 deprecation). Mirroring an API whose production counterpart is retiring would freeze dead behavior.", "Public type export is not mirrored."] }, { "feature": "ImagenSafetySettings", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ImagenSafetySettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "increment", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "increment is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "increment", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "increment is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Two concurrent `increment` calls interleave correctly (last-write-wins is NOT the contract — both deltas accumulate)", "hard to observe deterministically from a single client; documented contract"] }, { "feature": "Index", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Index is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "IndexConfiguration", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IndexConfiguration is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "indexedDBLocalPersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "indexedDBLocalPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "IndexField", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IndexField is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "indexOn", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "indexOn is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "InferenceMode", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "InferenceMode is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Hybrid/on-device inference is deferred, not out of scope — the sandbox runs in the browser and can model the on-device path through the answer-engine seam; the mode has not been wired yet.", "Public type export is not mirrored."] }, { "feature": "InferenceSource", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "InferenceSource is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Deferred with hybrid/on-device inference — the source marker is meaningful once the hybrid mode lands.", "Public type export is not mirrored."] }, { "feature": "initializeApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "initializeApp is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Production permits a differently configured named app; Pyric rejects it because one runtime currently owns exactly one sandbox backend", "oracle: `app-registry-initializeapp-named-different-config` (firebase 12.13.0) + replay pins `app/multiple-configs-not-supported`; `packages/cli/test/e2e/app-multi-app.pw.ts` proves the same lock is enforced by the authoritative SharedWorker across same-origin tabs, not only by one page registry", "Production permits a different configuration after deletion; Pyric retains the runtime backend lock and rejects the reinitialization", "oracle: `app-registry-delete-reinitialize-different-config` (firebase 12.13.0) + replay pins `app/multiple-configs-not-supported`"] }, { "feature": "initializeAuth", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "initializeAuth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "initializeFirestore", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "initializeFirestore is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Delegates to sandbox `getFirestore(app)` and returns the same handle. Accepts the `settings` argument (so the explicit-init pattern doesn't crash at import) but no-ops the cache/network settings — persistence is always on", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "initializeRecaptchaConfig", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "initializeRecaptchaConfig is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "initializeServerApp", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "initializeServerApp is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Server-app (SSR) initialization: a FirebaseServerApp carries per-request auth/heartbeat state with no decided sandbox mirror pattern yet. Deferred, not out of scope — tracked as an unsupported registry row (registry/app.ts app#15).", "Not implemented; disposition `app.server-app` owns the reviewed availability and rationale", "disposition:app.server-app"] }, { "feature": "InlineDataPart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "InlineDataPart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "inlineDataParts", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "inlineDataParts is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "inMemoryPersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "inMemoryPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "int", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "int is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "IntegerSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IntegerSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "intersection", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "intersection is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "isSignInWithEmailLink", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "isSignInWithEmailLink is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "isSupported", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "isSupported is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "IteratedDataSnapshot", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IteratedDataSnapshot is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "keys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "keys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Language", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Language is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "LanguageModelCreateCoreOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelCreateCoreOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelCreateOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelCreateOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelExpected", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelExpected is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelMessage", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelMessage is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelMessageContent", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelMessageContent is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelMessageContentValue", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelMessageContentValue is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelMessageRole", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelMessageRole is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelMessageType", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelMessageType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LanguageModelPromptOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LanguageModelPromptOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LatLng", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LatLng is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "latlng", "surface": "firestore-rules", "importPaths": ["pyric/rules"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "latlng is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "latlng.distance", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "latlng.distance is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "latlng.latitude", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "latlng.latitude is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "latlng.longitude", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "latlng.longitude is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "latlng.value", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "latlng.value is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "let", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "let is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "let", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "let is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "lexicalScope", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "lexicalScope is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "LightSettings", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "LightSettings is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limit", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limit is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limitToFirst", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limitToFirst is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limitToLast", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "limitToLast is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`limitToLast(n)` — trailing n in ordered result (requires `orderBy`). Sandbox: the no-orderBy precondition throws a `FirestoreError` with `.code === 'invalid-argument'` (FS-B16; pre-fix plain `Error`s). Prod: the same precondition throws `.code === 'unimplemented'`", "divergence, oracle-locked by `packages/conformance/observations/firestore/firestore-limittolast-preconditions.json`: prod's no-orderBy `limitToLast` throws code `unimplemented`, the sandbox throws `invalid-argument`. Trailing-window semantics with `orderBy` conform (observed `[\"b\"]` matches). Both sides pinned in `oracle-conformance.test.ts`. Cursor composition + descending: `unit:upstream-query-probes.test.ts`. Cursor/empty-snapshot precondition codes remain per `unit:sandbox-target.test.ts` + `unit:admin-compat/cursors.test.ts` (verified failing pre-fix)"] }, { "feature": "limitToLast", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limitToLast is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "linkWithCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "linkWithCredential is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "linkWithPhoneNumber", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "linkWithPhoneNumber is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "linkWithPopup", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "linkWithPopup is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "linkWithRedirect", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "linkWithRedirect is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "List", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "List is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "list is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Paginated listing is deferred — listAll covers the v1 scope; pagination needs a stable pageToken shape, which is unbuilt design work rather than a sandbox limitation.", "Exported by `firebase/storage`; accepts `{ maxResults, pageToken }`, returns a `ListResult` with `nextPageToken` set when more pages remain", "No paginated `list` implementation or behavioral probe exists; availability is classified by the owning surface contract. `ListResult.nextPageToken` remains optional for forward-compatible consumer code."] }, { "feature": "list.concat", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.concat is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.hasAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.hasAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.hasAny", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.hasAny is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.hasOnly", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.hasOnly is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.join", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.join is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.removeAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.removeAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.size", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "list.toSet", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "list.toSet is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "listAll", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "listAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ListenOptions", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListenOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ListenSource", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListenSource is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ListOptions", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "ListResult", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "LiveGenerationConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveGenerationConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveGenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveGenerativeModel is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Live API is deferred, not out of scope — it is a bidirectional websocket protocol the sandbox can model with a scripted session engine, the same seam pattern the REST plane already uses; the work has not happened yet.", "Public type export is not mirrored."] }, { "feature": "LiveModelParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveModelParams is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveResponseType", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveResponseType is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Live API is deferred, not out of scope — it is a bidirectional websocket protocol the sandbox can model with a scripted session engine, the same seam pattern the REST plane already uses; the work has not happened yet.", "Public type export is not mirrored."] }, { "feature": "LiveServerContent", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveServerContent is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveServerGoingAwayNotice", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveServerGoingAwayNotice is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveServerToolCall", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveServerToolCall is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveServerToolCallCancellation", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveServerToolCallCancellation is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LiveSession", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveSession is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Live API is deferred, not out of scope — it is a bidirectional websocket protocol the sandbox can model with a scripted session engine, the same seam pattern the REST plane already uses; the work has not happened yet.", "Public type export is not mirrored."] }, { "feature": "LiveSessionResumptionUpdate", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LiveSessionResumptionUpdate is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "loadBundle", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "loadBundle is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Bundle-loading depends on a protobuf packaging format not modeled in the sandbox yet — a data/parsing problem, not external infrastructure, so it is buildable rather than genuinely un-modelable."] }, { "feature": "LoadBundleTask", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LoadBundleTask is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Bundle-loading depends on a protobuf packaging format not modeled in the sandbox yet — a data/parsing problem, not external infrastructure, so it is buildable rather than genuinely un-modelable.", "Public type export is not mirrored."] }, { "feature": "LoadBundleTaskProgress", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LoadBundleTaskProgress is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "LogLevel", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LogLevel is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "map.diff", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.diff is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Map.get", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Map.get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.get", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.hasAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "map.hasAll is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "map.hasAny", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "map.hasAny is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "map.hasOnly", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "map.hasOnly is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "map.keys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.keys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.size", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Map.values", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Map.values is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.values", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.values is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapdiff.addedKeys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapdiff.addedKeys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapdiff.affectedKeys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapdiff.affectedKeys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapdiff.changedKeys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapdiff.changedKeys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapdiff.removedKeys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapdiff.removedKeys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapdiff.unchangedKeys", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapdiff.unchangedKeys is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "mapMembership", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "mapMembership is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "matches", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "matches is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "matches", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "matches is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "matches", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "matches is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.abs", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.abs is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.ceil", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.ceil is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.floor", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.floor is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.isInfinite", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "math.isInfinite is available, has diverged fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "math.isNaN", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.isNaN is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.pow", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.pow is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.round", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.round is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "math.sqrt", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "math.sqrt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MemoryCacheSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryCacheSettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "memoryEagerGarbageCollector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "memoryEagerGarbageCollector is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "MemoryEagerGarbageCollector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryEagerGarbageCollector is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MemoryGarbageCollector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryGarbageCollector is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "memoryLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "memoryLocalCache is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "MemoryLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryLocalCache is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "memoryLruGarbageCollector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "memoryLruGarbageCollector is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "MemoryLruGarbageCollector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryLruGarbageCollector is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "Message", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Message is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MessagePayload", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "MessagePayload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Messaging", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Messaging is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Messaging", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Messaging is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "messaging", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "messaging is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MessagingClientErrorCode", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "MessagingClientErrorCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MessagingOptions", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "MessagingOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MessagingPayload", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "MessagingPayload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "MessagingTopicManagementResponse", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "MessagingTopicManagementResponse is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "missingFieldAccess", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "missingFieldAccess is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Modality", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Modality is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ModalityTokenCount", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ModalityTokenCount is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ModelParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ModelParams is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "multiFactor", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "multiFactor is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "MultiFactorAssertion", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorAssertion is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MultiFactorError", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorError is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MultiFactorInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorInfo is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MultiFactorResolver", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorResolver is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MultiFactorSession", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorSession is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "MultiFactorUser", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MultiFactorUser is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "namedQuery", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "namedQuery is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Bundle-loading depends on a protobuf packaging format not modeled in the sandbox yet — a data/parsing problem, not external infrastructure, so it is buildable rather than genuinely un-modelable."] }, { "feature": "NestedUpdateFields", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NestedUpdateFields is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "newData", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "newData is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "NextFn", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NextFn is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "NextFn", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NextFn is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "NextOrObserver", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NextOrObserver is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "Notification", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Notification is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "NotificationMessagePayload", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "NotificationMessagePayload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "NotificationPayload", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NotificationPayload is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "now", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "now is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "NumberSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NumberSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "OAuthCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "OAuthCredential is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "OAuthCredentialOptions", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OAuthCredentialOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "OAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OAuthProvider is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ObjectSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ObjectSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ObjectSchemaRequest", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ObjectSchemaRequest is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Observer", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Observer is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "off", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "off is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["When the same callback is registered more than once, each `off(ref, eventType, callback)` removes one registration without orphaning the others", "Pyric behavior is locked by `packages/pyric/test/app/multi-app-listener-auth.test.ts`; a production duplicate-registration oracle capture is still needed"] }, { "feature": "onAuthStateChanged", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onAuthStateChanged is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onBackgroundMessage", "surface": "messaging", "importPaths": ["pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onBackgroundMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onChildAdded", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "onChildAdded is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["**Divergence (DB-B12, honest doc):** the onChild* callbacks do NOT receive the `previousChildName` second argument; `onValue`/`onChild*` do NOT accept a `cancelCallback`; `onChildAdded`/`Changed`/`Removed`/`Moved` accept only plain refs (not `Query`); `child_moved` never fires (ordered-query move detection unmodeled). These listener-surface holes are out of scope for the current phase — consumers needing them use `firebase/database` directly.", "divergence documented; partial coverage: `{ onlyOnce }` IS implemented (M74)."] }, { "feature": "onChildChanged", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onChildChanged is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onChildMoved", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "onChildMoved is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`onChildMoved` under an ordered query. Prod: fires when a child's `orderByChild`/`orderByValue` priority changes — emitted only on ordered queries. Sandbox: **never fires on reorder** — `onChildMoved` supports the plain-ref (no-fire) case only; the ordered-query overload is unimplemented", "divergence, oracle-locked by `packages/conformance/observations/rtdb-modular/rtdb-modular-onchildmoved-with-orderby.json`: prod observed `firedOnMove: 1` under `query(ref, orderByChild('priority'))` after bumping a child's priority to a new sort position; the sandbox fires 0 on reorder. Partial alignment landed: all `onChild*` now ACCEPT a `Query` (previously threw a misleading `unrecognized reference` TypeError) with window-aware `child_added`/`child_changed`/`child_removed` diffs (`src/database/sandbox/backend.ts`); the two hold-lifting captures now exist: `rtdb-modular-onchildmoved-previouschildname-sequencing` pins prev-name sequencing (end/middle/front reorders yield prev k3/k2/null, no initial replay) and `rtdb-modular-childchanged-cofire-with-childmoved` pins co-fire semantics (a reorder fires BOTH `child_changed` and `child_moved`; a non-ordered-field change fires neither moved; prod fires `child_moved` on an ordered-field value change EVEN WHEN RANK IS UNCHANGED). Implementation of ordered `child_moved` is unblocked. Both sides pinned in `modular/oracle-conformance.test.ts` and `modular/sandbox-child-events.test.ts`. Sandbox Tier 2 locks the plain-ref no-fire case (M46)."] }, { "feature": "onChildRemoved", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onChildRemoved is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "OnDeviceParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OnDeviceParams is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "OnDisconnect", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OnDisconnect is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["onDisconnect requires a live connection lifecycle the in-memory sandbox has no equivalent for today — buildable as an honest no-op or inert token like the connection-management APIs, not genuinely un-modelable.", "Public type export is not mirrored."] }, { "feature": "onDisconnect", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "onDisconnect is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["onDisconnect requires a live connection lifecycle the in-memory sandbox has no equivalent for today — buildable as an honest no-op or inert token like the connection-management APIs, not genuinely un-modelable."] }, { "feature": "onIdTokenChanged", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onIdTokenChanged is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onLog", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onLog is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onMessage", "surface": "messaging", "importPaths": ["pyric/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onSnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onSnapshot is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onSnapshotResume", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "onSnapshotResume is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Snapshot JSON reconstruction and listener-resume helpers depend on serialized snapshot state that the sandbox has not modeled."] }, { "feature": "onSnapshotsInSync", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "onSnapshotsInSync is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Fires the callback once the current snapshot-delivery microtask queue settles — the closest honest approximation of \"every active listener has delivered its latest state\" available without a true cross-listener sync signal. Not scoped to real server round-trips like the real SDK's guarantee; scoped to local delivery only", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "onValue", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "onValue is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["**Divergence (DB-B12, honest doc):** the onChild* callbacks do NOT receive the `previousChildName` second argument; `onValue`/`onChild*` do NOT accept a `cancelCallback`; `onChildAdded`/`Changed`/`Removed`/`Moved` accept only plain refs (not `Query`); `child_moved` never fires (ordered-query move detection unmodeled). These listener-surface holes are out of scope for the current phase — consumers needing them use `firebase/database` directly.", "divergence documented; partial coverage: `{ onlyOnce }` IS implemented (M74).", "The returned value from `onValue(ref, cb)` is the unsubscribe function (NOT an object); calling it removes the listener", "upstream contract — locked indirectly by #131"] }, { "feature": "onValueCreated", "surface": "functions-rtdb", "importPaths": [], "evidenceSlug": "functions-rtdb-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "onValueCreated is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["A handler that throws or returns a rejected Promise is reported by the managed runtime; with retry disabled, the Eventarc request can still be acknowledged with HTTP 200.", "oracle: `functions-rtdb-onvaluecreated-failed-execution.json`; Pyric observes the rejected handler and marker, but has no Eventarc HTTP request seam with which to replay the captured 200 acknowledgement."] }, { "feature": "OperationType", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "OperationType is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.add", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.add is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.add", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.add is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.add", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.add is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.and", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.and is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.and", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.and is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.and", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.and is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.div", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "operator.div is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`int`/`float` division and type distinction (RULES-B5) in rules — truncating int÷int, float division stays float, div-by-zero denies, `is int`/`is float` distinct", "`oracle:rules-firestore-int-float-and-division` — production Firestore Rules Test API verdicts for corpus scenario \"int-float-and-division\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator narrows a float-valued payload field toward int on the float-payload case, unlike production which preserves the float type — pinned KNOWN_DIVERGENCE"] }, { "feature": "operator.div", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.div is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.div", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.div is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.eq", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.eq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.eq", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.eq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.gt", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.gt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.gt", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.gt is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.gt", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.gt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.gte", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.gte is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.gte", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.gte is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.gte", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.gte is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.in", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.in is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.in", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.in is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.index", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.index is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.index", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.index is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.index", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.index is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.is", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "operator.is is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`int`/`float` division and type distinction (RULES-B5) in rules — truncating int÷int, float division stays float, div-by-zero denies, `is int`/`is float` distinct", "`oracle:rules-firestore-int-float-and-division` — production Firestore Rules Test API verdicts for corpus scenario \"int-float-and-division\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator narrows a float-valued payload field toward int on the float-payload case, unlike production which preserves the float type — pinned KNOWN_DIVERGENCE"] }, { "feature": "operator.is", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.is is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.looseEq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.looseEq is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.looseNeq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.looseNeq is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.lt", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.lt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.lt", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.lt is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.lt", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.lt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.lte", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.lte is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.lte", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.lte is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.lte", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.lte is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.member", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.member is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.member", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.member is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.member", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.member is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.mod", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.mod is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.mod", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.mod is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.mod", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.mod is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.mul", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.mul is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.mul", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.mul is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.mul", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.mul is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.neg", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.neg is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.neq", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.neq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.neq", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.neq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.not", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.not is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.not", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.not is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.not", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.not is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.or", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.or is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.or", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.or is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.or", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.or is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.slice", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "operator.slice is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Range-slice `[i:j]` syntax for `List` and `String` (Item 4) in rules", "`oracle:rules-firestore-range-slice-list-and-string` — production Firestore Rules Test API verdicts for corpus scenario \"range-slice-list-and-string\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator clamps an out-of-bounds slice end to the collection length on both the list and string OOB-slice cases; production denies — pinned KNOWN_DIVERGENCE"] }, { "feature": "operator.slice", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.slice is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.strictEq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.strictEq is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.strictNeq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.strictNeq is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.sub", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.sub is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.sub", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.sub is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.sub", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.sub is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.ternary", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.ternary is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.ternary", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.ternary is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.ternary", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.ternary is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "operator.unary-minus", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.unary-minus is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.unary-minus", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "operator.unary-minus is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "or", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "or is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "orderBy", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderBy is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "orderByChild", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderByChild is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "OrderByDirection", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OrderByDirection is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "orderByKey", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderByKey is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "orderByPriority", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "orderByPriority is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Firebase's legacy priority ordering system is absent; the sandbox exposes orderByChild/Key/Value only today. Priority ordering is data-modelable as a sort key, so this is revisitable scope rather than a hard sandbox limitation."] }, { "feature": "orderByValue", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderByValue is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Outcome", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Outcome is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "parent", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "parent is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["`ref(db, path)` returns a tagged `DatabaseReference` carrying `key`, `parent`, `root`, `toString()`", "upstream `firebase/database` contract", "`ref(db)` with no path returns the root ref (`key === null`, `parent === null`)", "upstream contract", "`ref.parent` is `null` at root, otherwise the parent ref"] }, { "feature": "parseActionCodeURL", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "parseActionCodeURL is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ParsedToken", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ParsedToken is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "parseLink", "surface": "auth", "importPaths": [], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "parseLink is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "parseStorageRules", "surface": "storage-rules", "importPaths": ["pyric/storage"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "parseStorageRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Part", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Part is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PartialWithFieldValue", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PartialWithFieldValue is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PasswordPolicy", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PasswordPolicy is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PasswordValidationStatus", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PasswordValidationStatus is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "path.bind", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "path.bind is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Path` wrapper, `path()` constructor, and `Path.bind()` (Item 5.4) in rules", "`oracle:rules-firestore-path-constructor-and-bind` — production Firestore Rules Test API verdicts for corpus scenario \"path-constructor-and-bind\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator treats `path()` as idempotent on an already-Path argument where production denies — pinned KNOWN_DIVERGENCE"] }, { "feature": "pathParameters", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "pathParameters is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "path-variable", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "path-variable is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "path-variable", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "path-variable is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "path-variable", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "path-variable is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "pathVariables", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "pathVariables is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Persistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Persistence is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PersistenceSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistenceSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PersistentCacheIndexManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentCacheIndexManager is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope.", "Public type export is not mirrored."] }, { "feature": "PersistentCacheSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentCacheSettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "persistentLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "persistentLocalCache is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "PersistentLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentLocalCache is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "persistentMultipleTabManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "persistentMultipleTabManager is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "PersistentMultipleTabManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentMultipleTabManager is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "persistentSingleTabManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "persistentSingleTabManager is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Config token accepted, inert — each returns a small tagged object so identity/usage doesn't crash. Persistence is the sandbox default; there is no cache tier left to configure", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "PersistentSingleTabManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentSingleTabManager is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PersistentSingleTabManagerSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentSingleTabManagerSettings is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PersistentTabManager", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentTabManager is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PhoneAuthCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneAuthCredential is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "PhoneAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneAuthProvider is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "PhoneInfoOptions", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneInfoOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PhoneMultiFactorAssertion", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneMultiFactorAssertion is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PhoneMultiFactorEnrollInfoOptions", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneMultiFactorEnrollInfoOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PhoneMultiFactorGenerator", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneMultiFactorGenerator is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "PhoneMultiFactorInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneMultiFactorInfo is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PhoneMultiFactorSignInInfoOptions", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneMultiFactorSignInInfoOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "PhoneSingleFactorInfoOptions", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PhoneSingleFactorInfoOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "policies", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "policies is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "PopupRedirectResolver", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PopupRedirectResolver is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "POSSIBLE_ROLES", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "POSSIBLE_ROLES is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "PrebuiltVoiceConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PrebuiltVoiceConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "Primitive", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Primitive is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "prodErrorMap", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "prodErrorMap is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Inert configuration tokens, accepted so the idiomatic `initializeAuth(app, { persistence: indexedDBLocalPersistence })` and `setPersistence(auth, browserCookiePersistence)` compile, run, and behave identically. The `.type` discriminant matches upstream exactly (`NONE` / `SESSION` / `LOCAL` / `LOCAL` / `COOKIE`) because consumer code branches on it. `browserPopupRedirectResolver` is accepted and ignored — the sandbox has its own first-class pluggable equivalent (`sandbox.setAuthFlowResolver`). `prodErrorMap` is accepted and DELIBERATELY not honored: installing it upstream strips error messages, and doing that in a sandbox whose purpose is to tell a developer what went wrong would be actively hostile.", "In an in-memory sandbox the persistence CHOICE has no observable consequence, so accepting the token and recording the mode is the honest behavior — the same inert-token pattern `pyric/firestore` uses for its cache-factory tokens. `unit:types.test.ts` + `unit:sandbox-email-link.test.ts` cover the exports. Oracle caveat recorded on auth#172: the `persistenceTypes` block of `auth-mechanical-surface-constants` reports `NONE` for every token including `browserLocalPersistence` — a Node-build stub artifact, not the browser contract, so the `.type` values here follow the documented `Persistence.type` union instead."] }, { "feature": "PromptFeedback", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PromptFeedback is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "providerData", "surface": "auth", "importPaths": [], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "providerData is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ProviderId", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ProviderId is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "push", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "push is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "pushKey", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "pushKey is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "query", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "query is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Index validation against `firestore.indexes.json` — sandbox uses `LocalEnvironment`'s lint pass; prod has its own server-side validation", "divergence: sandbox can mis-pass a query that prod would reject at the server with `failed-precondition` if no index exists"] }, { "feature": "Query", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Query is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "query", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "query is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["**Divergence (DB-B12, honest doc):** the onChild* callbacks do NOT receive the `previousChildName` second argument; `onValue`/`onChild*` do NOT accept a `cancelCallback`; `onChildAdded`/`Changed`/`Removed`/`Moved` accept only plain refs (not `Query`); `child_moved` never fires (ordered-query move detection unmodeled). These listener-surface holes are out of scope for the current phase — consumers needing them use `firebase/database` directly.", "divergence documented; partial coverage: `{ onlyOnce }` IS implemented (M74)."] }, { "feature": "Query", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Query is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryCompositeFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryCompositeFilterConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "QueryConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "QueryConstraint", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes are mirrored structurally in Pyric's type surface but are not exported as runtime constructor values; runtime identity remains unbuilt."] }, { "feature": "QueryConstraintType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraintType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "QueryConstraintType", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraintType is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "QueryDocumentSnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryDocumentSnapshot is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "QueryEndAtConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryEndAtConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "queryEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "queryEqual is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`queryEqual(a, b)` is identity-only in the sandbox mirror; production's untouched Firebase SDK uses structural equality", "divergence: sandbox does identity-only; prod does deep structural. Oracle-locked: `packages/conformance/observations/firestore/firestore-queryequal-structural.json` — two independently-built queries with the same `where('x','==',1)` constraint compare equal in prod (`sameQueryBuiltTwice: true`), confirming structural semantics. Common use case (caching the same returned query) works on both."] }, { "feature": "QueryFieldFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryFieldFilterConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "QueryFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryFilterConstraint is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "QueryLimitConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryLimitConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "QueryNonFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryNonFilterConstraint is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "QueryOrderByConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryOrderByConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "QuerySnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QuerySnapshot is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "querySnapshotFromJSON", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "querySnapshotFromJSON is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Snapshot JSON reconstruction and listener-resume helpers depend on serialized snapshot state that the sandbox has not modeled."] }, { "feature": "QueryStartAtConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryStartAtConstraint is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "ReactNativeAsyncStorage", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ReactNativeAsyncStorage is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "reauthenticateWithCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "reauthenticateWithCredential is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "reauthenticateWithPhoneNumber", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "reauthenticateWithPhoneNumber is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "reauthenticateWithPopup", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "reauthenticateWithPopup is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "reauthenticateWithRedirect", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "reauthenticateWithRedirect is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "RecaptchaParameters", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "RecaptchaParameters is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "RecaptchaVerifier", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "RecaptchaVerifier is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "recursiveMatch", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "recursiveMatch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "recursiveWildcard", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "recursiveWildcard is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ref", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "ref is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`ref(db, path)` returns a tagged `DatabaseReference` carrying `key`, `parent`, `root`, `toString()`", "upstream `firebase/database` contract", "`ref(db)` with no path returns the root ref (`key === null`, `parent === null`)", "upstream contract", "`child(ref, 'a/b')` joins a relative path, including embedded slashes", "`ref.parent` is `null` at root, otherwise the parent ref", "`ref.key` is the final path segment, `null` for root", "Unknown ref (not produced by this package) → `TypeError` in shim ops", "Phase 3"] }, { "feature": "ref", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ref is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "refEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "refEqual is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "refFromURL", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "refFromURL is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`refFromURL(db, url)` — real alias: parses the path out of the absolute database URL and delegates to `ref(db, path)`, so the returned ref resolves + reads exactly like `ref(db, path)`. Divergence: the sandbox is single-database with no host/namespace, so the URL's HOST is NOT validated against the handle (the real SDK throws if the host doesn't match the db's namespace); only the path is honored", "`unit:modular/fruit-aliases.test.ts`"] }, { "feature": "registerVersion", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "registerVersion is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "reload", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "reload is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "remove", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "remove is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "removeAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "removeAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "replace", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "replace is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth.token", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth.token is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth.token", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth.token is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth.uid", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth.uid is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.auth.uid", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.auth.uid is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.method", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.method is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.method", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.method is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.path", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.path is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.path", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.path is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.query", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "request.query is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`request.path`/`request.query`/`resource.id`/`resource.__name__` globals (Item 6) in rules", "`oracle:rules-firestore-globals-request-path-and-resource-id` — production Firestore Rules Test API verdicts for corpus scenario \"globals-request-path-and-resource-id\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator models `request.query` as an empty map on the empty-query case where production denies the equivalent comparison — pinned KNOWN_DIVERGENCE. Contamination scope is `request.query` ALONE: the scenario's `request.path` cases conform, and its `resource.id`/`resource.__name__` cases conform because they run on a `create` (where `resource` is null pre-write). Resource identity on an EXISTING document is scoped to firestore-rules#183."] }, { "feature": "request.resource", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.resource", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.resource.contentType", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource.contentType is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.resource.data", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource.data is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.resource.id", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "request.resource.id is available, has diverged fidelity, and is ineligible for assurance.", "caveats": ["request.resource.id is in the official language, but production's Rules Test API does not populate it: request.resource is built from the supplied payload alone, so `.id` is an absent property and reading it errors → DENY. The simulator matches — its handler builds request.resource as `{ data }` only (simulator/handler.ts), so the evaluator's absent-key error yields production's verdict. The same now holds for the existing document: `resource` carries `data` ONLY, no synthesized `id`/`__name__` (RULES-B12, firestore-rules#183)."] }, { "feature": "request.resource.metadata", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource.metadata is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.resource.size", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.resource.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.time", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.time is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "request.time", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "request.time is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "RequestOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "RequestOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "requiredFields", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "requiredFields is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "resource is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`resource` on a create where no object exists: the create-if-absent guard `allow create: if resource == null`", "divergence, over-permissive (the evaluator ALLOWs where production DENIEs, the highest-severity direction defined in `docs/storage/reference/conformance-gaps.md`). `oracle:rules-storage-verbs-umbrella-granular`, case \"create allowed when object does not exist (resource == null)\": production DENIES. Production raises a null value error on a `resource` reference in a create where no object exists, and the errored expression denies, so a `create` rule guarded by `resource == null` never allows. The evaluator models `resource` as null on create, evaluates the comparison as documented, and ALLOWS. Live-probed against production before pinning with both an omitted `resource` field and an explicit null, which denied identically, ruling out a capture-harness wire-shape bug. Both sides pinned in `unit:storage/rules-oracle-conformance.test.ts` KNOWN_DIVERGENCES. Same error-value class as the Firestore `resource` identity on a missing document."] }, { "feature": "resource.bucket", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.bucket is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["resource.bucket is the bucket the object resides in, sourced from the persisted record. Production returns it as a literal on the resource map; an absent bucket denies."] }, { "feature": "resource.contentType", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.contentType is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource.data", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.data is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource.id", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "resource.id is available, has diverged fidelity, and is ineligible for assurance.", "caveats": ["`get()` of a missing document (RULES-B8) in rules — resource identity (`id`/`__name__`) exposure on a mocked/missing get() result", "`oracle:rules-firestore-get-missing-doc` — production Firestore Rules Test API verdicts for corpus scenario \"get-missing-doc\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator synthesizes a resource identity (`id`, `__name__`) for mocked get() results that production leaves absent, on 2 scenario cases — pinned KNOWN_DIVERGENCE"] }, { "feature": "resource.metadata", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.metadata is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource.__name__", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "diverged", "assurance": "ineligible", "summary": "resource.__name__ is available, has diverged fidelity, and is ineligible for assurance.", "caveats": ["`get()` of a missing document (RULES-B8) in rules — resource identity (`id`/`__name__`) exposure on a mocked/missing get() result", "`oracle:rules-firestore-get-missing-doc` — production Firestore Rules Test API verdicts for corpus scenario \"get-missing-doc\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator synthesizes a resource identity (`id`, `__name__`) for mocked get() results that production leaves absent, on 2 scenario cases — pinned KNOWN_DIVERGENCE"] }, { "feature": "resource.name", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.name is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["resource.name is the object's FULL path within the bucket (GCS object-name convention, e.g. `uploads/pic.png`), sourced from the persisted record's fullPath — NOT the client SDK's last-path-segment name. Production returns it as a literal on the resource map; an absent name is an evaluation error that denies."] }, { "feature": "resource.size", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "resource.timeCreated", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.timeCreated is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["resource.timeCreated is a timestamp (ISO-8601 in the persisted record; the evaluator compares it as epoch millis against request.time). Production rejects an int in a timestamp comparison; an absent timeCreated denies."] }, { "feature": "resource.updated", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.updated is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["resource.updated is the object's last-update timestamp. The field is `updated` — the Storage rules language has NO `resource.timeUpdated` (live-probed: `timeUpdated` reads as an absent property). Renamed from the earlier mis-identified `storage.binding.resource.timeUpdated`."] }, { "feature": "ResponseModality", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ResponseModality is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "RetrievalConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "RetrievalConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "RetrievedContextAttribution", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "RetrievedContextAttribution is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "revokeAccessToken", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "revokeAccessToken is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Accepted no-op. In production this reaches OUTSIDE Firebase entirely — it tells the identity provider (in practice Apple) to revoke an OAuth access token, which is a call landing on Apple's servers. There is no external IdP behind a sandbox sign-in, so there is no token out there to revoke and nothing this call could truthfully do. It resolves (so the account-deletion flow Apple requires an app to ship runs end to end against the sandbox) and changes no sandbox state (because claiming otherwise would be a lie).", "`unit:types.test.ts` — the export resolves. Deliberately not oracle-probed: a successful probe would revoke a real token at a real IdP, which is a side effect on someone else's system that a conformance run has no business causing."] }, { "feature": "Role", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Role is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "root", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "root is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["`ref(db, path)` returns a tagged `DatabaseReference` carrying `key`, `parent`, `root`, `toString()`", "upstream `firebase/database` contract", "`ref(db)` with no path returns the root ref (`key === null`, `parent === null`)", "upstream contract", "`ref.parent` is `null` at root, otherwise the parent ref", "`ref.key` is the final path segment, `null` for root"] }, { "feature": "root", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "root is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-create", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-create is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-create", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-create is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-delete", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-delete is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-delete", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-delete is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-get", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-get", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-list", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-list is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-list", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-list is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-read", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-read is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-read", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-read is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-update", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-update is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-update", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-update is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-write", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-write is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.allow-write", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.allow-write is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.function", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.function is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.function", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.function is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.import", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.import is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Discrepancy: `import { fn } from 'module'` under `rules_version = '2+modules'` is a pyric resolver extension (rules/modules/resolver.ts), not stock Firebase rules — production Firestore only knows rules_version '1'/'2' and has no import statement."] }, { "feature": "rule-kind.indexOn", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.indexOn is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "rule-kind.let", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.let is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.let", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.let is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.location-wildcard", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.location-wildcard is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "rule-kind.match", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.match is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.match", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.match is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.read", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.read is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "rule-kind.rules_version", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.rules_version is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.rules_version", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.rules_version is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.validate", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.validate is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "rule-kind.write", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "rule-kind.write is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "ruleset", "surface": "rtdb", "importPaths": ["pyric/rules/internal/rtdb"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ruleset is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "runTransaction", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "runTransaction is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Retry behavior — prod retries on contention up to 5 times; sandbox is single-threaded, no contention possible", "divergence: contention story not modeled; sandbox just runs once"] }, { "feature": "runTransaction", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "runTransaction is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Concurrent contention / retry-on-conflict — single-client sandbox doesn't model real concurrency; the documented \"up to 25 retries\" contract is degenerate (the fn is invoked once)", "matrix #161 documents the same gap on the spec side; oracle observation hard to obtain from a single client (oracle row stays `?`)", "Concurrent contention — if another client writes between the read and write, the update fn is retried with the new current value (typically up to 25 retries by default)", "hard to observe deterministically from a single client"] }, { "feature": "SafetyRating", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SafetyRating is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SafetySetting", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SafetySetting is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SAMLAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "SAMLAuthProvider is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Schema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "Schema is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`Schema.enumString` serializes the enum values with type `string` and format `enum`", "`unit:helpers-schema.test.ts` test `ai#schema-string-enum` (upstream toJSON request shape; GoogleAI accepts only enum and date-time formats)"] }, { "feature": "SchemaInterface", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SchemaInterface is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SchemaParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SchemaParams is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SchemaRequest", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SchemaRequest is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SchemaShared", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SchemaShared is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SchemaType", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SchemaType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "script", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "script is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SDK_VERSION", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "SDK_VERSION is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SearchEntrypoint", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SearchEntrypoint is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Segment", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Segment is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "semantic.deny-by-default", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.deny-by-default is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.deny-by-default", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.deny-by-default is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.error-absorption-and", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.error-absorption-and is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.error-absorption-or", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.error-absorption-or is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.get-budget", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.get-budget is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.hierarchical-match-cascade", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.hierarchical-match-cascade is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.read-cascade", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.read-cascade is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.read-umbrella", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.read-umbrella is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.recursive-wildcard", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.recursive-wildcard is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.recursive-wildcard", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.recursive-wildcard is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.regex-literal", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.regex-literal is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.type-dispatch", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.type-dispatch is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.validate-non-cascade", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.validate-non-cascade is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.write-cascade", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "semantic.write-cascade is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "semantic.write-umbrella", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.write-umbrella is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "send", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "send is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sendEach", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "sendEach is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sendEachForMulticast", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "sendEachForMulticast is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sendEmailVerification", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "sendEmailVerification is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sendMessage", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "sendMessage is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`sendMessage` appends the user turn and the model turn; `getHistory()` returns the ordered `Content[]` with alternating roles", "`unit:chat-session.test.ts` test `ai#chat-history-threads` (no capture; history threading claim)"] }, { "feature": "sendMessageStream", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "sendMessageStream is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Exactly one user turn is recorded per `sendMessageStream` call; the mirror implements the 2.13.0 fixed semantics, not the installed 2.12.0 duplicate-user-turn bug", "`unit:chat-session.test.ts` test `ai#chat-stream-single-user-turn` (no capture; divergence pinned by ruling, see notes)"] }, { "feature": "sendPasswordResetEmail", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "sendPasswordResetEmail is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SendResponse", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "SendResponse is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sendSignInLinkToEmail", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "sendSignInLinkToEmail is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Prod rejects a continue URL whose domain is not on the project's authorized-domains list. The sandbox has NO domain allowlist and does not invent one: it accepts any parseable continue URL. A continue URL that would be rejected in production is accepted here.", "The sandbox has no project config to hold an authorized-domains list, so there is nothing to check against; inventing an allowlist would mean inventing a policy the user never set. The probe attempted the server arm (`auth-sendsigninlinktoemail-settings-validation`, `unauthorizedDomain`) but the oracle project has email-link sign-in disabled, so it answered `auth/operation-not-allowed` rather than `auth/unauthorized-continue-uri` — the divergence is declared from the documented contract, not from a capture we do not have."] }, { "feature": "serializeRtdbRules", "surface": "rtdb", "importPaths": ["pyric/rules/internal/rtdb"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "serializeRtdbRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "serverTimestamp", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "serverTimestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "serverTimestamp", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "serverTimestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SessionResumptionConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SessionResumptionConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "set", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "set is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Replaces the value at the path entirely; resolves to `undefined` (unlike `setDoc` which resolves to `void`, RTDB's `set` is documented as `Promise<void>`)", "upstream contract"] }, { "feature": "set.difference", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "set.difference is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "set.hasAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set.hasAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set.hasAny", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set.hasAny is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set.hasOnly", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set.hasOnly is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set.intersection", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "set.intersection is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "set.size", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set.union", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "set.union is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": [] }, { "feature": "setData", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setData is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setDoc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setIndexConfiguration", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "setIndexConfiguration is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Index-tuning / GC-policy APIs have no real knob to turn in an in-memory sandbox today, but sibling cache-factory tokens are already honest inert tokens; these are buildable the same way and not genuinely out of scope."] }, { "feature": "setLogLevel", "surface": "app", "importPaths": ["pyric/app"], "evidenceSlug": "app-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setLogLevel is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setLogLevel", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "setLogLevel is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Accepted no-op — the sandbox has no modular-SDK-style logger to wire a level into; it uses host-level `console` logging directly, gated by `pyric dev`'s own flags, not this call", "`unit:firestore/tier1-cache-init-align.test.ts`"] }, { "feature": "SetOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SetOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "setPersistence", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "setPersistence is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Actually changes where the auth state is persisted", "divergence: sandbox is a no-op. Prod respects the marker."] }, { "feature": "setPriority", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "setPriority is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Firebase's legacy priority ordering system is absent; the sandbox exposes orderByChild/Key/Value only today. Priority ordering is data-modelable as a sort key, so this is revisitable scope rather than a hard sandbox limitation."] }, { "feature": "setRules", "surface": "firestore", "importPaths": [], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "setRules is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["DEFERRED sub-items of row 138: strict bool in `&&`/`||`/ternary (`1 && true` should error) — corpus-coupled, needs emulator; a FLOAT stored in JSON test-data reads as int (`data.x is float`→false; prod uses the stored Firestore type tag) — needs a `__type:'float'` test-data revive marker; `resource`-null-on-create (RULES-B12 rest)", "DEFERRED — see the design rationale (limitation + sub-items); strict-bool also in `step-07`."] }, { "feature": "setRules", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setRules", "surface": "storage", "importPaths": [], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SettableMetadata", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SettableMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "setWithPriority", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "setWithPriority is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Firebase's legacy priority ordering system is absent; the sandbox exposes orderByChild/Key/Value only today. Priority ordering is data-modelable as a sort key, so this is revisitable scope rather than a hard sandbox limitation."] }, { "feature": "signInAnonymously", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "signInAnonymously is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Auto-generates a uid for fresh sign-ins (sandbox format: `anonymous-{N}`)", "`unit:sandbox-anonymous.test.ts` — prod uids are 28-char base64-ish; sandbox uses a readable counter for debuggability", "Anonymous users persist across page reload via configured `Persistence` (prod only — sandbox has no persistence layer)", "divergence: sandbox memory only; within one tab the user persists, across reload they don't"] }, { "feature": "SignInMethod", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "SignInMethod is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "signInWithCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "signInWithCredential is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Opens a popup window in prod", "divergence: sandbox skips the popup; mock pre-stage replaces the popup result", "Cancels with `auth/popup-closed-by-user` when the user dismisses the popup (prod)", "not modeled — would require the host to expose a \"cancel\" affordance on the mock"] }, { "feature": "signInWithCustomToken", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "signInWithCustomToken is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Throws `auth/invalid-custom-token` for a malformed token and for the empty string. The sandbox accepts a token in the two shapes it can honestly read: a JSON (optionally base64url) `{uid, claims}` payload — exactly what `admin.auth().createCustomToken` signs, so the pyric-admin mint and this redeem compose — or a real three-part JWT whose payload segment carries `uid`/`sub`. The SIGNATURE IS NOT VERIFIED: the sandbox has no service-account key. The identity is created if it does not exist, and the credential carries `providerId: null` (custom-token sign-in is not a federated provider).", "ORACLE-BACKED on the reject path: `auth-signinwithcustomtoken-invalid` captured `auth/invalid-custom-token` for both a malformed token and the empty string, replayed in `unit:oracle-conformance.test.ts`. Diverged on the ACCEPT path, declared rather than hidden: prod verifies an RS256 signature against the project's service-account key and the sandbox has no key, so it reads the token's claims WITHOUT verifying them. A forged token that prod would reject is accepted here. The happy path cannot be oracle-probed from a Web SDK client at all (it needs an Admin-SDK-signed JWT)."] }, { "feature": "signInWithEmailAndPassword", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "signInWithEmailAndPassword is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["An EMPTY password throws `auth/missing-password` (message \"A non-empty password must be provided\"), fired before the user-DB lookup so it can't be used to enumerate seeded emails. Upstream maps the `MISSING_PASSWORD` server error (`core/errors.ts:92,282,563`). ⚠ best-known semantics — message text not yet captured against a live project (STOP-flagged for an oracle pass; the `.code` is the load-bearing part).", "`unit:sandbox-cluster-b9-b12.test.ts` (locks AUTH-B11)"] }, { "feature": "signInWithEmailLink", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "signInWithEmailLink is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "signInWithPhoneNumber", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "signInWithPhoneNumber is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work."] }, { "feature": "signInWithPopup", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "signInWithPopup is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Opens a popup window in prod", "divergence: sandbox skips the popup; mock pre-stage replaces the popup result", "Cancels with `auth/popup-closed-by-user` when the user dismisses the popup (prod)", "not modeled — would require the host to expose a \"cancel\" affordance on the mock"] }, { "feature": "signInWithRedirect", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "signInWithRedirect is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "signOut", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "signOut is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Clears the active session's persistence in prod; sandbox has no persistence", "divergence: same memory-only constraint as the anonymous persistence row"] }, { "feature": "simulateRtdbRules", "surface": "rtdb", "importPaths": ["pyric/rules/internal/rtdb"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "simulateRtdbRules is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["The removed stateful simulator returned a generate-before-simulate error when no IR had been generated", "The stateless `simulateRtdbRules(compiled, input)` API requires a compiled rules tree and has no generate-before-simulate lifecycle.", "Cross-path `root.child(…).val()` reads return `null` for paths NOT present in `mockData` — divergence from real prod rules where the engine reads the live database", "divergence: the simulator uses ONLY what's in `mockData`. Real rules engine reads from the live RTDB. Documented in `validated.ts` (\"simulation uses empty mockData, so cross-path rule lookups … will evaluate as false\")"] }, { "feature": "SingleRequestOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SingleRequestOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "size", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "size is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "SlidingWindow", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SlidingWindow is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "snapshot.child", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.child is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.exists", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.exists is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.getPriority", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.getPriority is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.hasChild", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.hasChild is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.hasChildren", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.hasChildren is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.isBoolean", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.isBoolean is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.isNumber", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.isNumber is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.isString", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.isString is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.parent", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.parent is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshot.val", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshot.val is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "snapshotEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "snapshotEqual is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["`snapshotEqual(a, b)`. Prod: returns a boolean — true on identity, false even for two fetches of the same data. Sandbox: **throws** (`unrecognized reference`) for sandbox-target snapshots instead of returning a boolean", "divergence, oracle-locked by `packages/conformance/observations/firestore/firestore-snapshotequal-structural.json` (`identity: true`, `twoFetchesSameData: false` — prod is identity-only, NOT structural; an earlier structural guess was corrected by the oracle). The sandbox routes both args through the ref-tagging path, which does not recognize sandbox `QuerySnapshot`s, so `snapshotEqual` throws rather than comparing. Both sides pinned in `oracle-conformance.test.ts`. Fix candidate: identity-compare sandbox snapshots before the ref-tagging dispatch."] }, { "feature": "SnapshotListenOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SnapshotListenOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "SnapshotMetadata", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SnapshotMetadata is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors.", "Public type export is not mirrored."] }, { "feature": "SnapshotOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SnapshotOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "snapshotState", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshotState is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SpeechConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SpeechConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "startAfter", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAfter is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAfter", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAfter is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAt", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAt", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAudioConversation", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "startAudioConversation is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Deferred with the rest of the Live API family — the browser audio helper rides the Live session seam once that lands."] }, { "feature": "StartAudioConversationOptions", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StartAudioConversationOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "startChat", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startChat is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "StartChatParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StartChatParams is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "StartTemplateChatParams", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StartTemplateChatParams is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "StorageError", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StorageError is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "StorageErrorCode", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StorageErrorCode is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["StorageErrorCode and StringFormat are mirrored as TypeScript types but not as Firebase-compatible runtime enum objects, so value imports remain unavailable."] }, { "feature": "StorageObserver", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StorageObserver is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "StorageReference", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StorageReference is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "String", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "String is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "String", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "String is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.beginsWith", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.beginsWith is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.contains", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.contains is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.endsWith", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.endsWith is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.length", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.length is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Discrepancy: length is a String PROPERTY in the official language (`ref.val().length`, accessed as member, no call), but the validator lists it inside STRING_METHODS alongside the callable methods (rules/rtdb/grammar/validator.ts)."] }, { "feature": "string.lower", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.lower is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.matches", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.matches is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.matches", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.matches is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.matches", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.matches is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.replace", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.replace is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.replace", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.replace is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.size", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.split", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.split is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.split", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.split is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.toLowerCase", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.toLowerCase is available, has unverified fidelity, and is qualified for assurance.", "caveats": [] }, { "feature": "string.toUpperCase", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "string.toUpperCase is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Discrepancy: toUpperCase() is in the official RTDB String method set, but the parser validator's ALL_KNOWN_METHODS (rules/rtdb/grammar/validator.ts) lists toLowerCase without toUpperCase — the parser would reject it as UNKNOWN_METHOD."] }, { "feature": "string.toUtf8", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "string.toUtf8 is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`Bytes`, `String.toUtf8()`, and `hashing.{md5,sha256,crc32,crc32c}()` (Item 5.3) in rules", "`oracle:rules-firestore-bytes-toutf8-and-hashing` — production Firestore Rules Test API verdicts for corpus scenario \"bytes-toutf8-and-hashing\", replayed verdict-for-verdict against the local rules simulator by `unit:rules/oracle-conformance.test.ts`. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE"] }, { "feature": "string.trim", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.trim is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.upper", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.upper is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "stringEscapes", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "stringEscapes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "StringFormat", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StringFormat is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["StorageErrorCode and StringFormat are mirrored as TypeScript types but not as Firebase-compatible runtime enum objects, so value imports remain unavailable."] }, { "feature": "StringSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "StringSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "subscribeToTopic", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "subscribeToTopic is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "sum", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "sum is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "takeAuthMail", "surface": "auth", "importPaths": [], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "takeAuthMail is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TaskEvent", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskEvent is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TaskState", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskState is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TaskState", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskState is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TemplateChatSession", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateChatSession is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TemplateFunctionDeclaration", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateFunctionDeclaration is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TemplateFunctionDeclarationsTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateFunctionDeclarationsTool is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TemplateGenerativeModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateGenerativeModel is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Server-side templates are deferred, not out of scope — hosting template state is exactly the kind of server infrastructure the sandbox exists to model; the template store has not been built yet.", "Public type export is not mirrored."] }, { "feature": "TemplateImagenModel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "out-of-scope", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateImagenModel is out-of-scope; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Template-served Imagen models retire with the rest of Imagen (deprecated upstream, June 2026 shutdown); the template transport does not outlive the model family it serves.", "Public type export is not mirrored."] }, { "feature": "TemplateTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateTool is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TemplateToolConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TemplateToolConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "terminate", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "terminate is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Genuinely tears the sandbox target down by calling `Sandbox.dispose()`, which tears down listener registries on the sandbox's environment (idempotent, doesn't touch data). This differs from the real SDK in scope: `dispose()` operates on the whole `Sandbox`, not a Firestore-only slice, so if `pyric/database`/`pyric/storage` share the same `Sandbox` their listener registries are torn down too", "`unit:firestore/terminate.test.ts`"] }, { "feature": "ternary", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ternary is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ternary", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ternary is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "text", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "text is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TextPart", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TextPart is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ThenableReference", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ThenableReference is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ThinkingConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ThinkingConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ThinkingLevel", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ThinkingLevel is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "thoughtSummary", "surface": "ai", "importPaths": [], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "thoughtSummary is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Timestamp", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Timestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp", "surface": "firestore-rules", "importPaths": ["pyric/rules"], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Timestamp", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Timestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.date", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.date is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.date", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.date is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.day", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.day is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.dayOfWeek", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.dayOfWeek is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.dayOfYear", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.dayOfYear is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.hours", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.hours is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.minutes", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.minutes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.month", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.month is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.nanos", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.nanos is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.seconds", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.seconds is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.time", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.time is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.toMillis", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.toMillis is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.value", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.value is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.value", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.value is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "timestamp.year", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "timestamp.year is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TokenMessage", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "TokenMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Tool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Tool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ToolConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ToolConfig is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "TopicMessage", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "TopicMessage is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "toSet", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "toSet is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TotpMultiFactorAssertion", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TotpMultiFactorAssertion is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TotpMultiFactorGenerator", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TotpMultiFactorGenerator is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "TotpMultiFactorInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TotpMultiFactorInfo is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TotpSecret", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TotpSecret is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["MFA / phone / reCAPTCHA is deferred, not out of scope — reCAPTCHA/SMS are external infrastructure Pyric can mock with the OAuth resolver pattern, and TOTP is pure algorithm work.", "Public type export is not mirrored."] }, { "feature": "Transaction", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Transaction is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }, { "feature": "TransactionOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TransactionOptions", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionOptions is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TransactionResult", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionResult is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes are mirrored structurally in Pyric's type surface but are not exported as runtime constructor values; runtime identity remains unbuilt."] }, { "feature": "Transcription", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Transcription is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "TwitterAuthProvider", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "TwitterAuthProvider is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TypedSchema", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TypedSchema is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "union", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "union is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "UnionToIntersection", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UnionToIntersection is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "unlink", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "unlink is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Unsubscribe", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Unsubscribe is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Unsubscribe", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Unsubscribe is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Unsubscribe", "surface": "messaging", "importPaths": ["pyric/messaging", "pyric/messaging/sw"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Unsubscribe is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "Unsubscribe", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Unsubscribe is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "unsubscribeFromTopic", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "unsubscribeFromTopic is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "unsupportedBuiltins", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "unsupportedBuiltins is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "update", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "update is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Update path validation — overlapping paths (e.g. `'/a'` and `'/a/x'` in the same call) throws synchronously before any write", "upstream contract — needs targeted probe"] }, { "feature": "updateCurrentUser", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "updateCurrentUser is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "UpdateData", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UpdateData is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "updateDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "updateDoc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "updateEmail", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "updateEmail is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Changes the stored email (via the same path as `sandbox.updateUser`, rejecting `auth/email-already-in-use` / `auth/invalid-email`) and mutates the held `user` in place, so the next sign-in resolves against the new email. Leniency vs prod: the sandbox does NOT enforce `auth/requires-recent-login` and is not routed through `verifyBeforeUpdateEmail` (which the real SDK requires when email-enumeration protection is on)", "`unit:fruit-aliases.test.ts` — stored email changes; re-sign-in works with the new email, fails with the old", "In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "updateMetadata", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "updateMetadata is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`updateMetadata` with `undefined` field values preserves the prior value (does NOT clear it)", "divergence: prod accepts `null` to explicitly clear a field. Sandbox doesn't model `null`-clear (per `metadata.ts` doc comment). Documented; not probe-locked.", "`FullMetadata.md5Hash` populated on uploads", "divergence: sandbox does NOT compute `md5Hash`. Oracle-locked: `packages/conformance/observations/storage/storage-upload-then-getmetadata.json` confirms prod sets `md5Hash` (`hasMd5Hash: true` after a vanilla `uploadBytes`). Both sides pinned in `oracle-conformance.test.ts`. Aligning the sandbox is a one-spot fix in `upload.ts`'s `buildStoredMetadata`.", "`FullMetadata.ref` lazy population (prod populates lazily)", "not modeled in `pyric/storage` — `metadata.ts` explicitly omits `ref` from `FullMetadata`"] }, { "feature": "updatePassword", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "updatePassword is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Sets the stored password (validated for strength). The sandbox DOES store and verify passwords, so this is a real mutation: a subsequent `signInWithEmailAndPassword` with the new password succeeds and the old one throws `auth/wrong-password`. Leniency vs prod: no `auth/requires-recent-login` enforcement", "`unit:fruit-aliases.test.ts` — new password signs in, old password throws `auth/wrong-password`", "In production the POINT of re-authentication is the `auth/requires-recent-login` gate: `updateEmail` / `updatePassword` / `deleteUser` refuse to run on a session whose sign-in is older than a few minutes, and re-auth is how you clear it. The sandbox does NOT enforce that gate — those three mutations already run on a session of any age (a pre-existing documented divergence), so there is no gate here for re-auth to clear. What re-auth DOES do here is real but narrower: it genuinely re-verifies the credential, mints a fresh token, and returns `operationType: 'reauthenticate'`. Code that calls it runs unchanged against prod, where it also clears the gate.", "Declared divergence, not a bug: inventing a recent-login gate would break every existing sandbox flow (which never re-authenticates) while proving nothing. `unit:sandbox-linking-reauth.test.ts` pins the behavior that IS provided (real credential re-verification + a fresh token)."] }, { "feature": "updatePhoneNumber", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "updatePhoneNumber is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Phone number mutation is deferred alongside the rest of the phone-auth family — buildable via a mocked SMS/verification-code resolver, the same shape as the OAuth resolver."] }, { "feature": "updateProfile", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "updateProfile is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "uploadBytes", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "uploadBytes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "uploadBytesResumable", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "uploadBytesResumable is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["The UploadTask and observer surface is deferred — v1 shipped the one-shot uploadBytes driver first; the resumable/observable variant is unbuilt, not unbuildable.", "Exported by `firebase/storage`; returns an `UploadTask` with `pause()` / `resume()` / `cancel()`", "No `pyric/storage` implementation or behavioral probe exists; availability is classified by the owning surface contract.", "`task.on('state_changed', next, error, complete)` fires `next` with `{bytesTransferred, totalBytes, state}` snapshots", "not implemented", "`task.pause()` flips `state` to `'paused'`; `task.resume()` continues", "`task.cancel()` rejects the upload with `storage/canceled`"] }, { "feature": "UploadMetadata", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadMetadata is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "UploadResult", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "uploadString", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "uploadString is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Sandbox: `format='base64url'` (or any unknown format) rejected with `storage/invalid-format` naming the bad format. Prod: `base64url` is ACCEPTED (upload succeeds); a genuinely-unrecognized format throws `storage/unknown`", "divergence, both halves oracle-locked by `packages/conformance/observations/storage/storage-uploadstring-unknown-format.json`: prod accepts `base64url` (`base64urlOk: true`) and throws `storage/unknown` for an unrecognized format — not `storage/invalid-format`. The v1 sandbox ships only `raw`/`base64`/`data_url` (matches `StringFormat`) and throws `storage/invalid-format` for anything else (ST-B3 replaced the old mis-parse-as-data_url behavior). Both sides pinned in `oracle-conformance.test.ts`; sandbox code path documented in `upload.ts`'s `decodeString`. Implementing base64url decoding is still one line in `decodeString`."] }, { "feature": "UploadTask", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadTask is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "UploadTaskSnapshot", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadTaskSnapshot is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "URLContext", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "URLContext is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "URLContextMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "URLContextMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "URLContextTool", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "URLContextTool is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "URLMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "URLMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "URLRetrievalStatus", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "URLRetrievalStatus is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "UsageMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UsageMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "useDeviceLanguage", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "useDeviceLanguage is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Accepted no-op — the sandbox has no device locale to read, so there is no language to set; accepted so init code that calls it compiles + runs", "`unit:fruit-aliases.test.ts` — resolves/returns without error"] }, { "feature": "User", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "User is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["`user.metadata.creationTime` / `lastSignInTime`", "client `User.metadata` not exposed (AUTH-GAP); the admin record carries `createdAt`/`lastLoginAt` (ISO)", "`user.reload()` / `user.delete()` / `user.toJSON()` / `user.refreshToken` / `user.tenantId`", "not modeled by the sandbox; retained as an explicit unsupported behavior row rather than synthesized (AUTH-GAP)"] }, { "feature": "UserCredential", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UserCredential is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "UserInfo", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UserInfo is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "UserMetadata", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UserMetadata is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "UserProfile", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UserProfile is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "validatePassword", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "validatePassword is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "vector", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "vector is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "VectorValue", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "VectorValue is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "verifyBeforeUpdateEmail", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "verifyBeforeUpdateEmail is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "verifyPasswordResetCode", "surface": "auth", "importPaths": ["pyric/auth"], "evidenceSlug": "auth-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "verifyPasswordResetCode is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "VertexAIBackend", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "VertexAIBackend is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "VideoMetadata", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "VideoMetadata is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "VoiceConfig", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "VoiceConfig is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "waitForPendingWrites", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "waitForPendingWrites is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Resolves immediately in the sandbox mirror — every accepted write is already committed locally by the time its own promise resolves, so there are never writes still pending a server round-trip", "`unit:firestore/persistence-network.test.ts`"] }, { "feature": "WebAttribution", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WebAttribution is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "WebGroundingChunk", "surface": "ai", "importPaths": ["pyric/ai"], "evidenceSlug": "ai-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WebGroundingChunk is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "WebpushConfig", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "WebpushConfig is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "WebpushFcmOptions", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "WebpushFcmOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "where", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "where is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "WhereFilterOp", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WhereFilterOp is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "withConverter", "surface": "firestore", "importPaths": [], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "withConverter is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "WithFieldValue", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "unavailable", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WithFieldValue is unavailable; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["Public type export is not mirrored."] }, { "feature": "writeBatch", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "writeBatch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "WriteBatch", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "deferred", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WriteBatch is deferred; behavior fidelity and assurance are not applicable until the surface exists.", "caveats": ["These Firebase classes and constraint objects are present in Pyric's type surface but are not exported as runtime constructor values. Runtime identity and instanceof-compatible tokens remain unbuilt and cannot be credited by type-only mirrors."] }];
|
|
2
2
|
/** Resolve the canonical compatibility-page association for a published
|
|
3
3
|
* import. An exact lookup prevents docs generators from maintaining a second
|
|
4
4
|
* import-to-evidence map. */
|