@pyric/cli 0.1.0-alpha.14 → 0.1.0-alpha.16

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.
Files changed (606) hide show
  1. package/dist/assurance/.generated/conformance-verdicts.d.ts +120 -75
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  3. package/dist/assurance/.generated/conformance-verdicts.js +120 -75
  4. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  5. package/dist/bridge/client/dispatch.js +1 -1
  6. package/dist/bridge/client/dispatch.js.map +1 -1
  7. package/dist/cli/serve.d.ts +1 -1
  8. package/dist/cli/serve.d.ts.map +1 -1
  9. package/dist/cli/serve.js +207 -284
  10. package/dist/cli/serve.js.map +1 -1
  11. package/dist/cli/service-command-records/database-rules-generate.d.ts +4 -0
  12. package/dist/cli/service-command-records/database-rules-generate.d.ts.map +1 -0
  13. package/dist/cli/service-command-records/database-rules-generate.js +3 -0
  14. package/dist/cli/service-command-records/database-rules-generate.js.map +1 -0
  15. package/dist/cli/service-command-records/database-rules-lint.d.ts +4 -0
  16. package/dist/cli/service-command-records/database-rules-lint.d.ts.map +1 -0
  17. package/dist/cli/service-command-records/database-rules-lint.js +3 -0
  18. package/dist/cli/service-command-records/database-rules-lint.js.map +1 -0
  19. package/dist/cli/service-command-records/database-rules-simulate.d.ts +4 -0
  20. package/dist/cli/service-command-records/database-rules-simulate.d.ts.map +1 -0
  21. package/dist/cli/service-command-records/database-rules-simulate.js +3 -0
  22. package/dist/cli/service-command-records/database-rules-simulate.js.map +1 -0
  23. package/dist/cli/service-command-records/database-rules-validate.d.ts +4 -0
  24. package/dist/cli/service-command-records/database-rules-validate.d.ts.map +1 -0
  25. package/dist/cli/service-command-records/database-rules-validate.js +3 -0
  26. package/dist/cli/service-command-records/database-rules-validate.js.map +1 -0
  27. package/dist/cli/service-command-records/firestore-indexes-generate.d.ts +4 -0
  28. package/dist/cli/service-command-records/firestore-indexes-generate.d.ts.map +1 -0
  29. package/dist/cli/service-command-records/firestore-indexes-generate.js +3 -0
  30. package/dist/cli/service-command-records/firestore-indexes-generate.js.map +1 -0
  31. package/dist/cli/service-command-records/firestore-rules-lint.d.ts +4 -0
  32. package/dist/cli/service-command-records/firestore-rules-lint.d.ts.map +1 -0
  33. package/dist/cli/service-command-records/firestore-rules-lint.js +3 -0
  34. package/dist/cli/service-command-records/firestore-rules-lint.js.map +1 -0
  35. package/dist/cli/service-command-records/firestore-rules-resolve.d.ts +4 -0
  36. package/dist/cli/service-command-records/firestore-rules-resolve.d.ts.map +1 -0
  37. package/dist/cli/service-command-records/firestore-rules-resolve.js +3 -0
  38. package/dist/cli/service-command-records/firestore-rules-resolve.js.map +1 -0
  39. package/dist/cli/service-command-records/firestore-rules-simulate.d.ts +4 -0
  40. package/dist/cli/service-command-records/firestore-rules-simulate.d.ts.map +1 -0
  41. package/dist/cli/service-command-records/firestore-rules-simulate.js +3 -0
  42. package/dist/cli/service-command-records/firestore-rules-simulate.js.map +1 -0
  43. package/dist/cli/service-command-records/firestore-rules-validate.d.ts +4 -0
  44. package/dist/cli/service-command-records/firestore-rules-validate.d.ts.map +1 -0
  45. package/dist/cli/service-command-records/firestore-rules-validate.js +3 -0
  46. package/dist/cli/service-command-records/firestore-rules-validate.js.map +1 -0
  47. package/dist/cli/service-command-records/storage-rules-lint.d.ts +4 -0
  48. package/dist/cli/service-command-records/storage-rules-lint.d.ts.map +1 -0
  49. package/dist/cli/service-command-records/storage-rules-lint.js +3 -0
  50. package/dist/cli/service-command-records/storage-rules-lint.js.map +1 -0
  51. package/dist/cli/service-command-records/storage-rules-simulate.d.ts +4 -0
  52. package/dist/cli/service-command-records/storage-rules-simulate.d.ts.map +1 -0
  53. package/dist/cli/service-command-records/storage-rules-simulate.js +3 -0
  54. package/dist/cli/service-command-records/storage-rules-simulate.js.map +1 -0
  55. package/dist/cli/service-commands.d.ts +7 -0
  56. package/dist/cli/service-commands.d.ts.map +1 -1
  57. package/dist/cli/service-commands.generated.d.ts +35 -0
  58. package/dist/cli/service-commands.generated.d.ts.map +1 -0
  59. package/dist/cli/service-commands.generated.js +25 -0
  60. package/dist/cli/service-commands.generated.js.map +1 -0
  61. package/dist/cli/service-commands.js +23 -40
  62. package/dist/cli/service-commands.js.map +1 -1
  63. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  64. package/dist/conformance/.generated/can-i-use-browser.js +1 -1
  65. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  66. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  67. package/dist/conformance/.generated/can-i-use.js +1 -1
  68. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  69. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  70. package/dist/conformance/.generated/conformance-docs.js +1 -1
  71. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  72. package/dist/functions-rtdb/development-runtime.d.ts +63 -0
  73. package/dist/functions-rtdb/development-runtime.d.ts.map +1 -0
  74. package/dist/functions-rtdb/development-runtime.js +244 -0
  75. package/dist/functions-rtdb/development-runtime.js.map +1 -0
  76. package/dist/serve/bridge-mount.d.ts +32 -2
  77. package/dist/serve/bridge-mount.d.ts.map +1 -1
  78. package/dist/serve/bridge-mount.js +232 -18
  79. package/dist/serve/bridge-mount.js.map +1 -1
  80. package/dist/serve/bundler.d.ts +2 -18
  81. package/dist/serve/bundler.d.ts.map +1 -1
  82. package/dist/serve/bundler.js +7 -35
  83. package/dist/serve/bundler.js.map +1 -1
  84. package/dist/serve/entries/app-client.d.ts.map +1 -1
  85. package/dist/serve/entries/app-client.js +5 -5
  86. package/dist/serve/entries/app-client.js.map +1 -1
  87. package/dist/serve/entries/auth-helper-core.d.ts +32 -6
  88. package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
  89. package/dist/serve/entries/auth-helper-core.js +82 -24
  90. package/dist/serve/entries/auth-helper-core.js.map +1 -1
  91. package/dist/serve/entries/auth.d.ts.map +1 -1
  92. package/dist/serve/entries/auth.js +6 -4
  93. package/dist/serve/entries/auth.js.map +1 -1
  94. package/dist/serve/entries/database.d.ts +28 -0
  95. package/dist/serve/entries/database.d.ts.map +1 -1
  96. package/dist/serve/entries/database.js +95 -26
  97. package/dist/serve/entries/database.js.map +1 -1
  98. package/dist/serve/entries/init.d.ts.map +1 -1
  99. package/dist/serve/entries/init.js +21 -12
  100. package/dist/serve/entries/init.js.map +1 -1
  101. package/dist/serve/html-injection.d.ts +5 -0
  102. package/dist/serve/html-injection.d.ts.map +1 -0
  103. package/dist/serve/html-injection.js +59 -0
  104. package/dist/serve/html-injection.js.map +1 -0
  105. package/dist/serve/namespace.d.ts +6 -22
  106. package/dist/serve/namespace.d.ts.map +1 -1
  107. package/dist/serve/namespace.js +23 -145
  108. package/dist/serve/namespace.js.map +1 -1
  109. package/dist/serve/runtime/worker-replacement.d.ts +1 -2
  110. package/dist/serve/runtime/worker-replacement.d.ts.map +1 -1
  111. package/dist/serve/sandbox-session.d.ts +78 -0
  112. package/dist/serve/sandbox-session.d.ts.map +1 -0
  113. package/dist/serve/sandbox-session.js +171 -0
  114. package/dist/serve/sandbox-session.js.map +1 -0
  115. package/dist/serve/server.d.ts +5 -2
  116. package/dist/serve/server.d.ts.map +1 -1
  117. package/dist/serve/server.js +21 -5
  118. package/dist/serve/server.js.map +1 -1
  119. package/dist/serve/site-tree.d.ts +8 -0
  120. package/dist/serve/site-tree.d.ts.map +1 -0
  121. package/dist/serve/site-tree.js +113 -0
  122. package/dist/serve/site-tree.js.map +1 -0
  123. package/dist/serve/site-ui/_astro/RulesCodeEditor.CzwHdCi9.js +23 -0
  124. package/dist/serve/site-ui/_astro/_example_.jevZ7OdV.css +1 -0
  125. package/dist/serve/site-ui/_astro/_slug_.BoKXYrnu.css +1 -0
  126. package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +1 -0
  127. package/dist/serve/site-ui/_astro/app.4HeLP_FA.js +109 -0
  128. package/dist/serve/site-ui/_astro/app.BgSnCR5G.js +1 -0
  129. package/dist/serve/site-ui/_astro/app.BsFsMjn0.css +1 -0
  130. package/dist/serve/site-ui/_astro/chess-showcase.CnoxIle5.js +1 -0
  131. package/dist/serve/site-ui/_astro/chess-source-explorer.C5k9c5yK.js +1 -0
  132. package/dist/serve/site-ui/_astro/chess-v2.CFHmd3UL.js +354 -0
  133. package/dist/serve/site-ui/_astro/client.D2ORs4B-.js +25 -0
  134. package/dist/serve/site-ui/_astro/example-runtime.R1d96L6-.js +291 -0
  135. package/dist/serve/site-ui/_astro/index.BJiOemMX.js +1 -0
  136. package/dist/serve/site-ui/_astro/index.DBy5LfQW.js +9 -0
  137. package/dist/serve/site-ui/_astro/index.DNyk7q8W.js +9 -0
  138. package/dist/serve/site-ui/_astro/jsx-runtime.D_zvdyIk.js +9 -0
  139. package/dist/serve/site-ui/_astro/reads.BrKNdKAa.js +1 -0
  140. package/dist/serve/site-ui/_astro/sandbox-controls.BTb3EbQp.js +1153 -0
  141. package/dist/serve/site-ui/_astro/seed.EyI3VYEu.js +20 -0
  142. package/dist/serve/site-ui/auth/index.html +11 -0
  143. package/dist/serve/site-ui/docs/_rhythm/index.html +100 -0
  144. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +43 -0
  145. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +26 -0
  146. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +70 -0
  147. package/dist/serve/{docs-ui → site-ui}/docs/ai-compat/index.html +3 -3
  148. package/dist/serve/site-ui/docs/api-reference/index.html +68 -0
  149. package/dist/serve/{docs-ui → site-ui}/docs/app-compat/index.html +3 -3
  150. package/dist/serve/{docs-ui → site-ui}/docs/auth-compat/index.html +3 -3
  151. package/dist/serve/site-ui/docs/build/ai-logic/index.html +64 -0
  152. package/dist/serve/site-ui/docs/build/authentication/index.html +66 -0
  153. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +84 -0
  154. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +71 -0
  155. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +66 -0
  156. package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-storage.md +2 -2
  157. package/dist/serve/site-ui/docs/build/realtime-database/index.html +67 -0
  158. package/dist/serve/site-ui/docs/conformance-scores/index.html +50 -0
  159. package/dist/serve/{docs-ui → site-ui}/docs/conformance-scores.md +3 -3
  160. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +531 -0
  161. package/dist/serve/{docs-ui → site-ui}/docs/database-compat/index.html +211 -168
  162. package/dist/serve/{docs-ui → site-ui}/docs/database-compat.md +208 -170
  163. package/dist/serve/site-ui/docs/examples/chess/index.html +384 -0
  164. package/dist/serve/site-ui/docs/examples/chess.md +57 -0
  165. package/dist/serve/site-ui/docs/examples/index.html +3 -0
  166. package/dist/serve/site-ui/docs/examples.md +4 -0
  167. package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat/index.html +55 -91
  168. package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat.md +52 -88
  169. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +73 -0
  170. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +29 -0
  171. package/dist/serve/site-ui/docs/get-started/start-building/index.html +33 -0
  172. package/dist/serve/{docs-ui → site-ui}/docs/index.json +595 -26
  173. package/dist/serve/site-ui/docs/messaging-compat/index.html +324 -0
  174. package/dist/serve/{docs-ui → site-ui}/docs/messaging-compat.md +71 -1
  175. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +28 -0
  176. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +74 -0
  177. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +45 -0
  178. package/dist/serve/site-ui/docs/overview/index.html +17 -0
  179. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +186 -0
  180. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api/index.html +4 -4
  181. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api/index.html +4 -4
  182. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api/index.html +318 -202
  183. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api.md +154 -27
  184. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api/index.html +5 -5
  185. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +318 -0
  186. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api/index.html +5 -5
  187. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +160 -0
  188. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +425 -0
  189. package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api/index.html +6 -6
  190. package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api.md +1 -1
  191. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +60 -0
  192. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api/index.html +4 -4
  193. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api/index.html +4 -4
  194. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +507 -0
  195. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +258 -0
  196. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +51 -0
  197. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +308 -0
  198. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +68 -0
  199. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api/index.html +4 -4
  200. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +11 -0
  201. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api/index.html +4 -4
  202. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api/index.html +1186 -1384
  203. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api.md +817 -1291
  204. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api/index.html +4 -4
  205. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +126 -0
  206. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-vite-reference-api.md +1 -1
  207. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +2641 -0
  208. package/dist/serve/{docs-ui → site-ui}/docs/pyric-database-reference-api.md +1055 -158
  209. package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api/index.html +311 -249
  210. package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api.md +72 -54
  211. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +509 -0
  212. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +182 -0
  213. package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api/index.html +7 -26
  214. package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api.md +13 -23
  215. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +121 -0
  216. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +203 -0
  217. package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api/index.html +26 -5
  218. package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api.md +22 -22
  219. package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api/index.html +5 -15
  220. package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api.md +0 -13
  221. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +639 -0
  222. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +100 -0
  223. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api/index.html +4 -4
  224. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +24 -0
  225. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api/index.html +4 -4
  226. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +136 -0
  227. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api/index.html +7 -7
  228. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api.md +4 -4
  229. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api/index.html +4 -4
  230. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api/index.html +4 -4
  231. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +16 -0
  232. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api/index.html +4 -4
  233. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +176 -0
  234. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api/index.html +10 -11
  235. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api.md +7 -8
  236. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +188 -0
  237. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api/index.html +4 -4
  238. package/dist/serve/{docs-ui → site-ui}/docs/rules-compat/index.html +87 -57
  239. package/dist/serve/{docs-ui → site-ui}/docs/rules-compat.md +84 -54
  240. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +51 -0
  241. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +106 -0
  242. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +41 -0
  243. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +67 -0
  244. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +159 -0
  245. package/dist/serve/{docs-ui → site-ui}/docs/secure/rules-standard-library.md +2 -2
  246. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +47 -0
  247. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +95 -0
  248. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +82 -0
  249. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +37 -0
  250. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +75 -0
  251. package/dist/serve/{docs-ui → site-ui}/docs/storage-compat/index.html +8 -8
  252. package/dist/serve/{docs-ui → site-ui}/docs/storage-compat.md +5 -5
  253. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +132 -0
  254. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +861 -0
  255. package/dist/serve/site-ui/docs/trust/rules-standard-library.md +344 -0
  256. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +582 -0
  257. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research.md +448 -0
  258. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +14 -0
  259. package/dist/serve/{docs-ui → site-ui}/docs/tutorial/index.html +4 -4
  260. package/dist/serve/{docs-ui → site-ui}/docs/tutorial.md +1 -1
  261. package/dist/serve/site-ui/examples/chess/index.html +2 -0
  262. package/dist/serve/site-ui/examples/firestore-first-write/index.html +2 -0
  263. package/dist/serve/site-ui/firestore/index.html +11 -0
  264. package/dist/serve/site-ui/index.html +11 -0
  265. package/dist/serve/{docs-ui → site-ui}/llms.txt +6 -2
  266. package/dist/serve/site-ui/rtdb/index.html +11 -0
  267. package/dist/serve/site-ui/settings/index.html +11 -0
  268. package/dist/serve/site-ui/storage/index.html +11 -0
  269. package/dist/serve/site-ui/studio-routes.json +1 -0
  270. package/dist/serve/site-ui/traffic/index.html +11 -0
  271. package/dist/serve/standalone-assets.d.ts +4 -10
  272. package/dist/serve/standalone-assets.d.ts.map +1 -1
  273. package/dist/serve/standalone-assets.js +8 -21
  274. package/dist/serve/standalone-assets.js.map +1 -1
  275. package/dist/serve/vite-functions-development.d.ts +29 -0
  276. package/dist/serve/vite-functions-development.d.ts.map +1 -0
  277. package/dist/serve/vite-functions-development.js +150 -0
  278. package/dist/serve/vite-functions-development.js.map +1 -0
  279. package/dist/serve/vite-generation-bridge.d.ts +17 -0
  280. package/dist/serve/vite-generation-bridge.d.ts.map +1 -0
  281. package/dist/serve/vite-generation-bridge.js +47 -0
  282. package/dist/serve/vite-generation-bridge.js.map +1 -0
  283. package/dist/serve/vite-generation-functions.d.ts +35 -0
  284. package/dist/serve/vite-generation-functions.d.ts.map +1 -0
  285. package/dist/serve/vite-generation-functions.js +46 -0
  286. package/dist/serve/vite-generation-functions.js.map +1 -0
  287. package/dist/serve/vite-generation-middleware.d.ts +10 -0
  288. package/dist/serve/vite-generation-middleware.d.ts.map +1 -0
  289. package/dist/serve/vite-generation-middleware.js +40 -0
  290. package/dist/serve/vite-generation-middleware.js.map +1 -0
  291. package/dist/serve/vite-generation-rules-watch.d.ts +8 -0
  292. package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -0
  293. package/dist/serve/vite-generation-rules-watch.js +33 -0
  294. package/dist/serve/vite-generation-rules-watch.js.map +1 -0
  295. package/dist/serve/vite-module-swap.d.ts +16 -0
  296. package/dist/serve/vite-module-swap.d.ts.map +1 -0
  297. package/dist/serve/vite-module-swap.js +96 -0
  298. package/dist/serve/vite-module-swap.js.map +1 -0
  299. package/dist/serve/vite-page-runtime.d.ts +29 -0
  300. package/dist/serve/vite-page-runtime.d.ts.map +1 -0
  301. package/dist/serve/vite-page-runtime.js +71 -0
  302. package/dist/serve/vite-page-runtime.js.map +1 -0
  303. package/dist/serve/vite-plugin.d.ts +44 -4
  304. package/dist/serve/vite-plugin.d.ts.map +1 -1
  305. package/dist/serve/vite-plugin.js +62 -864
  306. package/dist/serve/vite-plugin.js.map +1 -1
  307. package/dist/serve/vite-sandbox-generation.d.ts +57 -0
  308. package/dist/serve/vite-sandbox-generation.d.ts.map +1 -0
  309. package/dist/serve/vite-sandbox-generation.js +178 -0
  310. package/dist/serve/vite-sandbox-generation.js.map +1 -0
  311. package/dist/serve/worker/client/disconnect.d.ts.map +1 -1
  312. package/dist/serve/worker/client/disconnect.js +2 -0
  313. package/dist/serve/worker/client/disconnect.js.map +1 -1
  314. package/dist/serve/worker/client/handles.d.ts +5 -0
  315. package/dist/serve/worker/client/handles.d.ts.map +1 -1
  316. package/dist/serve/worker/client/handles.js.map +1 -1
  317. package/dist/serve/worker/client/pagehide.d.ts +13 -0
  318. package/dist/serve/worker/client/pagehide.d.ts.map +1 -0
  319. package/dist/serve/worker/client/pagehide.js +19 -0
  320. package/dist/serve/worker/client/pagehide.js.map +1 -0
  321. package/dist/serve/worker/client/rtdb-admin.d.ts +8 -0
  322. package/dist/serve/worker/client/rtdb-admin.d.ts.map +1 -0
  323. package/dist/serve/worker/client/rtdb-admin.js +39 -0
  324. package/dist/serve/worker/client/rtdb-admin.js.map +1 -0
  325. package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts +15 -0
  326. package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts.map +1 -0
  327. package/dist/serve/worker/client/rtdb-connection-lifecycle.js +45 -0
  328. package/dist/serve/worker/client/rtdb-connection-lifecycle.js.map +1 -0
  329. package/dist/serve/worker/client/rtdb-controls.d.ts +6 -0
  330. package/dist/serve/worker/client/rtdb-controls.d.ts.map +1 -0
  331. package/dist/serve/worker/client/rtdb-controls.js +8 -0
  332. package/dist/serve/worker/client/rtdb-controls.js.map +1 -0
  333. package/dist/serve/worker/client/rtdb-listeners.d.ts +24 -0
  334. package/dist/serve/worker/client/rtdb-listeners.d.ts.map +1 -0
  335. package/dist/serve/worker/client/rtdb-listeners.js +262 -0
  336. package/dist/serve/worker/client/rtdb-listeners.js.map +1 -0
  337. package/dist/serve/worker/client/rtdb-reads.d.ts +4 -0
  338. package/dist/serve/worker/client/rtdb-reads.d.ts.map +1 -0
  339. package/dist/serve/worker/client/rtdb-reads.js +11 -0
  340. package/dist/serve/worker/client/rtdb-reads.js.map +1 -0
  341. package/dist/serve/worker/client/rtdb-references.d.ts +19 -0
  342. package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -0
  343. package/dist/serve/worker/client/rtdb-references.js +63 -0
  344. package/dist/serve/worker/client/rtdb-references.js.map +1 -0
  345. package/dist/serve/worker/client/rtdb-snapshots.d.ts +20 -0
  346. package/dist/serve/worker/client/rtdb-snapshots.d.ts.map +1 -0
  347. package/dist/serve/worker/client/rtdb-snapshots.js +64 -0
  348. package/dist/serve/worker/client/rtdb-snapshots.js.map +1 -0
  349. package/dist/serve/worker/client/rtdb-transactions.d.ts +14 -0
  350. package/dist/serve/worker/client/rtdb-transactions.d.ts.map +1 -0
  351. package/dist/serve/worker/client/rtdb-transactions.js +34 -0
  352. package/dist/serve/worker/client/rtdb-transactions.js.map +1 -0
  353. package/dist/serve/worker/client/rtdb-writes.d.ts +8 -0
  354. package/dist/serve/worker/client/rtdb-writes.d.ts.map +1 -0
  355. package/dist/serve/worker/client/rtdb-writes.js +65 -0
  356. package/dist/serve/worker/client/rtdb-writes.js.map +1 -0
  357. package/dist/serve/worker/client.d.ts +0 -2
  358. package/dist/serve/worker/client.d.ts.map +1 -1
  359. package/dist/serve/worker/client.js +0 -2
  360. package/dist/serve/worker/client.js.map +1 -1
  361. package/dist/serve/worker/entry.js +2 -2
  362. package/dist/serve/worker/entry.js.map +1 -1
  363. package/dist/serve/worker/host/dispatch.d.ts +2 -0
  364. package/dist/serve/worker/host/dispatch.d.ts.map +1 -1
  365. package/dist/serve/worker/host/dispatch.js +24 -2
  366. package/dist/serve/worker/host/dispatch.js.map +1 -1
  367. package/dist/serve/worker/host/rtdb.d.ts +6 -2
  368. package/dist/serve/worker/host/rtdb.d.ts.map +1 -1
  369. package/dist/serve/worker/host/rtdb.js +224 -2
  370. package/dist/serve/worker/host/rtdb.js.map +1 -1
  371. package/dist/serve/worker/host/studio.d.ts.map +1 -1
  372. package/dist/serve/worker/host/studio.js +2 -0
  373. package/dist/serve/worker/host/studio.js.map +1 -1
  374. package/dist/serve/worker/host/subscriptions.d.ts.map +1 -1
  375. package/dist/serve/worker/host/subscriptions.js +3 -3
  376. package/dist/serve/worker/host/subscriptions.js.map +1 -1
  377. package/dist/serve/worker/host.d.ts +1 -1
  378. package/dist/serve/worker/host.d.ts.map +1 -1
  379. package/dist/serve/worker/host.js +1 -1
  380. package/dist/serve/worker/host.js.map +1 -1
  381. package/dist/serve/worker/index.d.ts +16 -1
  382. package/dist/serve/worker/index.d.ts.map +1 -1
  383. package/dist/serve/worker/index.js +17 -4
  384. package/dist/serve/worker/index.js.map +1 -1
  385. package/dist/serve/worker/protocol.d.ts +57 -0
  386. package/dist/serve/worker/protocol.d.ts.map +1 -1
  387. package/dist/serve/worker/protocol.js.map +1 -1
  388. package/dist/serve/worker/rtdb-value-equality.d.ts +3 -0
  389. package/dist/serve/worker/rtdb-value-equality.d.ts.map +1 -0
  390. package/dist/serve/worker/rtdb-value-equality.js +18 -0
  391. package/dist/serve/worker/rtdb-value-equality.js.map +1 -0
  392. package/dist/serve/worker/serve-init.js +2 -2
  393. package/dist/serve/worker/serve-init.js.map +1 -1
  394. package/dist/serve/worker/service-worker-relay.js +2 -2
  395. package/dist/serve/worker/service-worker-relay.js.map +1 -1
  396. package/package.json +7 -5
  397. package/src/assurance/.generated/conformance-verdicts.ts +120 -75
  398. package/src/bridge/client/dispatch.ts +1 -1
  399. package/src/cli/serve.ts +215 -307
  400. package/src/cli/service-command-records/database-rules-generate.ts +3 -0
  401. package/src/cli/service-command-records/database-rules-lint.ts +3 -0
  402. package/src/cli/service-command-records/database-rules-simulate.ts +3 -0
  403. package/src/cli/service-command-records/database-rules-validate.ts +3 -0
  404. package/src/cli/service-command-records/firestore-indexes-generate.ts +3 -0
  405. package/src/cli/service-command-records/firestore-rules-lint.ts +3 -0
  406. package/src/cli/service-command-records/firestore-rules-resolve.ts +3 -0
  407. package/src/cli/service-command-records/firestore-rules-simulate.ts +3 -0
  408. package/src/cli/service-command-records/firestore-rules-validate.ts +3 -0
  409. package/src/cli/service-command-records/storage-rules-lint.ts +3 -0
  410. package/src/cli/service-command-records/storage-rules-simulate.ts +3 -0
  411. package/src/cli/service-commands.generated.ts +27 -0
  412. package/src/cli/service-commands.test.ts +43 -0
  413. package/src/cli/service-commands.ts +36 -51
  414. package/src/conformance/.generated/can-i-use-browser.ts +1 -1
  415. package/src/conformance/.generated/can-i-use.ts +1 -1
  416. package/src/conformance/.generated/conformance-docs.ts +1 -1
  417. package/src/functions-rtdb/development-runtime.ts +299 -0
  418. package/src/serve/bridge-mount.ts +253 -19
  419. package/src/serve/bundler.ts +8 -34
  420. package/src/serve/entries/app-client.ts +5 -4
  421. package/src/serve/entries/auth-helper-core.ts +117 -30
  422. package/src/serve/entries/auth.ts +8 -4
  423. package/src/serve/entries/database.ts +180 -57
  424. package/src/serve/entries/init.ts +30 -20
  425. package/src/serve/html-injection.ts +65 -0
  426. package/src/serve/namespace.ts +26 -169
  427. package/src/serve/runtime/worker-replacement.ts +1 -1
  428. package/src/serve/sandbox-session.ts +233 -0
  429. package/src/serve/server.ts +20 -5
  430. package/src/serve/site-tree.ts +146 -0
  431. package/src/serve/standalone-assets.ts +9 -26
  432. package/src/serve/vite-functions-development.ts +201 -0
  433. package/src/serve/vite-generation-bridge.ts +66 -0
  434. package/src/serve/vite-generation-functions.ts +78 -0
  435. package/src/serve/vite-generation-middleware.ts +56 -0
  436. package/src/serve/vite-generation-rules-watch.ts +37 -0
  437. package/src/serve/vite-module-swap.ts +119 -0
  438. package/src/serve/vite-page-runtime.ts +100 -0
  439. package/src/serve/vite-plugin.ts +78 -883
  440. package/src/serve/vite-sandbox-generation.ts +255 -0
  441. package/src/serve/worker/client/disconnect.ts +3 -1
  442. package/src/serve/worker/client/handles.ts +5 -0
  443. package/src/serve/worker/client/pagehide.ts +31 -0
  444. package/src/serve/worker/client/rtdb-admin.ts +74 -0
  445. package/src/serve/worker/client/rtdb-connection-lifecycle.ts +52 -0
  446. package/src/serve/worker/client/rtdb-controls.ts +8 -0
  447. package/src/serve/worker/client/rtdb-listeners.ts +337 -0
  448. package/src/serve/worker/client/rtdb-reads.ts +12 -0
  449. package/src/serve/worker/client/rtdb-references.ts +85 -0
  450. package/src/serve/worker/client/rtdb-snapshots.ts +118 -0
  451. package/src/serve/worker/client/rtdb-transactions.ts +51 -0
  452. package/src/serve/worker/client/rtdb-writes.ts +74 -0
  453. package/src/serve/worker/client.ts +0 -2
  454. package/src/serve/worker/entry.ts +2 -2
  455. package/src/serve/worker/host/dispatch.ts +22 -2
  456. package/src/serve/worker/host/rtdb.ts +243 -2
  457. package/src/serve/worker/host/studio.ts +2 -0
  458. package/src/serve/worker/host/subscriptions.ts +8 -4
  459. package/src/serve/worker/host.ts +1 -1
  460. package/src/serve/worker/index.ts +58 -10
  461. package/src/serve/worker/protocol.ts +23 -2
  462. package/src/serve/worker/rtdb-value-equality.ts +17 -0
  463. package/src/serve/worker/serve-init.ts +2 -2
  464. package/src/serve/worker/service-worker-relay.ts +2 -2
  465. package/dist/serve/docs-ui/_astro/_slug_.DUci-duz.css +0 -1
  466. package/dist/serve/docs-ui/docs/_rhythm/index.html +0 -100
  467. package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +0 -43
  468. package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +0 -26
  469. package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +0 -70
  470. package/dist/serve/docs-ui/docs/api-reference/index.html +0 -68
  471. package/dist/serve/docs-ui/docs/build/ai-logic/index.html +0 -64
  472. package/dist/serve/docs-ui/docs/build/authentication/index.html +0 -66
  473. package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +0 -70
  474. package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +0 -71
  475. package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +0 -66
  476. package/dist/serve/docs-ui/docs/build/realtime-database/index.html +0 -67
  477. package/dist/serve/docs-ui/docs/conformance-scores/index.html +0 -50
  478. package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +0 -531
  479. package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +0 -73
  480. package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +0 -29
  481. package/dist/serve/docs-ui/docs/get-started/start-building/index.html +0 -33
  482. package/dist/serve/docs-ui/docs/messaging-compat/index.html +0 -265
  483. package/dist/serve/docs-ui/docs/observe/resolve-runtime-status/index.html +0 -28
  484. package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +0 -74
  485. package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +0 -45
  486. package/dist/serve/docs-ui/docs/overview/index.html +0 -17
  487. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +0 -186
  488. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +0 -318
  489. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +0 -160
  490. package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +0 -425
  491. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +0 -60
  492. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +0 -507
  493. package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +0 -258
  494. package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +0 -51
  495. package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +0 -308
  496. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +0 -68
  497. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +0 -11
  498. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +0 -126
  499. package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +0 -1852
  500. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +0 -509
  501. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +0 -182
  502. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +0 -121
  503. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +0 -203
  504. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +0 -639
  505. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +0 -100
  506. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +0 -24
  507. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +0 -136
  508. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +0 -16
  509. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +0 -176
  510. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +0 -188
  511. package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +0 -51
  512. package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +0 -106
  513. package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +0 -41
  514. package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +0 -67
  515. package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +0 -159
  516. package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +0 -47
  517. package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +0 -95
  518. package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +0 -82
  519. package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +0 -37
  520. package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +0 -75
  521. package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +0 -132
  522. package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +0 -14
  523. package/dist/serve/docs-ui/index.html +0 -1
  524. package/dist/serve/studio-ui/assets/RulesCodeEditor-BDlH-5lp.js +0 -23
  525. package/dist/serve/studio-ui/assets/index-Bf9SSE8L.js +0 -1218
  526. package/dist/serve/studio-ui/assets/index-BlSGru_r.css +0 -1
  527. package/dist/serve/studio-ui/assets/seed-D_UjxfOU.js +0 -20
  528. package/dist/serve/studio-ui/index.html +0 -32
  529. package/dist/serve/worker/client/rtdb.d.ts +0 -36
  530. package/dist/serve/worker/client/rtdb.d.ts.map +0 -1
  531. package/dist/serve/worker/client/rtdb.js +0 -241
  532. package/dist/serve/worker/client/rtdb.js.map +0 -1
  533. package/src/serve/worker/client/rtdb.ts +0 -311
  534. /package/dist/serve/{docs-ui → site-ui}/404.html +0 -0
  535. /package/dist/serve/{docs-ui → site-ui}/_astro/_slug_.CXh9yTP1.css +0 -0
  536. /package/dist/serve/{docs-ui → site-ui}/docs/_rhythm.md +0 -0
  537. /package/dist/serve/{docs-ui → site-ui}/docs/agent/set-up-your-agent.md +0 -0
  538. /package/dist/serve/{docs-ui → site-ui}/docs/agent/watch-and-review.md +0 -0
  539. /package/dist/serve/{docs-ui → site-ui}/docs/agent/work-with-an-agent.md +0 -0
  540. /package/dist/serve/{docs-ui → site-ui}/docs/ai-compat.md +0 -0
  541. /package/dist/serve/{docs-ui → site-ui}/docs/api-reference.md +0 -0
  542. /package/dist/serve/{docs-ui → site-ui}/docs/app-compat.md +0 -0
  543. /package/dist/serve/{docs-ui → site-ui}/docs/auth-compat.md +0 -0
  544. /package/dist/serve/{docs-ui → site-ui}/docs/build/ai-logic.md +0 -0
  545. /package/dist/serve/{docs-ui → site-ui}/docs/build/authentication.md +0 -0
  546. /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-firestore.md +0 -0
  547. /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-messaging.md +0 -0
  548. /package/dist/serve/{docs-ui → site-ui}/docs/build/realtime-database.md +0 -0
  549. /package/dist/serve/{docs-ui → site-ui}/docs/create-pyric-reference-api.md +0 -0
  550. /package/dist/serve/{docs-ui → site-ui}/docs/functions-rtdb-compat.md +0 -0
  551. /package/dist/serve/{docs-ui → site-ui}/docs/get-started/how-the-swap-works.md +0 -0
  552. /package/dist/serve/{docs-ui → site-ui}/docs/get-started/start-building.md +0 -0
  553. /package/dist/serve/{docs-ui → site-ui}/docs/index.html +0 -0
  554. /package/dist/serve/{docs-ui → site-ui}/docs/observe/resolve-runtime-status.md +0 -0
  555. /package/dist/serve/{docs-ui → site-ui}/docs/observe/see-whats-happening.md +0 -0
  556. /package/dist/serve/{docs-ui → site-ui}/docs/observe/shape-your-data.md +0 -0
  557. /package/dist/serve/{docs-ui → site-ui}/docs/overview.md +0 -0
  558. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-app-reference-api.md +0 -0
  559. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api.md +0 -0
  560. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api.md +0 -0
  561. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api.md +0 -0
  562. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-storage-reference-api.md +0 -0
  563. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api.md +0 -0
  564. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-scripting-reference-api.md +0 -0
  565. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-app-reference-api.md +0 -0
  566. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-browser-reference-api.md +0 -0
  567. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api.md +0 -0
  568. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api.md +0 -0
  569. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-reference-api.md +0 -0
  570. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-browser-reference-api.md +0 -0
  571. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-docs-reference-api.md +0 -0
  572. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-reference-api.md +0 -0
  573. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-credentials-node-reference-api.md +0 -0
  574. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api.md +0 -0
  575. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-register-reference-api.md +0 -0
  576. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api.md +0 -0
  577. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api.md +0 -0
  578. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-reference-api.md +0 -0
  579. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-sw-reference-api.md +0 -0
  580. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-database-reference-api.md +0 -0
  581. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-firestore-reference-api.md +0 -0
  582. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-agents-reference-api.md +0 -0
  583. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-hooks-reference-api.md +0 -0
  584. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api.md +0 -0
  585. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-hooks-reference-api.md +0 -0
  586. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api.md +0 -0
  587. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-hooks-reference-api.md +0 -0
  588. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api.md +0 -0
  589. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api.md +0 -0
  590. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-hooks-reference-api.md +0 -0
  591. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api.md +0 -0
  592. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-hooks-reference-api.md +0 -0
  593. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-hooks-reference-api.md +0 -0
  594. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api.md +0 -0
  595. /package/dist/serve/{docs-ui → site-ui}/docs/secure/audit-your-rules.md +0 -0
  596. /package/dist/serve/{docs-ui → site-ui}/docs/secure/firestore-rules-limits.md +0 -0
  597. /package/dist/serve/{docs-ui → site-ui}/docs/secure/read-a-denial.md +0 -0
  598. /package/dist/serve/{docs-ui → site-ui}/docs/secure/rtdb-rules-in-typescript.md +0 -0
  599. /package/dist/serve/{docs-ui → site-ui}/docs/secure/secure-it-with-rules.md +0 -0
  600. /package/dist/serve/{docs-ui → site-ui}/docs/secure/simulate-and-lint.md +0 -0
  601. /package/dist/serve/{docs-ui → site-ui}/docs/secure/write-a-rules-test-suite.md +0 -0
  602. /package/dist/serve/{docs-ui → site-ui}/docs/ship/ship-to-production.md +0 -0
  603. /package/dist/serve/{docs-ui → site-ui}/docs/ship/test-in-node.md +0 -0
  604. /package/dist/serve/{docs-ui → site-ui}/docs/trust/how-we-know-it-matches-firebase.md +0 -0
  605. /package/dist/serve/{docs-ui → site-ui}/docs/trust/versioning-and-compatibility.md +0 -0
  606. /package/dist/serve/{studio-ui → site-ui}/pyric-logo.svg +0 -0
