@pyric/cli 0.1.0-alpha.21 → 0.1.0-alpha.22
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/assurance/.generated/conformance-verdicts.d.ts +170 -0
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +170 -0
- package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.d.ts +1 -1
- 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 +1 -1
- package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use.js +1 -1
- package/dist/conformance/.generated/can-i-use.js.map +1 -1
- package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
- package/dist/conformance/.generated/conformance-docs.js +1 -1
- package/dist/conformance/.generated/conformance-docs.js.map +1 -1
- package/dist/serve/site-ui/_astro/{app.DhAcImFD.js → app.CMmTxyhL.js} +1 -1
- package/dist/serve/site-ui/_astro/{app.BOr2kwae.js → app.DhALsVii.js} +12 -12
- package/dist/serve/site-ui/_astro/{seed.03a08f9t.js → seed.lywYbXZ0.js} +1 -1
- package/dist/serve/site-ui/auth/index.html +1 -1
- package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
- package/dist/serve/site-ui/docs/ai-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/api-reference/index.html +1 -1
- package/dist/serve/site-ui/docs/app-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/auth-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +1 -1
- package/dist/serve/site-ui/docs/build/authentication/index.html +2 -2
- package/dist/serve/site-ui/docs/build/authentication.md +1 -1
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +4 -2
- package/dist/serve/site-ui/docs/build/cloud-firestore.md +4 -0
- package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
- package/dist/serve/site-ui/docs/build/cloud-storage/index.html +1 -1
- package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
- package/dist/serve/site-ui/docs/conformance-scores/index.html +9 -1
- package/dist/serve/site-ui/docs/conformance-scores.md +8 -0
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/database-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/examples/chess/index.html +1 -1
- package/dist/serve/site-ui/docs/examples/index.html +1 -1
- package/dist/serve/site-ui/docs/firestore-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/firestore-flutter-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/firestore-kotlin-compat/index.html +319 -0
- package/dist/serve/site-ui/docs/firestore-kotlin-compat.md +344 -0
- package/dist/serve/site-ui/docs/firestore-swift-compat/index.html +490 -0
- package/dist/serve/site-ui/docs/firestore-swift-compat.md +517 -0
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/backend-bundlers/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/flutter/index.html +98 -0
- package/dist/serve/site-ui/docs/get-started/flutter.md +105 -0
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/nextjs/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/vite/index.html +1 -1
- package/dist/serve/site-ui/docs/index.json +255 -0
- package/dist/serve/site-ui/docs/messaging-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +4 -3
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status.md +3 -1
- package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/switch-and-impersonate-identities/index.html +110 -0
- package/dist/serve/site-ui/docs/observe/switch-and-impersonate-identities.md +134 -0
- package/dist/serve/site-ui/docs/overview/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-analytics-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-app-check-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bundler-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +3 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api.md +2 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +3 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api.md +2 -0
- package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-firestore-lite-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-functions-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-performance-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-remote-config-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +2 -2
- package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/reference/cli/index.html +1 -1
- package/dist/serve/site-ui/docs/rules-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +1 -1
- package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
- package/dist/serve/site-ui/docs/storage-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
- package/dist/serve/site-ui/docs/tutorial/index.html +1 -1
- package/dist/serve/site-ui/firestore/index.html +1 -1
- package/dist/serve/site-ui/llms.txt +4 -0
- package/dist/serve/site-ui/rtdb/index.html +1 -1
- package/dist/serve/site-ui/settings/index.html +1 -1
- package/dist/serve/site-ui/storage/index.html +1 -1
- package/dist/serve/site-ui/studio/index.html +1 -1
- package/dist/serve/site-ui/traffic/index.html +1 -1
- package/package.json +4 -4
- package/src/assurance/.generated/conformance-verdicts.ts +170 -0
- package/src/conformance/.generated/can-i-use-browser.ts +2 -2
- package/src/conformance/.generated/can-i-use.ts +2 -2
- package/src/conformance/.generated/conformance-docs.ts +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const CONFORMANCE_SUPPORTS = [{ "feature": "AbstractUserDataWriter", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AbstractUserDataWriter is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "add", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "add is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "addDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "addDoc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AddPrefixToKeys is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "aggregate", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "aggregate is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AggregateField", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AggregateField is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "aggregateFieldEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "aggregateFieldEqual is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AggregateFieldType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateFieldType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AggregateQuerySnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AggregateQuerySnapshot is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "aggregateQuerySnapshotEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "aggregateQuerySnapshotEqual is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateSpecData is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AggregateType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "unverified", "assurance": "qualified", "summary": "AndroidConfig is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["When a target device is offline FCM stores the message and delivers it on reconnect, up to its time-to-live (`android.ttl`, APNs expiration, webpush `headers.TTL`; the legacy default is 2419200 seconds / four weeks). A collapse key (`android.collapseKey`, `collapseKey`) marks a message as collapsible so a newer collapsible message replaces an older still-undelivered one, and only the last is delivered on reconnect; a message whose TTL elapses before reconnect is dropped rather than delivered. Stated from FCM message-lifecycle documentation; no committed observation replays store-and-forward, collapse, or TTL expiry yet.", "Upstream documentation (FCM message lifecycle: TTL, collapse keys, store-and-forward); no observation yet. Candidate probe: send several collapsible messages to a token whose web client is offline, bring it online within TTL, and assert only the last collapsible message is delivered; separately, let a short-TTL message expire before reconnect and assert it is dropped."] }, { "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": "arrayContains", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayContains is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "arrayContainsAny", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayContainsAny 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": "arrayRemove", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "arrayUnion", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "conforms", "assurance": "eligible", "summary": "auth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "auth.token", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "auth.token is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "auth.uid", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "auth.uid is available, has conforms fidelity, and is eligible 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": "batch", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "batch", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batch is available, has conforms fidelity, and is eligible for assurance.", "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": "Blob", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Blob is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "bool", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "bool is available, has conforms fidelity, and is eligible for assurance.", "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": "conforms", "assurance": "eligible", "summary": "bytes.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "bytes.toBase64", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "bytes.toBase64 is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "bytes.toHexString", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "bytes.toHexString is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CACHE_SIZE_UNLIMITED", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "CACHE_SIZE_UNLIMITED is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "cast.bool", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "cast.bool is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "cast.float", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "cast.float is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "cast.int", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "cast.int is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "cast.path", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "cast.path is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "child is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ChildUpdateFields", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ChildUpdateFields is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "clearPersistence", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "clearPersistence is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Clears offline client persistence cache when no active listeners exist.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "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": "collection", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "collectionGroup", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "CollectionReference is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "commit", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "commit is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "count", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "count is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "crossServiceIam", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "crossServiceIam 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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "data is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "data", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "data is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Database", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Database is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DataSnapshot is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "debug is available, has conforms fidelity, and is eligible 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": "delete", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "delete is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "deleteAllPersistentCacheIndexes", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "deleteAllPersistentCacheIndexes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "deleteField", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "unverified", "assurance": "qualified", "summary": "deleteToken is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["A registration token is stable within a session (row messaging#2 pins that repeated `getToken` calls on one service-worker registration return the same token) but is not permanent across the app lifecycle: the SDK rotates it on events such as app reinstall, SDK upgrade, a restored backup, or a notification-permission change, and Google may retire a token server-side. The modular web SDK has no token-refresh callback, so an app observes a new token only by calling `getToken` again; a rotated-away old token eventually stops delivering and the send plane reports the dead token (the UNREGISTERED path pinned by messaging#3). This lifecycle rotation is deliberately outside the within-session stability observation. Stated from FCM token-management documentation; no committed observation replays rotation across lifecycle events yet.", "Upstream documentation (FCM token-management guidance); the committed `messaging-web-token-stability` observation covers only within-session stability, not lifecycle rotation. Candidate probe (long-horizon): force a service-worker unregister/re-register or an app-instance reset, re-mint via `getToken`, and record whether the token changed and whether the prior token then reports UNREGISTERED on send."] }, { "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": "conforms", "assurance": "eligible", "summary": "disableNetwork is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "disableNetwork", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "disableNetwork is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Toggles client network connectivity to simulate offline operation.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "feature": "disablePersistentCacheIndexAutoCreation", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "disablePersistentCacheIndexAutoCreation is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "doc", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "doc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "docChanges", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "docChanges is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "docs", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "docs is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentChange", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentChange is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "DocumentChangeType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentChangeType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "DocumentReference is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentReference", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "DocumentReference is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentSnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "DocumentSnapshot is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "documentSnapshotFromJSON", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentSnapshotFromJSON is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "duration.nanos is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "duration.seconds", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration.seconds is available, has conforms fidelity, and is eligible 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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorMockTokenOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "EmulatorMockTokenOptions", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorMockTokenOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "enableIndexedDbPersistence is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "enableLegacyHttpTransport", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "enableLegacyHttpTransport is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["The admin SDK retries transient send-transport failures — connection errors and HTTP 5xx / `SERVER_UNAVAILABLE` / `INTERNAL` responses — with backoff before surfacing the error to the caller, so a caller sees a resolved send or a terminal error rather than every intermediate failure. `enableLegacyHttpTransport` switches `sendEach` / `sendEachForMulticast` from HTTP/2 to HTTP/1.1, changing multiplexing and the retry/transport path. Stated from the admin SDK and google-auth transport documentation; no committed observation replays the retry count or backoff schedule yet.", "Upstream documentation (firebase-admin 13.10.0 send transport + google-auth retry defaults); no observation yet. Candidate probe: point the send transport at a fault-injecting stub that returns 503 then 200 and record the retry count and backoff intervals before the resolved send."] }, { "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": "conforms", "assurance": "eligible", "summary": "enableMultiTabIndexedDbPersistence is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "enableNetwork", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "enableNetwork is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "enableNetwork", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "enableNetwork is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Toggles client network connectivity to simulate offline operation.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "feature": "enablePersistentCacheIndexAutoCreation", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "enablePersistentCacheIndexAutoCreation is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "endAtDocument", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endAtDocument 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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ensureFirestoreConfigured is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EventType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "executeWrite is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "exists", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "exists is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "exists", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "exists is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "existsAfter", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "existsAfter is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["The hosted Rules Test API reports function-not-found, so acceptance and evaluation are verified by authenticated Web SDK writes against temporarily deployed production rules with exact release restoration."] }, { "feature": "ExperimentalLongPollingOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ExperimentalLongPollingOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Firestore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "firestore.exists", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "firestore.exists is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Mocked Storage-to-Firestore lookup evaluation: get/exists return and missing-field errors, repeated and same-resolved-path calls, get+exists composition, and lazy `||`/`&&`/ternary branches with hosted function-call diagnostics", "DOCUMENTED MOCK-ORACLE DIVERGENCE, 2026-07-21: `oracle:rules-storage-firestore-lookup-budget` matches the local evaluator on 13 of 14 cases and hosted diagnostics prove lazy branches omit lookup calls. The one mismatch is intentional and pinned on both sides: the Rules Test API ALLOWs three distinct mocked exists calls, while the evaluator DENYs the third distinct path to match the separately captured real-resource production contract in row #131. This row remains diverged because its mocked observation is not verdict-identical; it supplies no budget credit.", "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": "unsupported", "assurance": "ineligible", "summary": "firestore.get is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Mocked Storage-to-Firestore lookup evaluation: get/exists return and missing-field errors, repeated and same-resolved-path calls, get+exists composition, and lazy `||`/`&&`/ternary branches with hosted function-call diagnostics", "DOCUMENTED MOCK-ORACLE DIVERGENCE, 2026-07-21: `oracle:rules-storage-firestore-lookup-budget` matches the local evaluator on 13 of 14 cases and hosted diagnostics prove lazy branches omit lookup calls. The one mismatch is intentional and pinned on both sides: the Rules Test API ALLOWs three distinct mocked exists calls, while the evaluator DENYs the third distinct path to match the separately captured real-resource production contract in row #131. This row remains diverged because its mocked observation is not verdict-identical; it supplies no budget credit.", "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FirestoreError is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FirestoreErrorCode", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreErrorCode is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirestoreLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreLocalCache is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "GeoPoint", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "GeoPoint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "get", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "get", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "getAfter is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["The hosted Rules Test API reports function-not-found, so acceptance and evaluation are verified by authenticated Web SDK writes against temporarily deployed production rules with exact release restoration."] }, { "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"] }, { "feature": "getDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDoc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getDocFromCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDocFromCache is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "getDocsFromCache is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getPersistentCacheIndexManager is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "unsupported", "assurance": "ineligible", "summary": "getToken is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["A single user or app can hold several registration tokens at once — one per browser, profile, or device. A token-targeted send reaches exactly one token; a topic, condition, or multicast send fans out independently to every subscribed token, with no server-side de-duplication across a user’s devices, so each device receives its own copy. Stated from the FCM targeting model; no committed observation replays cross-device fan-out yet.", "Upstream documentation (FCM targeting model); no observation yet. Candidate probe: mint two distinct tokens, subscribe both to one topic, send once, and assert each token receives the message independently.", "A registration token is stable within a session (row messaging#2 pins that repeated `getToken` calls on one service-worker registration return the same token) but is not permanent across the app lifecycle: the SDK rotates it on events such as app reinstall, SDK upgrade, a restored backup, or a notification-permission change, and Google may retire a token server-side. The modular web SDK has no token-refresh callback, so an app observes a new token only by calling `getToken` again; a rotated-away old token eventually stops delivering and the send plane reports the dead token (the UNREGISTERED path pinned by messaging#3). This lifecycle rotation is deliberately outside the within-session stability observation. Stated from FCM token-management documentation; no committed observation replays rotation across lifecycle events yet.", "Upstream documentation (FCM token-management guidance); the committed `messaging-web-token-stability` observation covers only within-session stability, not lifecycle rotation. Candidate probe (long-horizon): force a service-worker unregister/re-register or an app-instance reset, re-mint via `getToken`, and record whether the token changed and whether the prior token then reports UNREGISTERED on send.", "FCM treats a registration token that has gone unused for an extended period (Google documents roughly 270 days of app-instance inactivity) as stale and drops it from delivery targeting, independent of any explicit `deleteToken`. The expiry clock is Google server-side inactivity accounting, and the recommended mitigation is periodic token refresh. Stated from FCM best-practices documentation; the sandbox has no server-side inactivity clock to model.", "Upstream documentation (FCM registration-token best practices); no observation. This time-based server-side behavior is out of sandbox scope (see the row disposition); the explicit-deletion path to a dead token is already tracked by messaging#3."] }, { "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)` drains that client's onDisconnect queue once, but does not make the in-memory data plane unreachable; ordinary writes, listeners, and `get()` remain available", "`unit:database/on-disconnect.test.ts` + `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)` reconnects the logical lifecycle without resurrecting drained operations; it is otherwise a no-op because the in-memory data plane never became unreachable", "`unit:database/on-disconnect.test.ts` + `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": "hasAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hasAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hasAny", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hasAny is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hashing.crc32", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hashing.crc32 is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hashing.crc32c", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hashing.crc32c is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hashing.md5", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hashing.md5 is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hashing.sha256", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hashing.sha256 is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hasOnly", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hasOnly is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "diverged", "assurance": "qualified", "summary": "increment is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["**Divergence:** production interleaves concurrent `increment` writes from independent clients and preserves both deltas; the synchronous in-process backend applies each call before returning its promise, so a `Promise.all` call site is observably serialized even though its terminal value also reaches 5", "Oracle `rtdb-modular-concurrent-transforms` uses two independent clients and captures terminal 5 after concurrent +2/+3 increments; `unit:modular/transaction-contention-cdd.test.ts` pins the sandbox's synchronous first-write visibility and matching terminal value without claiming that terminal equality proves contention semantics."] }, { "feature": "Index", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Index is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "IndexConfiguration", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IndexConfiguration is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IndexField is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "instance", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "instance is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "instanceFor", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "instanceFor is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "isNull", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "isNull 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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IteratedDataSnapshot is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "limit", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "diverged", "assurance": "qualified", "summary": "limitToFirst is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Production rejects an unindexed `orderByValue() + limitToFirst(N)` query; the sandbox does not enforce `.indexOn` and returns the N smallest primitive values", "Oracle `rtdb-modular-orderbyvalue-numeric` captures production's `Index not defined` rejection; `unit:modular/oracle-conformance-queries.test.ts` pins that rejection beside the sandbox's successful `[10,20,30]` window."] }, { "feature": "limitToLast", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limitToLast is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limitToLast", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limitToLast is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListenOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ListenSource", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListenSource is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "loadBundle is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "LoadBundleTask", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "LoadBundleTask is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "LoadBundleTaskProgress", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LoadBundleTaskProgress is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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.get", "surface": "storage-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": ["Production and the local Storage evaluator accept request.resource.metadata.get(key, default); replayed by the Storage upload-boundary corpus."] }, { "feature": "map.hasAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.hasAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.hasAny", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.hasAny is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.hasOnly", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.hasOnly is available, has conforms fidelity, and is eligible 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.keys", "surface": "storage-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": ["Production and the local Storage evaluator accept request.resource.metadata.keys(); replayed by the Storage upload-boundary corpus."] }, { "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": "conforms", "assurance": "eligible", "summary": "math.isInfinite is available, has conforms fidelity, and is eligible 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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryCacheSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryEagerGarbageCollector is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryLocalCache is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryLruGarbageCollector is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "merge", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "merge is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "metadata", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "metadata 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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "namedQuery is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "NestedUpdateFields", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NestedUpdateFields is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "newData", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "newData is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "now is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "off is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "unverified", "assurance": "qualified", "summary": "onBackgroundMessage is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["When several window clients (browser tabs) of one origin share a single service-worker registration, a foreground delivery reaches every visible tab through `onMessage`, and when no tab is visible the one shared service worker receives the message once through `onBackgroundMessage` (the worker is shared across tabs, not instantiated per tab). A notification click focuses a single existing client rather than opening a duplicate. Stated from the FCM web SDK and the Service Worker client model; no committed observation replays the multi-tab fan-out yet.", "Upstream documentation (`@firebase/messaging` 0.12.26 + W3C Service Worker `Clients` model); no observation yet. Candidate probe: open two tabs on one registration and deliver with one tab visible, then with both hidden — assert `onMessage` fires once per visible tab and `onBackgroundMessage` fires exactly once on the shared worker."] }, { "feature": "onChildAdded", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onChildAdded is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "onChildMoved is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OnDisconnect is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "onDisconnect", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "onDisconnect is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["**Divergence (pending fix):** clean `goOffline`, app deletion, playground `pagehide`, and best-effort MessagePort close drain queued operations, but unannounced total renderer/process loss is not guaranteed by the in-memory sandbox", "Oracle `rtdb-modular-ondisconnect-abrupt-exit` proves Firebase executes an acknowledged registration after forced writer termination. The two-port worker integration exercises `goOffline`, served-app deletion, and non-persisted `pagehide`; browser MessagePort close delivery cannot prove total-process loss without durable host-owned leases."] }, { "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": "unverified", "assurance": "qualified", "summary": "onMessage is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["When several window clients (browser tabs) of one origin share a single service-worker registration, a foreground delivery reaches every visible tab through `onMessage`, and when no tab is visible the one shared service worker receives the message once through `onBackgroundMessage` (the worker is shared across tabs, not instantiated per tab). A notification click focuses a single existing client rather than opening a duplicate. Stated from the FCM web SDK and the Service Worker client model; no committed observation replays the multi-tab fan-out yet.", "Upstream documentation (`@firebase/messaging` 0.12.26 + W3C Service Worker `Clients` model); no observation yet. Candidate probe: open two tabs on one registration and deliver with one tab visible, then with both hidden — assert `onMessage` fires once per visible tab and `onBackgroundMessage` fires exactly once on the shared worker.", "A single user or app can hold several registration tokens at once — one per browser, profile, or device. A token-targeted send reaches exactly one token; a topic, condition, or multicast send fans out independently to every subscribed token, with no server-side de-duplication across a user’s devices, so each device receives its own copy. Stated from the FCM targeting model; no committed observation replays cross-device fan-out yet.", "Upstream documentation (FCM targeting model); no observation yet. Candidate probe: mint two distinct tokens, subscribe both to one topic, send once, and assert each token receives the message independently."] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onSnapshotResume is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onSnapshotsInSync", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onSnapshotsInSync is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onValue", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onValue is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "operator.add is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.and is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.div is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.div", "surface": "rtdb-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.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": "conforms", "assurance": "eligible", "summary": "operator.gt is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.gte is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.in is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.index is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.is is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.is", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.is is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.looseEq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.looseEq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.looseNeq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.looseNeq is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.lt is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.lte is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.member is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.mod is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.mod", "surface": "storage-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.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": "conforms", "assurance": "eligible", "summary": "operator.mul is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.neg is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.not is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.or is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.slice is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.slice", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.slice is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.strictEq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.strictEq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.strictNeq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.strictNeq is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.sub is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.ternary is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.ternary", "surface": "storage-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.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": "conforms", "assurance": "eligible", "summary": "operator.unary-minus is available, has conforms fidelity, and is eligible 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": "orderBy", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OrderByDirection is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderByPriority is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "orderByValue", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "orderByValue is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Production rejects an unindexed `orderByValue() + limitToFirst(N)` query; the sandbox does not enforce `.indexOn` and returns the N smallest primitive values", "Oracle `rtdb-modular-orderbyvalue-numeric` captures production's `Index not defined` rejection; `unit:modular/oracle-conformance-queries.test.ts` pins that rejection beside the sandbox's successful `[10,20,30]` window.", "Production enforces `.indexOn: '.value'` for `orderByValue()` while the sandbox executes the value ordering without index enforcement", "Oracle `rtdb-modular-orderbyvalue-numeric` rejects the unindexed production query; `unit:modular/oracle-conformance-queries.test.ts` pins the sandbox's successful ordered result instead of treating that contradiction as conformance."] }, { "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": "conforms", "assurance": "eligible", "summary": "parent is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PartialWithFieldValue is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "path.bind is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "path-variable is available, has conforms fidelity, and is eligible 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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "PersistentCacheIndexManager is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "PersistentCacheSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentCacheSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentLocalCache is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentMultipleTabManager is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentSingleTabManager is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PersistentSingleTabManagerSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentSingleTabManagerSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Primitive is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "Query 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": "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:** `DatabaseReference` and `Query` equality includes database target, path, and canonical query parameters like Firebase, but `toJSON()` serializes the local `sandbox://rtdb/...` identity instead of Firebase's HTTPS database URL.", "Oracle `rtdb-modular-reference-shape-url` captures conforming equality plus HTTPS JSON serialization; `unit:modular/oracle-conformance-reference-writes.test.ts` pins both the production HTTPS shape and the sandbox's `sandbox://` boundary."] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryCompositeFilterConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryConstraint", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraint is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryConstraintType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraintType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryConstraintType", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraintType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryDocumentSnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryDocumentSnapshot is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryEndAtConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryEndAtConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "queryEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "queryEqual is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryFieldFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryFieldFilterConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryFilterConstraint is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryLimitConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryLimitConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryNonFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryNonFilterConstraint is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryOrderByConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryOrderByConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QuerySnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QuerySnapshot is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "querySnapshotFromJSON", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "querySnapshotFromJSON is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryStartAtConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryStartAtConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "diverged", "assurance": "qualified", "summary": "ref is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Cold production clients may invoke the update fn first with speculative `null` and then with the current seeded value; the always-warm in-process sandbox invokes it once with the current value", "Oracle `rtdb-modular-runtransaction-current-value-arg` captures two seeded-path production invocations (`null`, then current); `unit:modular/oracle-conformance-transactions.test.ts` pins the sandbox's single current-value invocation. The separate warm-client observation matches the sandbox but does not erase the cold-client contract.", "**Divergence:** `DatabaseReference` and `Query` equality includes database target, path, and canonical query parameters like Firebase, but `toJSON()` serializes the local `sandbox://rtdb/...` identity instead of Firebase's HTTPS database URL.", "Oracle `rtdb-modular-reference-shape-url` captures conforming equality plus HTTPS JSON serialization; `unit:modular/oracle-conformance-reference-writes.test.ts` pins both the production HTTPS shape and the sandbox's `sandbox://` boundary."] }, { "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": ["**Divergence:** `refFromURL(db, url)` matches Firebase's path parsing, query ignoring, FTP-to-database normalization, and fragment rejection, but the single-database sandbox does not validate the URL host/namespace against the handle; Firebase rejects a mismatched host while the sandbox uses its path.", "Oracle `rtdb-modular-reference-shape-url` captures accepted FTP/query URLs and rejected fragments, malformed URLs, and host mismatches; `unit:modular/oracle-conformance-reference-writes.test.ts` pins the conforming validations plus both sides of the host divergence."] }, { "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": "conforms", "assurance": "eligible", "summary": "request.query is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "request.resource.id is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "resource is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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.generation", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.generation is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["Production types resource.generation as an int; exact comparison succeeds and an absent field errors and denies."] }, { "feature": "resource.id", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.id is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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.metageneration", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.metageneration is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["Production types resource.metageneration as an int; captured together with generation on the existing-object binding."] }, { "feature": "resource.__name__", "surface": "firestore-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": [] }, { "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": "conforms", "assurance": "eligible", "summary": "root is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "root", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "root is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "rule-kind.indexOn is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "rule-kind.location-wildcard is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "rule-kind.read is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "rule-kind.validate is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.write", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.write is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "runTransaction is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "runTransaction", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "runTransaction is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Catches optimistic locking conflicts and re-executes handler up to maxAttempts.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "feature": "runTransaction", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "runTransaction is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Cold production clients may invoke the update fn first with speculative `null` and then with the current seeded value; the always-warm in-process sandbox invokes it once with the current value", "Oracle `rtdb-modular-runtransaction-current-value-arg` captures two seeded-path production invocations (`null`, then current); `unit:modular/oracle-conformance-transactions.test.ts` pins the sandbox's single current-value invocation. The separate warm-client observation matches the sandbox but does not erase the cold-client contract.", "**Divergence:** two ordinary concurrent `runTransaction` calls are serialized by the in-process backend, so their update functions are not retried with Firebase's captured contention counts. A synchronous re-entrant conflicting write does trigger a deterministic retry.", "Oracle `rtdb-modular-concurrent-transforms` captures invocation counts [2, 3]; `unit:modular/transaction-contention-cdd.test.ts` pins the sandbox's [1, 1] ordinary-concurrency boundary and separately covers its deterministic re-entrant retry seam.", "A cold production client can call the update fn with speculative `null` before the current seeded value; the always-warm sandbox calls it once with the current value", "Oracle `rtdb-modular-runtransaction-current-value-arg` captures the cold two-call sequence and `rtdb-modular-runtransaction-warm-client-speculation` captures the matching warm one-call case; `unit:modular/oracle-conformance-transactions.test.ts` pins both sides.", "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)", "Oracle `rtdb-modular-concurrent-transforms` captures callback counts [2, 3] across two clients; the synchronous in-process backend serializes the same ordinary calls with [1, 1], pinned by `unit:modular/transaction-contention-cdd.test.ts`."] }, { "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": "conforms", "assurance": "eligible", "summary": "semantic.read-cascade is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "semantic.regex-literal is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "semantic.validate-non-cascade is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.write-cascade", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.write-cascade is available, has conforms fidelity, and is eligible 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": "unsupported", "assurance": "ineligible", "summary": "send is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["FCM enforces project-level send quotas and per-target rate limits (per-device and per-topic message rates) accounted on Google servers over rolling windows; exceeding them yields quota / rate-limit rejections. The admin error taxonomy names these as `MessagingClientErrorCode.MESSAGE_RATE_EXCEEDED`, `DEVICE_MESSAGE_RATE_EXCEEDED`, and `TOPICS_MESSAGE_RATE_EXCEEDED` (wire `QUOTA_EXCEEDED` / `RESOURCE_EXHAUSTED`, HTTP 429). Stated from FCM quota documentation; the sandbox has no global quota ledger to model.", "Upstream documentation (FCM quotas and `MessagingClientErrorCode` rate-limit members, firebase-admin 13.10.0); no observation. This behavior is out of sandbox scope (see the row disposition).", "The admin SDK retries transient send-transport failures — connection errors and HTTP 5xx / `SERVER_UNAVAILABLE` / `INTERNAL` responses — with backoff before surfacing the error to the caller, so a caller sees a resolved send or a terminal error rather than every intermediate failure. `enableLegacyHttpTransport` switches `sendEach` / `sendEachForMulticast` from HTTP/2 to HTTP/1.1, changing multiplexing and the retry/transport path. Stated from the admin SDK and google-auth transport documentation; no committed observation replays the retry count or backoff schedule yet.", "Upstream documentation (firebase-admin 13.10.0 send transport + google-auth retry defaults); no observation yet. Candidate probe: point the send transport at a fault-injecting stub that returns 503 then 200 and record the retry count and backoff intervals before the resolved send.", "When a target device is offline FCM stores the message and delivers it on reconnect, up to its time-to-live (`android.ttl`, APNs expiration, webpush `headers.TTL`; the legacy default is 2419200 seconds / four weeks). A collapse key (`android.collapseKey`, `collapseKey`) marks a message as collapsible so a newer collapsible message replaces an older still-undelivered one, and only the last is delivered on reconnect; a message whose TTL elapses before reconnect is dropped rather than delivered. Stated from FCM message-lifecycle documentation; no committed observation replays store-and-forward, collapse, or TTL expiry yet.", "Upstream documentation (FCM message lifecycle: TTL, collapse keys, store-and-forward); no observation yet. Candidate probe: send several collapsible messages to a token whose web client is offline, bring it online within TTL, and assert only the last collapsible message is delivered; separately, let a short-TTL message expire before reconnect and assert it is dropped."] }, { "feature": "sendEach", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "sendEach is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["FCM enforces project-level send quotas and per-target rate limits (per-device and per-topic message rates) accounted on Google servers over rolling windows; exceeding them yields quota / rate-limit rejections. The admin error taxonomy names these as `MessagingClientErrorCode.MESSAGE_RATE_EXCEEDED`, `DEVICE_MESSAGE_RATE_EXCEEDED`, and `TOPICS_MESSAGE_RATE_EXCEEDED` (wire `QUOTA_EXCEEDED` / `RESOURCE_EXHAUSTED`, HTTP 429). Stated from FCM quota documentation; the sandbox has no global quota ledger to model.", "Upstream documentation (FCM quotas and `MessagingClientErrorCode` rate-limit members, firebase-admin 13.10.0); no observation. This behavior is out of sandbox scope (see the row disposition)."] }, { "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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set.difference", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set.difference is available, has conforms fidelity, and is eligible 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.hasAll", "surface": "storage-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": ["Production and the local Storage evaluator accept hasAll() on the set returned by custom-metadata keys(); replayed by the Storage upload-boundary corpus."] }, { "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": "conforms", "assurance": "eligible", "summary": "set.intersection is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "set.union is available, has conforms fidelity, and is eligible 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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setIndexConfiguration is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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 sandbox`'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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setPriority is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setRules", "surface": "firestore", "importPaths": [], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "settings", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "settings is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setWithPriority", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setWithPriority is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "size is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "snapshot.child is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.exists", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.exists is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.getPriority", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.getPriority is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.hasChild", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.hasChild is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.hasChildren", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.hasChildren is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.isBoolean", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.isBoolean is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.isNumber", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.isNumber is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.isString", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.isString is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.parent", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.parent is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.val", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.val is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshotEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshotEqual is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "SnapshotMetadata is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SnapshotOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SnapshotOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "snapshots", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshots is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshotsInSync", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshotsInSync is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Emits an event when all active listeners have caught up to the same state.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "startAtDocument", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAtDocument 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": "conforms", "assurance": "eligible", "summary": "string.beginsWith is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.contains", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.contains is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.endsWith", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.endsWith is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.length", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.length is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "string.matches is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "string.replace is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "string.split is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.toLowerCase", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.toLowerCase is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.toUpperCase", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.toUpperCase is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "string.toUtf8 is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskEvent is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "TaskState", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskState is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "TaskState", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskState is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "terminate is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "terminate", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "terminate is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Transaction is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "transaction", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transaction is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "transaction", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transaction is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TransactionOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "TransactionOptions", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "TransactionResult", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UnionToIntersection is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "update is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "update", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "update is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UpdateData is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "uploadBytesResumable is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Exported by `firebase/storage`; returns an `UploadTask` with `pause()` / `resume()` / `cancel()`", "`unit:resumable-upload.test.ts` confirms `uploadBytesResumable(ref, data)` returns an `UploadTask` supporting `pause()`, `resume()`, and `cancel()` over synthetic microtask steps.", "`task.on('state_changed', next, error, complete)` fires `next` with `{bytesTransferred, totalBytes, state}` snapshots", "`unit:resumable-upload.test.ts` confirms synthetic progress snapshots are emitted during task execution without requiring network transfer.", "`task.pause()` flips `state` to `'paused'`; `task.resume()` continues", "`unit:resumable-upload.test.ts` confirms calling `task.pause()` and `task.resume()` transitions through `'paused'` and `'running'` states deterministically.", "`task.cancel()` rejects the upload with `storage/canceled`", "`unit:resumable-upload.test.ts` confirms cancellation rejects with `storage/canceled` and leaves no falsely completed object in storage."] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadTask is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "UploadTaskSnapshot", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadTaskSnapshot is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "waitForPendingWrites is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "waitForPendingWrites", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "waitForPendingWrites is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Resolves when all locally initiated writes have been committed by the server.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "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": "where", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-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": "whereIn", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereIn is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereNotIn", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereNotIn is available, has conforms fidelity, and is eligible for assurance.", "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WithFieldValue is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "writeBatch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "writeBatch", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "writeBatch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }];
|
|
1
|
+
export const CONFORMANCE_SUPPORTS = [{ "feature": "AbstractUserDataWriter", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AbstractUserDataWriter is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "add", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "add is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "add", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "add is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "addDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "addDoc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "addDocument", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "addDocument is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AddPrefixToKeys is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "addQuerySnapshotListener", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "addQuerySnapshotListener is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "addQuerySnapshotListenerMetadata", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "addQuerySnapshotListenerMetadata is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "addQuerySnapshotListenerOptions", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "addQuerySnapshotListenerOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "addSnapshotListener", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "addSnapshotListener is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "addSnapshotListenerMetadata", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "addSnapshotListenerMetadata is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "addSnapshotListenerOptions", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "addSnapshotListenerOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "addSnapshotsInSyncListener", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "addSnapshotsInSyncListener is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Attaches a callback invoked when all active snapshot listeners synchronize.", "FirebaseFirestore Swift specification; unverified locally."] }, { "feature": "aggregate", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "aggregate is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "aggregate", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "aggregate is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AggregateField", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AggregateField is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "aggregateFieldEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "aggregateFieldEqual is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "AggregateFieldType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateFieldType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AggregateQuerySnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "AggregateQuerySnapshot is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "aggregateQuerySnapshotEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "aggregateQuerySnapshotEqual is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateSpecData is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "AggregateType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "AggregateType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "unverified", "assurance": "qualified", "summary": "AndroidConfig is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["When a target device is offline FCM stores the message and delivers it on reconnect, up to its time-to-live (`android.ttl`, APNs expiration, webpush `headers.TTL`; the legacy default is 2419200 seconds / four weeks). A collapse key (`android.collapseKey`, `collapseKey`) marks a message as collapsible so a newer collapsible message replaces an older still-undelivered one, and only the last is delivered on reconnect; a message whose TTL elapses before reconnect is dropped rather than delivered. Stated from FCM message-lifecycle documentation; no committed observation replays store-and-forward, collapse, or TTL expiry yet.", "Upstream documentation (FCM message lifecycle: TTL, collapse keys, store-and-forward); no observation yet. Candidate probe: send several collapsible messages to a token whose web client is offline, bring it online within TTL, and assert only the last collapsible message is delivered; separately, let a short-TTL message expire before reconnect and assert it is dropped."] }, { "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": "app", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "app 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": "arrayContains", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayContains is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "arrayContainsAny", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayContainsAny 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": "arrayRemove", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayRemove is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "arrayRemove", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayRemove is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "arrayRemove", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "arrayUnion", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayUnion is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "arrayUnion", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "arrayUnion is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "arrayUnion", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "conforms", "assurance": "eligible", "summary": "auth is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "auth.token", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "auth.token is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "auth.uid", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "auth.uid is available, has conforms fidelity, and is eligible 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": "batch", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "batch", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "batch", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "batch", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "batchCommit", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batchCommit is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "batchDeleteDocument", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batchDeleteDocument is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "batchSetData", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batchSetData is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "batchSetDataMerge", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batchSetDataMerge is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "batchSetDataMergeFields", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batchSetDataMergeFields is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "batchUpdateData", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "batchUpdateData is available, has conforms fidelity, and is eligible for assurance.", "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": "Blob", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Blob is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Blob", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Blob is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "bool", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "bool is available, has conforms fidelity, and is eligible for assurance.", "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": "conforms", "assurance": "eligible", "summary": "bytes.size is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "bytes.toBase64", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "bytes.toBase64 is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "bytes.toHexString", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "bytes.toHexString is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CACHE_SIZE_UNLIMITED", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "CACHE_SIZE_UNLIMITED is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "cast.bool", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "cast.bool is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "cast.float", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "cast.float is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "cast.int", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "cast.int is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "cast.path", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "cast.path is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "child is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "ChildUpdateFields", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ChildUpdateFields is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "clearPersistence", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "clearPersistence is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Clears offline client persistence cache when no active listeners exist.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "feature": "clearPersistence", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "clearPersistence is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Clears offline client persistence cache when no active listeners exist.", "com.google.firebase.firestore specification; unverified locally."] }, { "feature": "clearPersistence", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "clearPersistence is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Clears offline client persistence cache when no active listeners exist.", "FirebaseFirestore Swift specification; unverified locally."] }, { "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": "collection", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "collection is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "collection", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "collection is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "collection", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "collectionGroup", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "collectionGroup is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "collectionGroup", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "collectionGroup is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "collectionGroup", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "collectionGroup is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "collectionID", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "collectionID is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "CollectionReference", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "CollectionReference is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "commit", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "commit is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "commit", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "commit is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "count", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "count is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "count", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "count is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "count", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "count is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "crossServiceIam", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "crossServiceIam 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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "data is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "data", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "data is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "data", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "data is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "data", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "data is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "dataAsDecodable", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "dataAsDecodable is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Decodes document snapshot fields directly into Decodable model.", "FirebaseFirestore Swift specification; unverified locally."] }, { "feature": "Database", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Database is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DataSnapshot is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "dataWithServerTimestampBehavior", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "dataWithServerTimestampBehavior is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "debug is available, has conforms fidelity, and is eligible 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": "delete", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "delete is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "delete", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "delete is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "delete", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "delete is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "deleteAllPersistentCacheIndexes", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "deleteAllPersistentCacheIndexes is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "deleteField", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "deleteField is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "deleteField", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "deleteField is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "deleteField", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "unverified", "assurance": "qualified", "summary": "deleteToken is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["A registration token is stable within a session (row messaging#2 pins that repeated `getToken` calls on one service-worker registration return the same token) but is not permanent across the app lifecycle: the SDK rotates it on events such as app reinstall, SDK upgrade, a restored backup, or a notification-permission change, and Google may retire a token server-side. The modular web SDK has no token-refresh callback, so an app observes a new token only by calling `getToken` again; a rotated-away old token eventually stops delivering and the send plane reports the dead token (the UNREGISTERED path pinned by messaging#3). This lifecycle rotation is deliberately outside the within-session stability observation. Stated from FCM token-management documentation; no committed observation replays rotation across lifecycle events yet.", "Upstream documentation (FCM token-management guidance); the committed `messaging-web-token-stability` observation covers only within-session stability, not lifecycle rotation. Candidate probe (long-horizon): force a service-worker unregister/re-register or an app-instance reset, re-mint via `getToken`, and record whether the token changed and whether the prior token then reports UNREGISTERED on send."] }, { "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": "conforms", "assurance": "eligible", "summary": "disableNetwork is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "disableNetwork", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "disableNetwork is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Toggles client network connectivity to simulate offline operation.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "feature": "disableNetwork", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "disableNetwork is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Toggles client network connectivity to simulate offline operation.", "com.google.firebase.firestore specification; unverified locally."] }, { "feature": "disableNetwork", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "disableNetwork is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Toggles client network connectivity to simulate offline and online operation.", "FirebaseFirestore Swift specification; unverified locally."] }, { "feature": "disablePersistentCacheIndexAutoCreation", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "disablePersistentCacheIndexAutoCreation is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "doc", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "doc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "docChanges", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "docChanges is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "docs", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "docs is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "document", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "document is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "document", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "document is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "documentAutoId", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentAutoId is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentChange", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentChange is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "documentChange", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentChange is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "documentChanges", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentChanges is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "documentChanges", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentChanges is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "documentChangesIncludeMetadata", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentChangesIncludeMetadata is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentChangeType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "DocumentChangeType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "documentID", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentID is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "documentIDPropertyWrapper", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "documentIDPropertyWrapper is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Property wrapper populating document ID on decoding; omitted from write payloads.", "FirebaseFirestore Swift specification; unverified locally."] }, { "feature": "documentPath", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentPath is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentReference", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "DocumentReference is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentReference", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "DocumentReference is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentReference", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "DocumentReference is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "documents", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documents is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "documents", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documents is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "DocumentSnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "DocumentSnapshot is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "documentSnapshotFromJSON", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentSnapshotFromJSON is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "documentSnapshotsSequence", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "documentSnapshotsSequence is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "duration.nanos is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "duration.seconds", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "duration.seconds is available, has conforms fidelity, and is eligible 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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorMockTokenOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "EmulatorMockTokenOptions", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EmulatorMockTokenOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "enableIndexedDbPersistence is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "enableLegacyHttpTransport", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "enableLegacyHttpTransport is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["The admin SDK retries transient send-transport failures — connection errors and HTTP 5xx / `SERVER_UNAVAILABLE` / `INTERNAL` responses — with backoff before surfacing the error to the caller, so a caller sees a resolved send or a terminal error rather than every intermediate failure. `enableLegacyHttpTransport` switches `sendEach` / `sendEachForMulticast` from HTTP/2 to HTTP/1.1, changing multiplexing and the retry/transport path. Stated from the admin SDK and google-auth transport documentation; no committed observation replays the retry count or backoff schedule yet.", "Upstream documentation (firebase-admin 13.10.0 send transport + google-auth retry defaults); no observation yet. Candidate probe: point the send transport at a fault-injecting stub that returns 503 then 200 and record the retry count and backoff intervals before the resolved send."] }, { "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": "conforms", "assurance": "eligible", "summary": "enableMultiTabIndexedDbPersistence is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "enableNetwork", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "enableNetwork is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "enableNetwork", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "enableNetwork is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Toggles client network connectivity to simulate offline operation.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "feature": "enableNetwork", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "enableNetwork is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Toggles client network connectivity to simulate offline operation.", "com.google.firebase.firestore specification; unverified locally."] }, { "feature": "enableNetwork", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "enableNetwork is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Toggles client network connectivity to simulate offline and online operation.", "FirebaseFirestore Swift specification; unverified locally."] }, { "feature": "enablePersistentCacheIndexAutoCreation", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "enablePersistentCacheIndexAutoCreation is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "endAt", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "endAt", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "endAtDocument", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endAtDocument is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "endAtDocument", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endAtDocument 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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endBefore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "endBefore", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endBefore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "endBefore", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "endBeforeDocument", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "endBeforeDocument 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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "ensureFirestoreConfigured is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "EventType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "executeWrite is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "exists", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "exists is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "exists", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "exists is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "exists", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "exists is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "exists", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "exists is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "existsAfter", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "existsAfter is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["The hosted Rules Test API reports function-not-found, so acceptance and evaluation are verified by authenticated Web SDK writes against temporarily deployed production rules with exact release restoration."] }, { "feature": "ExperimentalLongPollingOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ExperimentalLongPollingOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "fieldPath", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "filter", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "filter is available, has conforms fidelity, and is eligible for assurance.", "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Firestore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "firestore", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "firestore is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "firestore.exists", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "firestore.exists is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Mocked Storage-to-Firestore lookup evaluation: get/exists return and missing-field errors, repeated and same-resolved-path calls, get+exists composition, and lazy `||`/`&&`/ternary branches with hosted function-call diagnostics", "DOCUMENTED MOCK-ORACLE DIVERGENCE, 2026-07-21: `oracle:rules-storage-firestore-lookup-budget` matches the local evaluator on 13 of 14 cases and hosted diagnostics prove lazy branches omit lookup calls. The one mismatch is intentional and pinned on both sides: the Rules Test API ALLOWs three distinct mocked exists calls, while the evaluator DENYs the third distinct path to match the separately captured real-resource production contract in row #131. This row remains diverged because its mocked observation is not verdict-identical; it supplies no budget credit.", "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": "unsupported", "assurance": "ineligible", "summary": "firestore.get is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["Mocked Storage-to-Firestore lookup evaluation: get/exists return and missing-field errors, repeated and same-resolved-path calls, get+exists composition, and lazy `||`/`&&`/ternary branches with hosted function-call diagnostics", "DOCUMENTED MOCK-ORACLE DIVERGENCE, 2026-07-21: `oracle:rules-storage-firestore-lookup-budget` matches the local evaluator on 13 of 14 cases and hosted diagnostics prove lazy branches omit lookup calls. The one mismatch is intentional and pinned on both sides: the Rules Test API ALLOWs three distinct mocked exists calls, while the evaluator DENYs the third distinct path to match the separately captured real-resource production contract in row #131. This row remains diverged because its mocked observation is not verdict-identical; it supplies no budget credit.", "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": "firestoreApp", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "firestoreApp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "firestoreAppDatabase", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "firestoreAppDatabase is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "firestoreDatabase", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "firestoreDatabase is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "FirestoreError is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "FirestoreErrorCode", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreErrorCode is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "FirestoreLocalCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "FirestoreLocalCache is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "GeoPoint", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "GeoPoint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "GeoPoint", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "GeoPoint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "geoPoint", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "geoPoint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "get", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "get", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "get", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "get", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "get is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "getAfter is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["The hosted Rules Test API reports function-not-found, so acceptance and evaluation are verified by authenticated Web SDK writes against temporarily deployed production rules with exact release restoration."] }, { "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": "getData", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getData 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"] }, { "feature": "getDoc", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDoc is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getDocFromCache", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDocFromCache is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "getDocsFromCache is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "getDocument", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDocument is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "getDocuments", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getDocuments 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": "getInstance", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getInstance is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "getPersistentCacheIndexManager is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "getQuery", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "getQuery is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Retrieves a named query from a previously loaded Firestore bundle.", "FirebaseFirestore Swift specification; unverified locally."] }, { "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": "unsupported", "assurance": "ineligible", "summary": "getToken is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["A single user or app can hold several registration tokens at once — one per browser, profile, or device. A token-targeted send reaches exactly one token; a topic, condition, or multicast send fans out independently to every subscribed token, with no server-side de-duplication across a user’s devices, so each device receives its own copy. Stated from the FCM targeting model; no committed observation replays cross-device fan-out yet.", "Upstream documentation (FCM targeting model); no observation yet. Candidate probe: mint two distinct tokens, subscribe both to one topic, send once, and assert each token receives the message independently.", "A registration token is stable within a session (row messaging#2 pins that repeated `getToken` calls on one service-worker registration return the same token) but is not permanent across the app lifecycle: the SDK rotates it on events such as app reinstall, SDK upgrade, a restored backup, or a notification-permission change, and Google may retire a token server-side. The modular web SDK has no token-refresh callback, so an app observes a new token only by calling `getToken` again; a rotated-away old token eventually stops delivering and the send plane reports the dead token (the UNREGISTERED path pinned by messaging#3). This lifecycle rotation is deliberately outside the within-session stability observation. Stated from FCM token-management documentation; no committed observation replays rotation across lifecycle events yet.", "Upstream documentation (FCM token-management guidance); the committed `messaging-web-token-stability` observation covers only within-session stability, not lifecycle rotation. Candidate probe (long-horizon): force a service-worker unregister/re-register or an app-instance reset, re-mint via `getToken`, and record whether the token changed and whether the prior token then reports UNREGISTERED on send.", "FCM treats a registration token that has gone unused for an extended period (Google documents roughly 270 days of app-instance inactivity) as stale and drops it from delivery targeting, independent of any explicit `deleteToken`. The expiry clock is Google server-side inactivity accounting, and the recommended mitigation is periodic token refresh. Stated from FCM best-practices documentation; the sandbox has no server-side inactivity clock to model.", "Upstream documentation (FCM registration-token best practices); no observation. This time-based server-side behavior is out of sandbox scope (see the row disposition); the explicit-deletion path to a dead token is already tracked by messaging#3."] }, { "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)` drains that client's onDisconnect queue once, but does not make the in-memory data plane unreachable; ordinary writes, listeners, and `get()` remain available", "`unit:database/on-disconnect.test.ts` + `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)` reconnects the logical lifecycle without resurrecting drained operations; it is otherwise a no-op because the in-memory data plane never became unreachable", "`unit:database/on-disconnect.test.ts` + `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": "hasAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hasAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hasAny", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hasAny is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hashing.crc32", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hashing.crc32 is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hashing.crc32c", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hashing.crc32c is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hashing.md5", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hashing.md5 is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hashing.sha256", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hashing.sha256 is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hasOnly", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hasOnly is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "hasPendingWrites", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "hasPendingWrites is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "increment is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "increment", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "increment is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "increment", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "diverged", "assurance": "qualified", "summary": "increment is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["**Divergence:** production interleaves concurrent `increment` writes from independent clients and preserves both deltas; the synchronous in-process backend applies each call before returning its promise, so a `Promise.all` call site is observably serialized even though its terminal value also reaches 5", "Oracle `rtdb-modular-concurrent-transforms` uses two independent clients and captures terminal 5 after concurrent +2/+3 increments; `unit:modular/transaction-contention-cdd.test.ts` pins the sandbox's synchronous first-write visibility and matching terminal value without claiming that terminal equality proves contention semantics."] }, { "feature": "Index", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Index is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "IndexConfiguration", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IndexConfiguration is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IndexField is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "instance", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "instance is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "instanceFor", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "instanceFor is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "isEmpty", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "isEmpty is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "isFromCache", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "isFromCache is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "isNull", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "isNull 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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "IteratedDataSnapshot is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "limit", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limit is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limit", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limit is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limitTo", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limitTo is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limitToFirst", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "limitToFirst is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Production rejects an unindexed `orderByValue() + limitToFirst(N)` query; the sandbox does not enforce `.indexOn` and returns the N smallest primitive values", "Oracle `rtdb-modular-orderbyvalue-numeric` captures production's `Index not defined` rejection; `unit:modular/oracle-conformance-queries.test.ts` pins that rejection beside the sandbox's successful `[10,20,30]` window."] }, { "feature": "limitToLast", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limitToLast is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limitToLast", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limitToLast is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limitToLast", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limitToLast is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "limitToLast", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "limitToLast is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListenOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "ListenSource", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "ListenSource is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "loadBundle is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "loadBundle", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "loadBundle is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Loads serialized Firestore bundle data into the local cache.", "FirebaseFirestore Swift specification; unverified locally."] }, { "feature": "LoadBundleTask", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "LoadBundleTask is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "LoadBundleTaskProgress", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "LoadBundleTaskProgress is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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.get", "surface": "storage-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": ["Production and the local Storage evaluator accept request.resource.metadata.get(key, default); replayed by the Storage upload-boundary corpus."] }, { "feature": "map.hasAll", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.hasAll is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.hasAny", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.hasAny is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "map.hasOnly", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "map.hasOnly is available, has conforms fidelity, and is eligible 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.keys", "surface": "storage-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": ["Production and the local Storage evaluator accept request.resource.metadata.keys(); replayed by the Storage upload-boundary corpus."] }, { "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": "conforms", "assurance": "eligible", "summary": "math.isInfinite is available, has conforms fidelity, and is eligible 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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryCacheSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryEagerGarbageCollector is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryLocalCache is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "MemoryLruGarbageCollector is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "merge", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "merge is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "merge", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "merge is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "metadata", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "metadata is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "metadata", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "metadata 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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "namedQuery is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "NestedUpdateFields", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "NestedUpdateFields is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "newData", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "newData is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "now is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "off is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "unverified", "assurance": "qualified", "summary": "onBackgroundMessage is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["When several window clients (browser tabs) of one origin share a single service-worker registration, a foreground delivery reaches every visible tab through `onMessage`, and when no tab is visible the one shared service worker receives the message once through `onBackgroundMessage` (the worker is shared across tabs, not instantiated per tab). A notification click focuses a single existing client rather than opening a duplicate. Stated from the FCM web SDK and the Service Worker client model; no committed observation replays the multi-tab fan-out yet.", "Upstream documentation (`@firebase/messaging` 0.12.26 + W3C Service Worker `Clients` model); no observation yet. Candidate probe: open two tabs on one registration and deliver with one tab visible, then with both hidden — assert `onMessage` fires once per visible tab and `onBackgroundMessage` fires exactly once on the shared worker."] }, { "feature": "onChildAdded", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onChildAdded is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "onChildMoved is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OnDisconnect is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "onDisconnect", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "onDisconnect is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["**Divergence (pending fix):** clean `goOffline`, app deletion, playground `pagehide`, and best-effort MessagePort close drain queued operations, but unannounced total renderer/process loss is not guaranteed by the in-memory sandbox", "Oracle `rtdb-modular-ondisconnect-abrupt-exit` proves Firebase executes an acknowledged registration after forced writer termination. The two-port worker integration exercises `goOffline`, served-app deletion, and non-persisted `pagehide`; browser MessagePort close delivery cannot prove total-process loss without durable host-owned leases."] }, { "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": "unverified", "assurance": "qualified", "summary": "onMessage is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["When several window clients (browser tabs) of one origin share a single service-worker registration, a foreground delivery reaches every visible tab through `onMessage`, and when no tab is visible the one shared service worker receives the message once through `onBackgroundMessage` (the worker is shared across tabs, not instantiated per tab). A notification click focuses a single existing client rather than opening a duplicate. Stated from the FCM web SDK and the Service Worker client model; no committed observation replays the multi-tab fan-out yet.", "Upstream documentation (`@firebase/messaging` 0.12.26 + W3C Service Worker `Clients` model); no observation yet. Candidate probe: open two tabs on one registration and deliver with one tab visible, then with both hidden — assert `onMessage` fires once per visible tab and `onBackgroundMessage` fires exactly once on the shared worker.", "A single user or app can hold several registration tokens at once — one per browser, profile, or device. A token-targeted send reaches exactly one token; a topic, condition, or multicast send fans out independently to every subscribed token, with no server-side de-duplication across a user’s devices, so each device receives its own copy. Stated from the FCM targeting model; no committed observation replays cross-device fan-out yet.", "Upstream documentation (FCM targeting model); no observation yet. Candidate probe: mint two distinct tokens, subscribe both to one topic, send once, and assert each token receives the message independently."] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onSnapshotResume is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onSnapshotsInSync", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onSnapshotsInSync is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "onValue", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "onValue is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "operator.add is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.and is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.div is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.div", "surface": "rtdb-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.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": "conforms", "assurance": "eligible", "summary": "operator.gt is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.gte is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.in is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.index is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.is is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.is", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.is is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.looseEq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.looseEq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.looseNeq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.looseNeq is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.lt is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.lte is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.member is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.mod is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.mod", "surface": "storage-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.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": "conforms", "assurance": "eligible", "summary": "operator.mul is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.neg is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.not is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.or is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.slice is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.slice", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.slice is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.strictEq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.strictEq is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.strictNeq", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "operator.strictNeq is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.sub is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "operator.ternary is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "operator.ternary", "surface": "storage-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.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": "conforms", "assurance": "eligible", "summary": "operator.unary-minus is available, has conforms fidelity, and is eligible 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": "orderBy", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderBy is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "orderBy", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderBy is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "orderBy", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "orderByDescending", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderByDescending is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "OrderByDirection", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "OrderByDirection is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "orderByPriority is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "orderByValue", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "orderByValue is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Production rejects an unindexed `orderByValue() + limitToFirst(N)` query; the sandbox does not enforce `.indexOn` and returns the N smallest primitive values", "Oracle `rtdb-modular-orderbyvalue-numeric` captures production's `Index not defined` rejection; `unit:modular/oracle-conformance-queries.test.ts` pins that rejection beside the sandbox's successful `[10,20,30]` window.", "Production enforces `.indexOn: '.value'` for `orderByValue()` while the sandbox executes the value ordering without index enforcement", "Oracle `rtdb-modular-orderbyvalue-numeric` rejects the unindexed production query; `unit:modular/oracle-conformance-queries.test.ts` pins the sandbox's successful ordered result instead of treating that contradiction as conformance."] }, { "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": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "parent is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "parent", "surface": "rtdb", "importPaths": [], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "parent is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PartialWithFieldValue is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "path is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "path.bind", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "path.bind is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "path-variable is available, has conforms fidelity, and is eligible 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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "PersistentCacheIndexManager is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "PersistentCacheSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentCacheSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentLocalCache is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentMultipleTabManager is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentSingleTabManager is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "PersistentSingleTabManagerSettings", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "PersistentSingleTabManagerSettings is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "Primitive is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "Query 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": "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:** `DatabaseReference` and `Query` equality includes database target, path, and canonical query parameters like Firebase, but `toJSON()` serializes the local `sandbox://rtdb/...` identity instead of Firebase's HTTPS database URL.", "Oracle `rtdb-modular-reference-shape-url` captures conforming equality plus HTTPS JSON serialization; `unit:modular/oracle-conformance-reference-writes.test.ts` pins both the production HTTPS shape and the sandbox's `sandbox://` boundary."] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryCompositeFilterConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryConstraint", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraint is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryConstraintType", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraintType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryConstraintType", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryConstraintType is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryDocumentSnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryDocumentSnapshot is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "queryDocumentSnapshot", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "queryDocumentSnapshot is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryEndAtConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryEndAtConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "queryEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "queryEqual is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryFieldFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryFieldFilterConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryFilterConstraint is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryLimitConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryLimitConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryNonFilterConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "QueryNonFilterConstraint is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "QueryOrderByConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryOrderByConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QuerySnapshot", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QuerySnapshot is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "querySnapshotFromJSON", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "querySnapshotFromJSON is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "querySnapshotsSequence", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "querySnapshotsSequence is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "QueryStartAtConstraint", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "QueryStartAtConstraint is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "diverged", "assurance": "qualified", "summary": "ref is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Cold production clients may invoke the update fn first with speculative `null` and then with the current seeded value; the always-warm in-process sandbox invokes it once with the current value", "Oracle `rtdb-modular-runtransaction-current-value-arg` captures two seeded-path production invocations (`null`, then current); `unit:modular/oracle-conformance-transactions.test.ts` pins the sandbox's single current-value invocation. The separate warm-client observation matches the sandbox but does not erase the cold-client contract.", "**Divergence:** `DatabaseReference` and `Query` equality includes database target, path, and canonical query parameters like Firebase, but `toJSON()` serializes the local `sandbox://rtdb/...` identity instead of Firebase's HTTPS database URL.", "Oracle `rtdb-modular-reference-shape-url` captures conforming equality plus HTTPS JSON serialization; `unit:modular/oracle-conformance-reference-writes.test.ts` pins both the production HTTPS shape and the sandbox's `sandbox://` boundary."] }, { "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": "reference", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "reference 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": ["**Divergence:** `refFromURL(db, url)` matches Firebase's path parsing, query ignoring, FTP-to-database normalization, and fragment rejection, but the single-database sandbox does not validate the URL host/namespace against the handle; Firebase rejects a mismatched host while the sandbox uses its path.", "Oracle `rtdb-modular-reference-shape-url` captures accepted FTP/query URLs and rejected fragments, malformed URLs, and host mismatches; `unit:modular/oracle-conformance-reference-writes.test.ts` pins the conforming validations plus both sides of the host divergence."] }, { "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": "conforms", "assurance": "eligible", "summary": "request.query is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "request.resource.id is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "resource is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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.generation", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.generation is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["Production types resource.generation as an int; exact comparison succeeds and an absent field errors and denies."] }, { "feature": "resource.id", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.id is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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.metageneration", "surface": "storage-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "resource.metageneration is available, has conforms fidelity, and is eligible for assurance.", "caveats": ["Production types resource.metageneration as an int; captured together with generation on the existing-object binding."] }, { "feature": "resource.__name__", "surface": "firestore-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": [] }, { "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": "conforms", "assurance": "eligible", "summary": "root is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "root", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "root is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "rule-kind.indexOn is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "rule-kind.location-wildcard is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "rule-kind.read is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "rule-kind.validate is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "rule-kind.write", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "rule-kind.write is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "runTransaction is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "runTransaction", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "runTransaction is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Catches optimistic locking conflicts and re-executes handler up to maxAttempts.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "feature": "runTransaction", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "runTransaction is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Catches optimistic locking conflicts and re-executes handler up to maxAttempts.", "com.google.firebase.firestore specification; unverified locally."] }, { "feature": "runTransaction", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "runTransaction is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "runTransaction", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "runTransaction is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Cold production clients may invoke the update fn first with speculative `null` and then with the current seeded value; the always-warm in-process sandbox invokes it once with the current value", "Oracle `rtdb-modular-runtransaction-current-value-arg` captures two seeded-path production invocations (`null`, then current); `unit:modular/oracle-conformance-transactions.test.ts` pins the sandbox's single current-value invocation. The separate warm-client observation matches the sandbox but does not erase the cold-client contract.", "**Divergence:** two ordinary concurrent `runTransaction` calls are serialized by the in-process backend, so their update functions are not retried with Firebase's captured contention counts. A synchronous re-entrant conflicting write does trigger a deterministic retry.", "Oracle `rtdb-modular-concurrent-transforms` captures invocation counts [2, 3]; `unit:modular/transaction-contention-cdd.test.ts` pins the sandbox's [1, 1] ordinary-concurrency boundary and separately covers its deterministic re-entrant retry seam.", "A cold production client can call the update fn with speculative `null` before the current seeded value; the always-warm sandbox calls it once with the current value", "Oracle `rtdb-modular-runtransaction-current-value-arg` captures the cold two-call sequence and `rtdb-modular-runtransaction-warm-client-speculation` captures the matching warm one-call case; `unit:modular/oracle-conformance-transactions.test.ts` pins both sides.", "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)", "Oracle `rtdb-modular-concurrent-transforms` captures callback counts [2, 3] across two clients; the synchronous in-process backend serializes the same ordinary calls with [1, 1], pinned by `unit:modular/transaction-contention-cdd.test.ts`."] }, { "feature": "runTransactionAsync", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "runTransactionAsync is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "runTransactionWithOptions", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "runTransactionWithOptions is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "semantic.read-cascade is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "semantic.regex-literal is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "semantic.validate-non-cascade is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "semantic.write-cascade", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "semantic.write-cascade is available, has conforms fidelity, and is eligible 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": "unsupported", "assurance": "ineligible", "summary": "send is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["FCM enforces project-level send quotas and per-target rate limits (per-device and per-topic message rates) accounted on Google servers over rolling windows; exceeding them yields quota / rate-limit rejections. The admin error taxonomy names these as `MessagingClientErrorCode.MESSAGE_RATE_EXCEEDED`, `DEVICE_MESSAGE_RATE_EXCEEDED`, and `TOPICS_MESSAGE_RATE_EXCEEDED` (wire `QUOTA_EXCEEDED` / `RESOURCE_EXHAUSTED`, HTTP 429). Stated from FCM quota documentation; the sandbox has no global quota ledger to model.", "Upstream documentation (FCM quotas and `MessagingClientErrorCode` rate-limit members, firebase-admin 13.10.0); no observation. This behavior is out of sandbox scope (see the row disposition).", "The admin SDK retries transient send-transport failures — connection errors and HTTP 5xx / `SERVER_UNAVAILABLE` / `INTERNAL` responses — with backoff before surfacing the error to the caller, so a caller sees a resolved send or a terminal error rather than every intermediate failure. `enableLegacyHttpTransport` switches `sendEach` / `sendEachForMulticast` from HTTP/2 to HTTP/1.1, changing multiplexing and the retry/transport path. Stated from the admin SDK and google-auth transport documentation; no committed observation replays the retry count or backoff schedule yet.", "Upstream documentation (firebase-admin 13.10.0 send transport + google-auth retry defaults); no observation yet. Candidate probe: point the send transport at a fault-injecting stub that returns 503 then 200 and record the retry count and backoff intervals before the resolved send.", "When a target device is offline FCM stores the message and delivers it on reconnect, up to its time-to-live (`android.ttl`, APNs expiration, webpush `headers.TTL`; the legacy default is 2419200 seconds / four weeks). A collapse key (`android.collapseKey`, `collapseKey`) marks a message as collapsible so a newer collapsible message replaces an older still-undelivered one, and only the last is delivered on reconnect; a message whose TTL elapses before reconnect is dropped rather than delivered. Stated from FCM message-lifecycle documentation; no committed observation replays store-and-forward, collapse, or TTL expiry yet.", "Upstream documentation (FCM message lifecycle: TTL, collapse keys, store-and-forward); no observation yet. Candidate probe: send several collapsible messages to a token whose web client is offline, bring it online within TTL, and assert only the last collapsible message is delivered; separately, let a short-TTL message expire before reconnect and assert it is dropped."] }, { "feature": "sendEach", "surface": "messaging-admin", "importPaths": ["pyric-admin/messaging"], "evidenceSlug": "messaging-compat", "availability": "available", "fidelity": "unsupported", "assurance": "ineligible", "summary": "sendEach is available, has unsupported fidelity, and is ineligible for assurance.", "caveats": ["FCM enforces project-level send quotas and per-target rate limits (per-device and per-topic message rates) accounted on Google servers over rolling windows; exceeding them yields quota / rate-limit rejections. The admin error taxonomy names these as `MessagingClientErrorCode.MESSAGE_RATE_EXCEEDED`, `DEVICE_MESSAGE_RATE_EXCEEDED`, and `TOPICS_MESSAGE_RATE_EXCEEDED` (wire `QUOTA_EXCEEDED` / `RESOURCE_EXHAUSTED`, HTTP 429). Stated from FCM quota documentation; the sandbox has no global quota ledger to model.", "Upstream documentation (FCM quotas and `MessagingClientErrorCode` rate-limit members, firebase-admin 13.10.0); no observation. This behavior is out of sandbox scope (see the row disposition)."] }, { "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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "serverTimestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "serverTimestamp", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "serverTimestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "serverTimestamp", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "serverTimestampPropertyWrapper", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "serverTimestampPropertyWrapper is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Property wrapper encoding nil as serverTimestamp sentinel on write.", "FirebaseFirestore Swift specification; unverified locally."] }, { "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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "set.difference", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "set.difference is available, has conforms fidelity, and is eligible 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.hasAll", "surface": "storage-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": ["Production and the local Storage evaluator accept hasAll() on the set returned by custom-metadata keys(); replayed by the Storage upload-boundary corpus."] }, { "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": "conforms", "assurance": "eligible", "summary": "set.intersection is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "set.union is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setData", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setData is available, has conforms fidelity, and is eligible 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": "setDataMerge", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setDataMerge is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setDataMergeFields", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setDataMergeFields 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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setIndexConfiguration is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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 sandbox`'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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setPriority is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setRules", "surface": "firestore", "importPaths": [], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setRules is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "settings", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "settings is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "settings", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "settings is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "settings", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "settings is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "setWithPriority", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "setWithPriority is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "size is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "snapshot.child is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.exists", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.exists is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.getPriority", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.getPriority is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.hasChild", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.hasChild is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.hasChildren", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.hasChildren is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.isBoolean", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.isBoolean is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.isNumber", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.isNumber is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.isString", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.isString is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.parent", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.parent is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshot.val", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshot.val is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshotDocumentID", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshotDocumentID is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshotEqual", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshotEqual is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "SnapshotMetadata is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshotMetadata", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshotMetadata is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "SnapshotOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "SnapshotOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "snapshots", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshots is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshots", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "snapshots is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "snapshotsInSync", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshotsInSync is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Emits an event when all active listeners have caught up to the same state.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "feature": "snapshotsInSync", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "snapshotsInSync is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Notifies when all active snapshot listeners are in sync with server state.", "com.google.firebase.firestore specification; unverified locally."] }, { "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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAfter is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAfter", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAfter is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAfter", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "startAfterDocument", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAfterDocument 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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAt", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAt is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAt", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "startAtDocument", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAtDocument is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "startAtDocument", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "startAtDocument 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": "conforms", "assurance": "eligible", "summary": "string.beginsWith is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.contains", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.contains is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.endsWith", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.endsWith is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.length", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.length is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "string.matches is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "string.replace is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "string.split is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.toLowerCase", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.toLowerCase is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "string.toUpperCase", "surface": "rtdb-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "string.toUpperCase is available, has conforms fidelity, and is eligible 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": "conforms", "assurance": "eligible", "summary": "string.toUtf8 is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "subscript", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "subscript 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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskEvent is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "TaskState", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskState is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "TaskState", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TaskState is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "conforms", "assurance": "eligible", "summary": "terminate is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "terminate", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "terminate is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "terminate", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "terminate is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "terminate", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "terminate is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Timestamp is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "Timestamp", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-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", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "toObject", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "toObject 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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "Transaction is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "transaction", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transaction is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "transaction", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transaction is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "transaction", "surface": "firestore-rules", "importPaths": [], "evidenceSlug": "rules-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transaction is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "transactionDeleteDocument", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transactionDeleteDocument is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "transactionGetDocument", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transactionGetDocument is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TransactionOptions", "surface": "firestore", "importPaths": ["pyric/firestore"], "evidenceSlug": "firestore-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "TransactionOptions", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionOptions is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "transactionOptionsMaxAttempts", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transactionOptionsMaxAttempts is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "TransactionResult", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "TransactionResult is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "transactionSetData", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transactionSetData is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "transactionSetDataMerge", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transactionSetDataMerge is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "transactionSetDataMergeFields", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transactionSetDataMergeFields is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "transactionUpdateData", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "transactionUpdateData is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UnionToIntersection is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "update is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "update", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "update is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "update", "surface": "rtdb", "importPaths": ["pyric/database"], "evidenceSlug": "database-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "update is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UpdateData is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "updateData", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "updateData is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "available", "fidelity": "diverged", "assurance": "qualified", "summary": "uploadBytesResumable is available, has diverged fidelity, and is qualified for assurance.", "caveats": ["Exported by `firebase/storage`; returns an `UploadTask` with `pause()` / `resume()` / `cancel()`", "`unit:resumable-upload.test.ts` confirms `uploadBytesResumable(ref, data)` returns an `UploadTask` supporting `pause()`, `resume()`, and `cancel()` over synthetic microtask steps.", "`task.on('state_changed', next, error, complete)` fires `next` with `{bytesTransferred, totalBytes, state}` snapshots", "`unit:resumable-upload.test.ts` confirms synthetic progress snapshots are emitted during task execution without requiring network transfer.", "`task.pause()` flips `state` to `'paused'`; `task.resume()` continues", "`unit:resumable-upload.test.ts` confirms calling `task.pause()` and `task.resume()` transitions through `'paused'` and `'running'` states deterministically.", "`task.cancel()` rejects the upload with `storage/canceled`", "`unit:resumable-upload.test.ts` confirms cancellation rejects with `storage/canceled` and leaves no falsely completed object in storage."] }, { "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadTask is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "feature": "UploadTaskSnapshot", "surface": "storage", "importPaths": ["pyric/storage"], "evidenceSlug": "storage-compat", "availability": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "UploadTaskSnapshot is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "useEmulator", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "useEmulator is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "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": "vector", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-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": "conforms", "assurance": "eligible", "summary": "waitForPendingWrites is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "waitForPendingWrites", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "waitForPendingWrites is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Resolves when all locally initiated writes have been committed by the server.", "cloud_firestore_platform_interface specification; unverified locally."] }, { "feature": "waitForPendingWrites", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "waitForPendingWrites is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Resolves when all locally initiated writes have been committed by the server.", "com.google.firebase.firestore specification; unverified locally."] }, { "feature": "waitForPendingWrites", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "unverified", "assurance": "qualified", "summary": "waitForPendingWrites is available, has unverified fidelity, and is qualified for assurance.", "caveats": ["Awaits backend acknowledgment of all pending local writes.", "FirebaseFirestore Swift specification; unverified locally."] }, { "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": "where", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "where is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "where", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "where is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereArrayContains", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereArrayContains is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereArrayContainsAny", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereArrayContainsAny is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereEqualTo", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereEqualTo is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereFieldArrayContains", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereFieldArrayContains is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereFieldArrayContainsAny", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereFieldArrayContainsAny is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereFieldEqualTo", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereFieldEqualTo is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereFieldGreaterThan", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereFieldGreaterThan is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereFieldGreaterThanOrEqualTo", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereFieldGreaterThanOrEqualTo is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereFieldIn", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereFieldIn is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereFieldLessThan", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereFieldLessThan is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereFieldLessThanOrEqualTo", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereFieldLessThanOrEqualTo is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereFieldNotEqualTo", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereFieldNotEqualTo is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereFieldNotIn", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereFieldNotIn is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereFilter", "surface": "firestore-swift", "importPaths": [], "evidenceSlug": "firestore-swift-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereFilter 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": "whereGreaterThan", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereGreaterThan is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereIn", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereIn is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereIn", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereIn is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereLessThan", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereLessThan is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereNotEqualTo", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereNotEqualTo is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereNotIn", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereNotIn is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "whereNotIn", "surface": "firestore-kotlin", "importPaths": [], "evidenceSlug": "firestore-kotlin-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "whereNotIn is available, has conforms fidelity, and is eligible for assurance.", "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": "available", "fidelity": "not-applicable", "assurance": "not-applicable", "summary": "WithFieldValue is available, has no applicable behavior claim, and has no assurance classification.", "caveats": [] }, { "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": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "writeBatch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }, { "feature": "writeBatch", "surface": "firestore-flutter", "importPaths": [], "evidenceSlug": "firestore-flutter-compat", "availability": "available", "fidelity": "conforms", "assurance": "eligible", "summary": "writeBatch is available, has conforms fidelity, and is eligible for assurance.", "caveats": [] }];
|
|
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. */
|