@@ -21,9 +21,9 @@
21
21
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">CEL builtins <code>math.<em></code>/<code>timestamp.</em></code>/<code>duration.*</code> (FM3) — arithmetic, date, and duration comparisons in rules</span></span></span></summary>
22
22
  <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-builtins-time-and-math</code> — production Firestore Rules Test API verdicts for corpus scenario "builtins-time-and-math", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>; all cases match production.</div></div>
23
23
  </details>
24
- <details class="compat-row" data-status="diverged">
25
- <summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>Bytes</code>, <code>String.toUtf8()</code>, and <code>hashing.{md5,sha256,crc32,crc32c}()</code> (Item 5.3) in rules</span></span></span></summary>
26
- <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-bytes-toutf8-and-hashing</code> — production Firestore Rules Test API verdicts for corpus scenario "bytes-toutf8-and-hashing", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE</div></div>
24
+ <details class="compat-row" data-status="ok">
25
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>Bytes</code>, <code>String.toUtf8()</code>, and <code>hashing.{md5,sha256,crc32,crc32c}()</code> (Item 5.3) in rules</span></span></span></summary>
26
+ <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-bytes-toutf8-and-hashing</code> — a 2026-07-21 production Firestore Rules Test API recapture supplies 20 verdicts, including paired negative and positive witnesses for padded base64url, the URL-safe alphabet, uppercase hexadecimal MD5/SHA-256, and production's little-endian CRC32/CRC32C byte serialization. <code>unit:rules/oracle-conformance.test.ts</code> replays all verdicts against the local simulator; <code>unit:rules/simulator/wrappers/bytes.test.ts</code> pins the exact representations and reference digests.</div></div>
27
27
  </details>
28
28
  <details class="compat-row" data-status="ok">
29
29
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">Typed cross-type operator overloads for <code>Timestamp</code>/<code>Duration</code> (Item 2) in rules — no silent numeric coercion / type-identity loss</span></span></span></summary>
@@ -33,25 +33,25 @@
33
33
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">CEL tri-state error absorption in <code>||</code>/<code>&amp;&amp;</code> (RULES-B3) — <code>error || true</code> → ALLOW, <code>error &amp;&amp; false</code> → DENY, commutative absorption (not JS left-to-right short-circuit)</span></span></span></summary>
34
34
  <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-error-absorption-and-or</code> — production Firestore Rules Test API verdicts for corpus scenario "error-absorption-and-or", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>; all cases match production.</div></div>
35
35
  </details>
36
- <details class="compat-row" data-status="diverged">
37
- <summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>getAfter()</code>/<code>existsAfter()</code> (Item 7) in rules — post-write document identity and existence semantics</span></span></span></summary>
38
- <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-get-after-and-exists-after</code> production Firestore Rules Test API verdicts for corpus scenario "get-after-and-exists-after", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator does not model the post-write document identity/existence production compares against on 4 scenario cases (getAfter target identity, existsAfter on create/delete, existsAfter over an unrelated mocked path) — pinned KNOWN_DIVERGENCE</div></div>
36
+ <details class="compat-row" data-status="ok">
37
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>getAfter()</code>/<code>existsAfter()</code> expose the projected post-write target and cross-document atomic batch state; create exists, delete does not, and an unrelated unchanged document falls back to its committed existence</span></span></span></summary>
38
+ <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-get-after-and-exists-after</code> records authenticated Web SDK verdicts against temporarily deployed production rules, including target create/delete and unrelated-path semantics. Its lifecycle proves exact rules release restoration; retained diagnostics document why the hosted Rules Test API was not sufficient. Replayed verdict-for-verdict by <code>unit:rules/oracle-conformance.test.ts</code>; <code>get-after.test.ts</code> and <code>get-after-batch.test.ts</code> cover target, sibling-write, solo-write denial, delete, and atomicity locally.</div></div>
39
39
  </details>
40
- <details class="compat-row" data-status="diverged">
41
- <summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>get()</code> of a missing document (RULES-B8) in rules — resource identity (<code>id</code>/<code>__name__</code>) exposure on a mocked/missing get() result</span></span></span></summary>
42
- <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-get-missing-doc</code> — production Firestore Rules Test API verdicts for corpus scenario "get-missing-doc", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator synthesizes a resource identity (<code>id</code>, <code>__name__</code>) for mocked get() results that production leaves absent, on 2 scenario cases pinned KNOWN_DIVERGENCE</div></div>
40
+ <details class="compat-row" data-status="ok">
41
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>get()</code> of a missing document (RULES-B8) in rules — resource identity (<code>id</code>/<code>__name__</code>) exposure on a mocked/missing get() result</span></span></span></summary>
42
+ <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-get-missing-doc</code> — production Firestore Rules Test API verdicts for corpus scenario "get-missing-doc", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. Serializable <code>functionMocks</code> now retain their production data-only shape, so mocked <code>get()</code> results leave <code>id</code>/<code>__name__</code> absent and both identity reads error to DENY; real DocStore lookups retain their separate identity-bearing path. All 8 cases match production.</div></div>
43
43
  </details>
44
- <details class="compat-row" data-status="diverged">
45
- <summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>request.path</code>/<code>request.query</code>/<code>resource.id</code>/<code>resource.__name__</code> globals (Item 6) in rules</span></span></span></summary>
46
- <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-globals-request-path-and-resource-id</code> — production Firestore Rules Test API verdicts for corpus scenario "globals-request-path-and-resource-id", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator models <code>request.query</code> as an empty map on the empty-query case where production denies the equivalent comparison pinned KNOWN_DIVERGENCE. Contamination scope is <code>request.query</code> ALONE: the scenario's <code>request.path</code> cases conform, and its <code>resource.id</code>/<code>resource.__name__</code> cases conform because they run on a <code>create</code> (where <code>resource</code> is null pre-write). Resource identity on an EXISTING document is scoped to firestore-rules#183.</div></div>
44
+ <details class="compat-row" data-status="ok">
45
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>request.path</code>/<code>request.query</code>/<code>resource.id</code>/<code>resource.__name__</code> globals (Item 6) in rules</span></span></span></summary>
46
+ <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-globals-request-path-and-resource-id</code> — production Firestore Rules Test API verdicts for corpus scenario "globals-request-path-and-resource-id", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. <code>request.query</code> is now absent on non-list operations, so reading it on create errors to DENY instead of false-ALLOWing through an invented empty map. <code>request.path</code> and the create-time absent-resource controls remain unchanged; all 6 cases match production. Resource identity on an EXISTING document is scoped to firestore-rules#183.</div></div>
47
47
  </details>
48
- <details class="compat-row" data-status="diverged">
49
- <summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>int</code>/<code>float</code> division and type distinction (RULES-B5) in rules — truncating int÷int, float division stays float, div-by-zero denies, <code>is int</code>/<code>is float</code> distinct</span></span></span></summary>
50
- <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-int-float-and-division</code> — production Firestore Rules Test API verdicts for corpus scenario "int-float-and-division", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator narrows a float-valued payload field toward int on the float-payload case, unlike production which preserves the float type pinned KNOWN_DIVERGENCE</div></div>
48
+ <details class="compat-row" data-status="ok">
49
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>int</code>/<code>float</code> division and type distinction (RULES-B5) in rules — truncating int÷int, float division stays float, div-by-zero denies, <code>is int</code>/<code>is float</code> distinct</span></span></span></summary>
50
+ <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-int-float-and-division</code> — production Firestore Rules Test API verdicts for all ten corpus cases, replayed verdict-for-verdict by <code>unit:rules/oracle-conformance.test.ts</code>. The simulator now revives non-integral JSON wire numbers as RulesFloat values, preserving production's float payload type while retaining bare integral numbers as ints; <code>unit:rules/simulator/handler.test.ts</code> pins both literal and payload distinctions.</div></div>
51
51
  </details>
52
52
  <details class="compat-row" data-status="ok">
53
53
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>List.concat()</code>/<code>removeAll()</code>/<code>toSet()</code> (Item 5.2) in rules</span></span></span></summary>
54
- <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-list-methods-concat-removeall-toset</code> — production Firestore Rules Test API verdicts for corpus scenario "list-methods-concat-removeall-toset", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>; all cases match production.</div></div>
54
+ <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-list-methods-concat-removeall-toset</code> — production Firestore Rules Test API verdicts for all nine cases, replayed verdict-for-verdict by <code>unit:rules/oracle-conformance.test.ts</code>. The seven positive List witnesses and the concat DENY witness match; the historical <code>toSet().difference(list)</code> case remains DENY because production requires a Set argument.</div></div>
55
55
  </details>
56
56
  <details class="compat-row" data-status="ok">
57
57
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>Map.get(key, default)</code>, including list-form nested-path traversal (Item 3), in rules</span></span></span></summary>
@@ -61,21 +61,21 @@
61
61
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>matches()</code> as an anchored full-string RE2 match (RULES-B4) in rules — a pattern matching only a substring is <code>false</code></span></span></span></summary>
62
62
  <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-matches-full-string-regex</code> — production Firestore Rules Test API verdicts for corpus scenario "matches-full-string-regex", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>; all cases match production.</div></div>
63
63
  </details>
64
- <details class="compat-row" data-status="diverged">
65
- <summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>Path</code> wrapper, <code>path()</code> constructor, and <code>Path.bind()</code> (Item 5.4) in rules</span></span></span></summary>
66
- <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-path-constructor-and-bind</code> — production Firestore Rules Test API verdicts for corpus scenario "path-constructor-and-bind", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator treats <code>path()</code> as idempotent on an already-Path argument where production denies — pinned KNOWN_DIVERGENCE</div></div>
64
+ <details class="compat-row" data-status="ok">
65
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>Path</code> wrapper, <code>path()</code> constructor, and <code>Path.bind()</code> (Item 5.4) in rules</span></span></span></summary>
66
+ <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-path-constructor-and-bind</code> — production Firestore Rules Test API verdicts for all nine corpus cases in "path-constructor-and-bind", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>, including production's rejection of a Path argument to <code>path()</code>.</div></div>
67
67
  </details>
68
68
  <details class="compat-row" data-status="ok">
69
69
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">Own-keys-only map membership and constructor-access denial (RULES-B7) in rules — <code>'toString' in map</code> is <code>false</code>, <code>.constructor</code> access errors (no JS prototype-chain leakage)</span></span></span></summary>
70
70
  <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-prototype-chain-keys</code> — production Firestore Rules Test API verdicts for corpus scenario "prototype-chain-keys", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>; all cases match production.</div></div>
71
71
  </details>
72
- <details class="compat-row" data-status="diverged">
73
- <summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">Range-slice <code>[i:j]</code> syntax for <code>List</code> and <code>String</code> (Item 4) in rules</span></span></span></summary>
74
- <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-range-slice-list-and-string</code> — production Firestore Rules Test API verdicts for corpus scenario "range-slice-list-and-string", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator clamps an out-of-bounds slice end to the collection length on both the list and string OOB-slice cases; production denies — pinned KNOWN_DIVERGENCE</div></div>
72
+ <details class="compat-row" data-status="ok">
73
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">Range-slice <code>[i:j]</code> syntax for <code>List</code> and <code>String</code> (Item 4) in rules</span></span></span></summary>
74
+ <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-range-slice-list-and-string</code> — production Firestore Rules Test API verdicts for all ten corpus cases in "range-slice-list-and-string", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>, including out-of-bounds slice-end rejection for both lists and strings.</div></div>
75
75
  </details>
76
76
  <details class="compat-row" data-status="ok">
77
77
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>Set.difference()</code>/<code>union()</code>/<code>intersection()</code> (Item 5.1) in rules</span></span></span></summary>
78
- <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-set-algebra-difference-union-intersection</code> production Firestore Rules Test API verdicts for corpus scenario "set-algebra-difference-union-intersection", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>; all cases match production.</div></div>
78
+ <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-set-algebra-difference-union-intersection</code> captures the receiver and argument boundary in twelve production cases: Map.keys() is a List and rejects Set-only algebra, explicit toSet() receivers ALLOW difference/union/intersection with Set arguments, and a wrong-result control DENIES. The local simulator replays every verdict and the per-construct acceptance probes use the same positive toSet() shapes.</div></div>
79
79
  </details>
80
80
  <details class="compat-row" data-status="ok">
81
81
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">String-literal escape handling feeding <code>matches()</code> (Class B) in rules — <code>\\.</code> is unescaped before RE2 compilation, not forwarded raw to a JS <code>RegExp</code></span></span></span></summary>
@@ -103,7 +103,7 @@
103
103
  </details>
104
104
  <details class="compat-row" data-status="ok">
105
105
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>latlng.value().latitude()/longitude()/distance()</code> and <code>duration.value()/time()/abs()</code> in rules</span></span></span></summary>
106
- <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-12: production capture proves the simulator matches the production Firestore Rules Test API verdict-for-verdict on all 2 cases (coordinate + duration bounds). <code>oracle:rules-firestore-duration-and-latlng</code> — replayed by <code>unit:rules/oracle-conformance.test.ts</code>.</div></div>
106
+ <div class="compat-evidence"><div class="compat-probe">Production captures from 2026-07-12 and the 2026-07-21 recapture prove the simulator matches the Firestore Rules Test API verdict-for-verdict on all 3 cases: coordinate and duration bounds plus exact <code>duration.value(1500, 'ms').seconds()</code> / <code>.nanos()</code> components. <code>oracle:rules-firestore-duration-and-latlng</code> — replayed by <code>unit:rules/oracle-conformance.test.ts</code>.</div></div>
107
107
  </details>
108
108
  <details class="compat-row" data-status="ok">
109
109
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">User-defined <code>function</code>/<code>let</code>, granular <code>allow get/list/update/write</code> verbs, the ternary operator, and a recursive <code>{document=**}</code> match in rules</span></span></span></summary>
@@ -125,6 +125,18 @@
125
125
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">Function declarations at GLOBAL and SERVICE scope in a Firestore ruleset, with match-scope shadowing</span></span></span></summary>
126
126
  <div class="compat-evidence"><div class="compat-probe">ROW CORRECTED, 2026-07-17 (same day): the simulator now seeds the match-tree walk with global- and service-scope function declarations (declaration order global → service → match preserves inner-shadows-outer), so the previously-abstaining cases evaluate. <code>oracle:rules-firestore-global-and-service-scope-functions</code> — production Firestore Rules Test API verdicts captured 2026-07-17 — now replays verdict-for-verdict against the local simulator with all 5 cases matching (shadowing included), asserted by <code>unit:rules/oracle-conformance.test.ts</code>. The prior unsupported row recorded the honest UNSUPPORTED abstention; that gap is closed (#346).</div></div>
127
127
  </details>
128
+ <details class="compat-row" data-status="ok">
129
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">Hierarchical nested <code>match</code> composition — a child match resolves relative to its parent and grants only the exact nested document path</span></span></span></summary>
130
+ <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-hierarchical-match-cascade</code> captures the exact nested child ALLOW plus parent, sibling, and over-deep DENY controls from the production Firestore Rules Test API, replayed verdict-for-verdict by <code>packages/pyric/test/rules/oracle-conformance.test.ts</code>.</div></div>
131
+ </details>
132
+ <details class="compat-row" data-status="ok">
133
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">Strict boolean operands for <code>&amp;&amp;</code>, <code>||</code>, and ternary control flow, plus create-time <code>resource</code> / <code>request.resource</code> semantics</span></span></span></summary>
134
+ <div class="compat-evidence"><div class="compat-probe"><code>oracle:rules-firestore-strict-boolean-control-flow</code> captures three direct non-boolean DENYs, three tautological error discriminators that still DENY, a boolean ALLOW control, create-time <code>resource == null</code> DENY, and incoming <code>request.resource.data</code> ALLOW; replayed verdict-for-verdict by <code>packages/pyric/test/rules/oracle-conformance.test.ts</code>.</div></div>
135
+ </details>
136
+ <details class="compat-row" data-status="ok">
137
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">The exact six shared <code>auth</code> and <code>membership</code> function bodies preserve signed-in, owner, custom-claim, explicit membership-map, and role semantics under Firestore Rules</span></span></span></summary>
138
+ <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-21: one bounded, read-only Firestore Rules Test API request captured 12 verdicts for the exact bodies shipped from <code>auth</code> and <code>membership</code>; <code>oracle:rules-firestore-common-auth-membership-firestore</code> matches the local Firestore rules simulator verdict-for-verdict (6 ALLOW, 6 DENY). The cross-service source-lock test requires these six Firestore corpus bodies, the previously captured Storage corpus bodies, and the shipped modules to remain normalized-AST-identical.</div></div>
139
+ </details>
128
140
  </div>
129
141
 
130
142
  ## Storage rules engine — `parseStorageRules` / `evaluateStorageRules` (rules-storage corpus)
@@ -132,11 +144,11 @@
132
144
  <div class="compat-list">
133
145
  <details class="compat-row" data-status="ok">
134
146
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>parseStorageRules(source)</code> returns an opaque handle</span></span></span></summary>
135
- <div class="compat-evidence"><div class="compat-probe"><code>unit:rules.test.ts</code> ("parses the canonical session-archive ruleset")</div></div>
147
+ <div class="compat-evidence"><div class="compat-probe"><code>unit:storage/sandbox/rules.test.ts</code> ("parses the canonical session-archive ruleset")</div></div>
136
148
  </details>
137
149
  <details class="compat-row" data-status="ok">
138
150
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>parseStorageRules</code> rejects non-<code>firebase.storage</code> service headers</span></span></span></summary>
139
- <div class="compat-evidence"><div class="compat-probe"><code>unit:rules.test.ts</code> ("rejects unknown service header")</div></div>
151
+ <div class="compat-evidence"><div class="compat-probe"><code>unit:storage/sandbox/rules.test.ts</code> ("rejects unknown service header")</div></div>
140
152
  </details>
141
153
  <details class="compat-row" data-status="ok">
142
154
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>evaluateStorageRules</code> supports granular verbs (<code>get</code>/<code>list</code>/<code>create</code>/<code>update</code>/<code>delete</code>) alongside <code>read</code>/<code>write</code> umbrella expansion, comma-separated verb lists, and per-verb default-deny</span></span></span></summary>
@@ -144,31 +156,31 @@
144
156
  </details>
145
157
  <details class="compat-row" data-status="ok">
146
158
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>parseStorageRules</code> rejects unterminated string literals with <code>SyntaxError</code></span></span></span></summary>
147
- <div class="compat-evidence"><div class="compat-probe"><code>unit:rules.test.ts</code> ("rejects unterminated strings")</div></div>
159
+ <div class="compat-evidence"><div class="compat-probe"><code>unit:storage/sandbox/rules.test.ts</code> ("rejects unterminated strings")</div></div>
148
160
  </details>
149
161
  <details class="compat-row" data-status="ok">
150
162
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>evaluateStorageRules</code> matches <code>match /sessions/{id} { allow read: if request.auth != null; }</code> for an authed read</span></span></span></summary>
151
- <div class="compat-evidence"><div class="compat-probe"><code>unit:rules.test.ts</code> ("allows authenticated reads of /sessions/{id}")</div></div>
163
+ <div class="compat-evidence"><div class="compat-probe"><code>unit:storage/sandbox/rules-evaluator.test.ts</code> ("allows authenticated reads of /sessions/{id}")</div></div>
152
164
  </details>
153
165
  <details class="compat-row" data-status="ok">
154
166
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>evaluateStorageRules</code> denies anonymous reads when the rule requires <code>request.auth != null</code></span></span></span></summary>
155
- <div class="compat-evidence"><div class="compat-probe"><code>unit:rules.test.ts</code> ("denies anonymous reads")</div></div>
167
+ <div class="compat-evidence"><div class="compat-probe"><code>unit:storage/sandbox/rules-evaluator.test.ts</code> ("denies anonymous reads")</div></div>
156
168
  </details>
157
169
  <details class="compat-row" data-status="ok">
158
170
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>evaluateStorageRules</code> supports <code>request.resource.size &lt; N</code> constraints (with arithmetic literals like <code>10 <em> 1024 </em> 1024</code>)</span></span></span></summary>
159
- <div class="compat-evidence"><div class="compat-probe"><code>unit:rules.test.ts</code> ("allows JSON writes under 10MB")</div></div>
171
+ <div class="compat-evidence"><div class="compat-probe"><code>unit:storage/sandbox/rules-evaluator.test.ts</code> ("allows JSON writes under 10MB")</div></div>
160
172
  </details>
161
173
  <details class="compat-row" data-status="ok">
162
174
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>evaluateStorageRules</code> supports <code>request.resource.contentType == '&lt;mime&gt;'</code> constraints</span></span></span></summary>
163
- <div class="compat-evidence"><div class="compat-probe"><code>unit:rules.test.ts</code> (mime constraint inside the session-archive ruleset)</div></div>
175
+ <div class="compat-evidence"><div class="compat-probe"><code>unit:storage/sandbox/rules-evaluator.test.ts</code> (mime constraint inside the session-archive ruleset)</div></div>
164
176
  </details>
165
177
  <details class="compat-row" data-status="ok">
166
178
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">Multi-segment wildcard <code>{allPaths=**}</code> matches zero-or-more remaining segments</span></span></span></summary>
167
- <div class="compat-evidence"><div class="compat-probe"><code>unit:rules.test.ts</code> (parser + evaluator both honor the <code>**</code> form)</div></div>
179
+ <div class="compat-evidence"><div class="compat-probe"><code>unit:storage/sandbox/rules-evaluator.test.ts</code> (parser + evaluator both honor the <code>**</code> form)</div></div>
168
180
  </details>
169
181
  <details class="compat-row" data-status="ok">
170
182
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">Path-parameter binding (<code>{sessionId}</code>) accessible inside the <code>if</code> expression</span></span></span></summary>
171
- <div class="compat-evidence"><div class="compat-probe"><code>unit:rules.test.ts</code></div></div>
183
+ <div class="compat-evidence"><div class="compat-probe"><code>unit:storage/sandbox/rules-evaluator.test.ts</code></div></div>
172
184
  </details>
173
185
  <details class="compat-row" data-status="ok">
174
186
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">User-defined <code>function</code> definitions — <code>let</code> bindings, functions calling functions, and match-block-scoped helper functions (lexical scoping)</span></span></span></summary>
@@ -198,9 +210,9 @@
198
210
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>request.resource.size</code> arithmetic bounds (<code>+</code>/<code>-</code>/<code><em></code>/<code>/</code>, <code>&gt;=</code>/<code>&lt;=</code>), request/existing content-type and custom <code>metadata</code> checks, <code>request.method</code>/<code>request.path</code>, a <code>request.auth.token</code> custom-claim branch, granular <code>allow list</code>, and a recursive <code>{allPaths=</em>*}</code> public read tree</span></span></span></summary>
199
211
  <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-12: production capture proves the evaluator matches the production Storage Rules Test API verdict-for-verdict on all 8 cases (owner-scoped size-bounded upload, immutable-content-type update, list grant, public recursive read). <code>oracle:rules-storage-metadata-verbs-and-arithmetic</code> — replayed by <code>packages/pyric/test/storage/rules-oracle-conformance.test.ts</code>.</div></div>
200
212
  </details>
201
- <details class="compat-row" data-status="diverged">
202
- <summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>resource</code> on a create where no object exists: the create-if-absent guard <code>allow create: if resource == null</code></span></span></span></summary>
203
- <div class="compat-evidence"><div class="compat-probe">divergence, over-permissive (the evaluator ALLOWs where production DENIEs, the highest-severity direction defined in <code>docs/storage/reference/conformance-gaps.md</code>). <code>oracle:rules-storage-verbs-umbrella-granular</code>, case "create allowed when object does not exist (resource == null)": production DENIES. Production raises a null value error on a <code>resource</code> reference in a create where no object exists, and the errored expression denies, so a <code>create</code> rule guarded by <code>resource == null</code> never allows. The evaluator models <code>resource</code> as null on create, evaluates the comparison as documented, and ALLOWS. Live-probed against production before pinning with both an omitted <code>resource</code> field and an explicit null, which denied identically, ruling out a capture-harness wire-shape bug. Both sides pinned in <code>unit:storage/rules-oracle-conformance.test.ts</code> KNOWN_DIVERGENCES. Same error-value class as the Firestore <code>resource</code> identity on a missing document.</div></div>
213
+ <details class="compat-row" data-status="ok">
214
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>resource</code> on a create where no object exists: the create-if-absent guard <code>allow create: if resource == null</code></span></span></span></summary>
215
+ <div class="compat-evidence"><div class="compat-probe">GAP CLOSED, 2026-07-21: production raises a null-value error when <code>resource</code> is referenced on a create where no object exists, including <code>resource == null</code>, so the expression denies. The evaluator now represents the missing binding as a Rules error rather than a usable null. <code>oracle:rules-storage-verbs-umbrella-granular</code> replays the captured DENY directly with no divergence pin; <code>unit:storage/sandbox/rules-evaluator.test.ts</code> covers the evaluator seam.</div></div>
204
216
  </details>
205
217
  <details class="compat-row" data-status="ok">
206
218
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">Ternary <code>?:</code> — branch selection, error-in-condition deny, and <code>error || true</code> absorption</span></span></span></summary>
@@ -208,7 +220,7 @@
208
220
  </details>
209
221
  <details class="compat-row" data-status="ok">
210
222
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>in</code> on list literals (membership) and on maps (OWN-key membership) — prototype names (<code>toString</code>/<code>constructor</code>/<code>hasOwnProperty</code>) are never keys</span></span></span></summary>
211
- <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-17: production capture proves <code>in</code> tests list membership and map OWN keys only — <code>'toString' in metadata</code> is false unless the map literally carries that key, for both custom-metadata maps and map literals. <code>oracle:rules-storage-in-membership-and-proto-keys</code> matches production verdict-for-verdict on all 8 cases. Pre-fix the evaluator used JS <code>in</code>, which walks the prototype chain and false-ALLOWed the proto-key cases (the same bug class the Firestore simulator fixed under RULES-B7); the own-key check now guards it, pinned by <code>unit:rules.test.ts</code> JS-semantics guards.</div></div>
223
+ <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-17: production capture proves <code>in</code> tests list membership and map OWN keys only — <code>'toString' in metadata</code> is false unless the map literally carries that key, for both custom-metadata maps and map literals. <code>oracle:rules-storage-in-membership-and-proto-keys</code> matches production verdict-for-verdict on all 8 cases. Pre-fix the evaluator used JS <code>in</code>, which walks the prototype chain and false-ALLOWed the proto-key cases (the same bug class the Firestore simulator fixed under RULES-B7); the own-key check now guards it, pinned by <code>unit:storage/sandbox/rules-values.test.ts</code> JS-semantics guards.</div></div>
212
224
  </details>
213
225
  <details class="compat-row" data-status="ok">
214
226
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>is</code> type tests over the storage bindings (<code>size is int</code>, <code>contentType is string</code>, <code>metadata is map</code>, <code>split() is list</code>) and int/float LITERAL typing (<code>1.0 is float</code>, <code>1 is int</code>, cross checks false)</span></span></span></summary>
@@ -216,7 +228,7 @@
216
228
  </details>
217
229
  <details class="compat-row" data-status="ok">
218
230
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">List/map literals, range-slice access <code>[i:j]</code> on lists and strings (out-of-range bounds ERROR, no JS clamp), and structural <code>==</code> on lists</span></span></span></summary>
219
- <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-17: production capture proves slices evaluate on <code>split()</code> lists and on strings, that an out-of-range slice END errors and denies (production does NOT clamp to length the way JS <code>.slice()</code> does — same semantics the Firestore capture pinned in rules-firestore-range-slice-list-and-string), and that a slice compares equal to a list literal structurally. <code>oracle:rules-storage-list-map-literals-and-slice</code> matches production verdict-for-verdict on all 6 cases. Pre-fix the evaluator clamped bounds JS-style and compared lists by reference identity; both fixed and pinned by <code>unit:rules.test.ts</code> JS-semantics guards.</div></div>
231
+ <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-17: production capture proves slices evaluate on <code>split()</code> lists and on strings, that an out-of-range slice END errors and denies (production does NOT clamp to length the way JS <code>.slice()</code> does — same semantics the Firestore capture pinned in rules-firestore-range-slice-list-and-string), and that a slice compares equal to a list literal structurally. <code>oracle:rules-storage-list-map-literals-and-slice</code> matches production verdict-for-verdict on all 6 cases. Pre-fix the evaluator clamped bounds JS-style and compared lists by reference identity; both fixed and pinned by <code>unit:storage/sandbox/rules-values.test.ts</code> JS-semantics guards.</div></div>
220
232
  </details>
221
233
  <details class="compat-row" data-status="ok">
222
234
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">Float literals, <code>%</code>, unary minus, float division, negative-dividend modulo (<code>-7 % 2 == -1</code>), and TRUNCATING int division (<code>10 / 4 == 2</code>, <code>-7 / 2 == -3</code>)</span></span></span></summary>
@@ -226,6 +238,38 @@
226
238
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">Function declarations at GLOBAL scope (above <code>service</code>) and SERVICE scope (inside <code>service</code>, outside any match), with inner-shadows-outer resolution</span></span></span></summary>
227
239
  <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-17: production capture proves production accepts functions declared at global and service scope and resolves a match-scope function over a same-named global (inner shadows outer). <code>oracle:rules-storage-function-scopes-and-shadowing</code> matches production verdict-for-verdict on all 5 cases. The shared grammar previously rejected both placements at parse (PR #333 grammar fix); the storage evaluator attaches global- and service-scope functions to the root match block, which the capture proves is verdict-equivalent to production's scoping for this surface.</div></div>
228
240
  </details>
241
+ <details class="compat-row" data-status="ok">
242
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>2+modules</code> Storage rules resolve through service-aware contracts: the common <code>auth</code> and <code>membership</code> exports are admitted and retain their production auth, claim, map-membership, and role semantics; Firestore-only helpers are rejected before evaluation</span></span></span></summary>
243
+ <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-20; paired proof added 2026-07-21: one targeted production Rules Test API capture proves the exact six bundled function bodies (<code>isAuthenticated</code>, <code>isOwner</code>, <code>hasClaim</code>, <code>hasClaimRole</code>, <code>isMemberOf</code>, <code>hasRole</code>) under <code>firebase.storage</code>, matching the local evaluator verdict-for-verdict on 12 allow/deny cases. <code>oracle:rules-storage-common-auth-membership</code> supplies the Storage answer key; Firestore Rules row #189 independently captures the same exact bodies under <code>cloud.firestore</code> (12 matching verdicts). A separately authored, explicitly reconstructed normalized-AST digest locks the captured Storage corpus bodies, and the source-lock test requires the Firestore corpus and shipped modules to remain AST-identical. Resolver tests separately prove <code>2+modules</code> lowers these imports to plain v2 and fails closed with <code>INCOMPATIBLE_FUNCTION</code> for a Firestore-only export and for a transitive helper that reads <code>resource.data</code>; the Storage service integration test proves normal setup invokes that checked resolver.</div></div>
244
+ </details>
245
+ <details class="compat-row" data-status="ok">
246
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">Storage-native upload primitives at security boundaries: inclusive byte maximums, exact and whole-string MIME checks, metadata-only updates with unchanged bytes/owner, string path wildcards, generation/metageneration identity, and strict creation-time windows</span></span></span></summary>
247
+ <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-20: <code>oracle:rules-storage-upload-primitives-boundaries</code> captures 26 production cases in one Rules Test API request. The local evaluator matches every case scoped to this row: size 0/exact/+1, MIME exact/case/parameter and regex anchoring, metadata update invariants, filename wildcard typing, exact/absent generation identity, and request.time just before/at/after a strict 60-second boundary plus a future timeCreated fixture. Metadata collection methods and missing request.resource are separated into divergence rows #127/#128 rather than contaminating this credit.</div></div>
248
+ </details>
249
+ <details class="compat-row" data-status="ok">
250
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">Storage custom-metadata collection methods: <code>Map.keys().hasAll()</code> for required-key policy and <code>Map.get(key, default)</code> for an absent key</span></span></span></summary>
251
+ <div class="compat-evidence"><div class="compat-probe">GAP CLOSED, 2026-07-21: the Storage evaluator now implements own-key <code>Map.keys()</code>, structural <code>hasAll()</code>, and string-key <code>Map.get(key, default)</code>. <code>oracle:rules-storage-upload-primitives-boundaries</code> replays the production required-key and absent-key-default cases directly with no divergence pin; public-seam unit cases cover both admitted forms.</div></div>
252
+ </details>
253
+ <details class="compat-row" data-status="ok">
254
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>request.resource</code> on delete where no incoming object exists: <code>request.resource == null</code></span></span></span></summary>
255
+ <div class="compat-evidence"><div class="compat-probe">GAP CLOSED, 2026-07-21: production errors when <code>request.resource</code> is absent on delete, including a direct null comparison. The evaluator now carries the absent incoming binding as a Rules error. <code>oracle:rules-storage-upload-primitives-boundaries</code> replays the captured DENY directly with no divergence pin; <code>unit:storage/sandbox/rules-evaluator.test.ts</code> covers the evaluator seam.</div></div>
256
+ </details>
257
+ <details class="compat-row" data-status="diverged">
258
+ <summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">Mocked Storage-to-Firestore lookup evaluation: get/exists return and missing-field errors, repeated and same-resolved-path calls, get+exists composition, and lazy <code>||</code>/<code>&amp;&amp;</code>/ternary branches with hosted function-call diagnostics</span></span></span></summary>
259
+ <div class="compat-evidence"><div class="compat-probe">DOCUMENTED MOCK-ORACLE DIVERGENCE, 2026-07-21: <code>oracle:rules-storage-firestore-lookup-budget</code> 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.</div></div>
260
+ </details>
261
+ <details class="compat-row" data-status="ok">
262
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">Anonymous <code>request.auth != null</code> used as a ternary condition before a cross-service lookup</span></span></span></summary>
263
+ <div class="compat-evidence"><div class="compat-probe">GAP CLOSED, 2026-07-21: anonymous <code>request.auth</code> is now represented as an absent-property Rules error, so a ternary condition denies before selecting either lookup branch, matching hosted diagnostics. <code>oracle:rules-storage-firestore-lookup-budget</code> replays the captured DENY directly with no divergence pin; <code>unit:storage/sandbox/rules-methods.test.ts</code> covers the lookup evaluator seam.</div></div>
264
+ </details>
265
+ <details class="compat-row" data-status="ok">
266
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">Real-resource Storage-to-Firestore contract: at most two distinct document paths per evaluation with repeated-path caching; typed document data and missing-document errors; default-database-only and owning-project isolation; lazy/helper/let composition; and independence from Firestore client rules</span></span></span></summary>
267
+ <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-21: four deploy-observe-restore captures establish the real-resource contract beyond Rules Test API mocks: <code>oracle:stdlib-realstorage-p3-lookup-budget-iam-enabled</code>, <code>oracle:stdlib-realstorage-p3-advanced-iam-enabled</code>, <code>oracle:stdlib-realstorage-p3-named-database</code>, and <code>oracle:stdlib-realstorage-p3-project-isolation</code>. <code>unit:conformance/storage-stdlib-real-replay.test.ts</code> executes the locally decidable lookup matrices and locks reviewed reconstructions of their normalized probe code; the lock records state whether the digest covers an injected block or a canonical synthetic wrapper. The surrounding deployed base rules were not retained, so no full-source digest is claimed for these historical captures. Future rigs emit both probe-block and full deployed-rules-file digests. <code>unit:storage/enforce.test.ts</code> proves the normal enforcement seam reads only its owning sandbox and bypasses Firestore client rules. The separate consistency capture remains bounded characterization and is not promoted into a latency guarantee.</div></div>
268
+ </details>
269
+ <details class="compat-row" data-status="ok">
270
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">The service-scoped <code>storage/uploads</code>, <code>storage/metadata</code>, <code>storage/objects</code>, and <code>storage/time</code> modules resolve through <code>2+modules</code> and preserve their production upload-bound, MIME, metadata, operation-identity, and strict timestamp-window semantics</span></span></span></summary>
271
+ <div class="compat-evidence"><div class="compat-probe">NEW ROW, 2026-07-21: one bounded Rules Test API batch captures 15 verdicts for the exact 13 deployable function bodies in the four shipped modules (<code>oracle:rules-storage-stdlib-storage-modules</code>). A separately authored, explicitly reconstructed normalized-AST digest locks the captured corpus bodies, and the source-lock test requires the shipped modules to remain AST-identical. The generic Storage stdlib fixture runner and oracle replay execute those bodies locally; resolver tests prove the modules are admitted only for <code>firebase.storage</code>, lower to plain v2, and fail closed under Firestore. The module surface intentionally excludes the advanced integrity, metadata-diff, and cross-service lookup candidates.</div></div>
272
+ </details>
229
273
  </div>
230
274
 
231
275
  ## RTDB rules engine — production simulator conformance (rules-rtdb corpus)
@@ -300,20 +344,6 @@
300
344
  Known differences between Pyric and production Firebase. Each remains tracked as a non-conforming row.
301
345
 
302
346
  <div class="compat-list">
303
- <details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>Bytes</code>, <code>String.toUtf8()</code>, and <code>hashing.{md5,sha256,crc32,crc32c}()</code> (Item 5.3) in rules</span></span></span></summary>
304
- <div class="compat-evidence"><div class="compat-note"><code>oracle:rules-firestore-bytes-toutf8-and-hashing</code> production Firestore Rules Test API verdicts for corpus scenario "bytes-toutf8-and-hashing", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator's toUtf8/md5/sha256/crc32/crc32c byte-encoding and reference-hash implementations diverge from production on all 5 scenario cases, so a rule that should DENY on hash mismatch ALLOWs locally — pinned KNOWN_DIVERGENCE</div></div></details>
305
- <details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>getAfter()</code>/<code>existsAfter()</code> (Item 7) in rules — post-write document identity and existence semantics</span></span></span></summary>
306
- <div class="compat-evidence"><div class="compat-note"><code>oracle:rules-firestore-get-after-and-exists-after</code> — production Firestore Rules Test API verdicts for corpus scenario "get-after-and-exists-after", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator does not model the post-write document identity/existence production compares against on 4 scenario cases (getAfter target identity, existsAfter on create/delete, existsAfter over an unrelated mocked path) — pinned KNOWN_DIVERGENCE</div></div></details>
307
- <details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>get()</code> of a missing document (RULES-B8) in rules — resource identity (<code>id</code>/<code>__name__</code>) exposure on a mocked/missing get() result</span></span></span></summary>
308
- <div class="compat-evidence"><div class="compat-note"><code>oracle:rules-firestore-get-missing-doc</code> — production Firestore Rules Test API verdicts for corpus scenario "get-missing-doc", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator synthesizes a resource identity (<code>id</code>, <code>__name__</code>) for mocked get() results that production leaves absent, on 2 scenario cases — pinned KNOWN_DIVERGENCE</div></div></details>
309
- <details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>request.path</code>/<code>request.query</code>/<code>resource.id</code>/<code>resource.__name__</code> globals (Item 6) in rules</span></span></span></summary>
310
- <div class="compat-evidence"><div class="compat-note"><code>oracle:rules-firestore-globals-request-path-and-resource-id</code> — production Firestore Rules Test API verdicts for corpus scenario "globals-request-path-and-resource-id", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator models <code>request.query</code> as an empty map on the empty-query case where production denies the equivalent comparison — pinned KNOWN_DIVERGENCE. Contamination scope is <code>request.query</code> ALONE: the scenario's <code>request.path</code> cases conform, and its <code>resource.id</code>/<code>resource.__name__</code> cases conform because they run on a <code>create</code> (where <code>resource</code> is null pre-write). Resource identity on an EXISTING document is scoped to firestore-rules#183.</div></div></details>
311
- <details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>int</code>/<code>float</code> division and type distinction (RULES-B5) in rules — truncating int÷int, float division stays float, div-by-zero denies, <code>is int</code>/<code>is float</code> distinct</span></span></span></summary>
312
- <div class="compat-evidence"><div class="compat-note"><code>oracle:rules-firestore-int-float-and-division</code> — production Firestore Rules Test API verdicts for corpus scenario "int-float-and-division", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator narrows a float-valued payload field toward int on the float-payload case, unlike production which preserves the float type — pinned KNOWN_DIVERGENCE</div></div></details>
313
- <details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior"><code>Path</code> wrapper, <code>path()</code> constructor, and <code>Path.bind()</code> (Item 5.4) in rules</span></span></span></summary>
314
- <div class="compat-evidence"><div class="compat-note"><code>oracle:rules-firestore-path-constructor-and-bind</code> — production Firestore Rules Test API verdicts for corpus scenario "path-constructor-and-bind", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator treats <code>path()</code> as idempotent on an already-Path argument where production denies — pinned KNOWN_DIVERGENCE</div></div></details>
315
- <details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules simulator</code><span class="compat-sub"><span class="compat-behavior">Range-slice <code>[i:j]</code> syntax for <code>List</code> and <code>String</code> (Item 4) in rules</span></span></span></summary>
316
- <div class="compat-evidence"><div class="compat-note"><code>oracle:rules-firestore-range-slice-list-and-string</code> — production Firestore Rules Test API verdicts for corpus scenario "range-slice-list-and-string", replayed verdict-for-verdict against the local rules simulator by <code>unit:rules/oracle-conformance.test.ts</code>. simulator clamps an out-of-bounds slice end to the collection length on both the list and string OOB-slice cases; production denies — pinned KNOWN_DIVERGENCE</div></div></details>
317
- <details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior"><code>resource</code> on a create where no object exists: the create-if-absent guard <code>allow create: if resource == null</code></span></span></span></summary>
318
- <div class="compat-evidence"><div class="compat-note">divergence, over-permissive (the evaluator ALLOWs where production DENIEs, the highest-severity direction defined in <code>docs/storage/reference/conformance-gaps.md</code>). <code>oracle:rules-storage-verbs-umbrella-granular</code>, case "create allowed when object does not exist (resource == null)": production DENIES. Production raises a null value error on a <code>resource</code> reference in a create where no object exists, and the errored expression denies, so a <code>create</code> rule guarded by <code>resource == null</code> never allows. The evaluator models <code>resource</code> as null on create, evaluates the comparison as documented, and ALLOWS. Live-probed against production before pinning with both an omitted <code>resource</code> field and an explicit null, which denied identically, ruling out a capture-harness wire-shape bug. Both sides pinned in <code>unit:storage/rules-oracle-conformance.test.ts</code> KNOWN_DIVERGENCES. Same error-value class as the Firestore <code>resource</code> identity on a missing document.</div></div></details>
347
+ <details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Rules</code><span class="compat-sub"><span class="compat-behavior">Mocked Storage-to-Firestore lookup evaluation: get/exists return and missing-field errors, repeated and same-resolved-path calls, get+exists composition, and lazy <code>||</code>/<code>&amp;&amp;</code>/ternary branches with hosted function-call diagnostics</span></span></span></summary>
348
+ <div class="compat-evidence"><div class="compat-note">DOCUMENTED MOCK-ORACLE DIVERGENCE, 2026-07-21: <code>oracle:rules-storage-firestore-lookup-budget</code> 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.</div></div></details>
319
349
  </div>