@pyric/cli 0.1.0-alpha.30.2 → 0.1.0-alpha.31

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 (1327) hide show
  1. package/dist/assurance/.generated/conformance-verdicts.d.ts +107 -40
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  3. package/dist/assurance/.generated/conformance-verdicts.js +107 -40
  4. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  5. package/dist/assurance/capabilities.d.ts.map +1 -1
  6. package/dist/assurance/capabilities.js +12 -14
  7. package/dist/assurance/capabilities.js.map +1 -1
  8. package/dist/bounded-request.d.ts +27 -5
  9. package/dist/bounded-request.d.ts.map +1 -1
  10. package/dist/bounded-request.js +48 -4
  11. package/dist/bounded-request.js.map +1 -1
  12. package/dist/bridge/client/bridge-url.d.ts +5 -1
  13. package/dist/bridge/client/bridge-url.d.ts.map +1 -1
  14. package/dist/bridge/client/bridge-url.js +5 -1
  15. package/dist/bridge/client/bridge-url.js.map +1 -1
  16. package/dist/bridge/client/bridge.d.ts +9 -3
  17. package/dist/bridge/client/bridge.d.ts.map +1 -1
  18. package/dist/bridge/client/bridge.js +17 -3
  19. package/dist/bridge/client/bridge.js.map +1 -1
  20. package/dist/bridge/frame-output.d.ts.map +1 -1
  21. package/dist/bridge/frame-output.js +46 -0
  22. package/dist/bridge/frame-output.js.map +1 -1
  23. package/dist/bridge/protocol.d.ts +10 -0
  24. package/dist/bridge/protocol.d.ts.map +1 -1
  25. package/dist/bridge/protocol.js +10 -0
  26. package/dist/bridge/protocol.js.map +1 -1
  27. package/dist/bridge/server/in-process.d.ts +16 -7
  28. package/dist/bridge/server/in-process.d.ts.map +1 -1
  29. package/dist/bridge/server/in-process.js +51 -17
  30. package/dist/bridge/server/in-process.js.map +1 -1
  31. package/dist/bridge/server/peer.d.ts +8 -0
  32. package/dist/bridge/server/peer.d.ts.map +1 -1
  33. package/dist/bridge/server/peer.js +10 -0
  34. package/dist/bridge/server/peer.js.map +1 -1
  35. package/dist/bridge/server/standalone.d.ts +7 -2
  36. package/dist/bridge/server/standalone.d.ts.map +1 -1
  37. package/dist/bridge/server/standalone.js +27 -99
  38. package/dist/bridge/server/standalone.js.map +1 -1
  39. package/dist/bridge/surface/arguments/firestore.d.ts +6 -6
  40. package/dist/bridge/surface/arguments/sandbox.d.ts +0 -47
  41. package/dist/bridge/surface/arguments/sandbox.d.ts.map +1 -1
  42. package/dist/bridge/surface/arguments/sandbox.js +2 -59
  43. package/dist/bridge/surface/arguments/sandbox.js.map +1 -1
  44. package/dist/bridge/surface/arguments/seed.d.ts +61 -0
  45. package/dist/bridge/surface/arguments/seed.d.ts.map +1 -0
  46. package/dist/bridge/surface/arguments/seed.js +67 -0
  47. package/dist/bridge/surface/arguments/seed.js.map +1 -0
  48. package/dist/bridge/surface/arguments/storage.d.ts +2 -2
  49. package/dist/bridge/surface/context.d.ts +5 -10
  50. package/dist/bridge/surface/context.d.ts.map +1 -1
  51. package/dist/bridge/surface/context.js +11 -23
  52. package/dist/bridge/surface/context.js.map +1 -1
  53. package/dist/bridge/surface/database-instance-catalog.d.ts +0 -3
  54. package/dist/bridge/surface/database-instance-catalog.d.ts.map +1 -1
  55. package/dist/bridge/surface/database-instance-catalog.js +4 -27
  56. package/dist/bridge/surface/database-instance-catalog.js.map +1 -1
  57. package/dist/bridge/surface/database-instance-project.d.ts +5 -0
  58. package/dist/bridge/surface/database-instance-project.d.ts.map +1 -0
  59. package/dist/bridge/surface/database-instance-project.js +32 -0
  60. package/dist/bridge/surface/database-instance-project.js.map +1 -0
  61. package/dist/bridge/surface/database-instance.d.ts +3 -3
  62. package/dist/bridge/surface/database-instance.d.ts.map +1 -1
  63. package/dist/bridge/surface/database-instance.js +1 -2
  64. package/dist/bridge/surface/database-instance.js.map +1 -1
  65. package/dist/bridge/surface/functions-runtime.d.ts +2 -2
  66. package/dist/bridge/surface/functions-runtime.js +5 -5
  67. package/dist/bridge/surface/functions-runtime.js.map +1 -1
  68. package/dist/bridge/surface/held-identity.d.ts +4 -4
  69. package/dist/bridge/surface/held-identity.d.ts.map +1 -1
  70. package/dist/bridge/surface/held-identity.js.map +1 -1
  71. package/dist/bridge/surface/manifest.sandbox.generated.d.ts +3 -0
  72. package/dist/bridge/surface/manifest.sandbox.generated.d.ts.map +1 -0
  73. package/dist/bridge/surface/manifest.sandbox.generated.js +135 -0
  74. package/dist/bridge/surface/manifest.sandbox.generated.js.map +1 -0
  75. package/dist/bridge/surface/method-types.d.ts +48 -7
  76. package/dist/bridge/surface/method-types.d.ts.map +1 -1
  77. package/dist/bridge/surface/method-types.js +15 -0
  78. package/dist/bridge/surface/method-types.js.map +1 -1
  79. package/dist/bridge/surface/methods/ai_logic/clearScripts.d.ts +2 -1
  80. package/dist/bridge/surface/methods/ai_logic/clearScripts.d.ts.map +1 -1
  81. package/dist/bridge/surface/methods/ai_logic/clearScripts.js +2 -1
  82. package/dist/bridge/surface/methods/ai_logic/clearScripts.js.map +1 -1
  83. package/dist/bridge/surface/methods/ai_logic/script.d.ts +2 -1
  84. package/dist/bridge/surface/methods/ai_logic/script.d.ts.map +1 -1
  85. package/dist/bridge/surface/methods/ai_logic/script.js +2 -1
  86. package/dist/bridge/surface/methods/ai_logic/script.js.map +1 -1
  87. package/dist/bridge/surface/methods/ai_logic/scripts.d.ts +2 -1
  88. package/dist/bridge/surface/methods/ai_logic/scripts.d.ts.map +1 -1
  89. package/dist/bridge/surface/methods/ai_logic/scripts.js +2 -1
  90. package/dist/bridge/surface/methods/ai_logic/scripts.js.map +1 -1
  91. package/dist/bridge/surface/methods/ai_logic/status.d.ts +2 -1
  92. package/dist/bridge/surface/methods/ai_logic/status.d.ts.map +1 -1
  93. package/dist/bridge/surface/methods/ai_logic/status.js +1 -0
  94. package/dist/bridge/surface/methods/ai_logic/status.js.map +1 -1
  95. package/dist/bridge/surface/methods/assurance/attach.d.ts +1 -0
  96. package/dist/bridge/surface/methods/assurance/attach.d.ts.map +1 -1
  97. package/dist/bridge/surface/methods/assurance/attach.js +1 -0
  98. package/dist/bridge/surface/methods/assurance/attach.js.map +1 -1
  99. package/dist/bridge/surface/methods/assurance/canIUse.d.ts +1 -0
  100. package/dist/bridge/surface/methods/assurance/canIUse.d.ts.map +1 -1
  101. package/dist/bridge/surface/methods/assurance/canIUse.js +1 -0
  102. package/dist/bridge/surface/methods/assurance/canIUse.js.map +1 -1
  103. package/dist/bridge/surface/methods/assurance/define.d.ts +1 -0
  104. package/dist/bridge/surface/methods/assurance/define.d.ts.map +1 -1
  105. package/dist/bridge/surface/methods/assurance/define.js +1 -0
  106. package/dist/bridge/surface/methods/assurance/define.js.map +1 -1
  107. package/dist/bridge/surface/methods/assurance/export.d.ts +1 -0
  108. package/dist/bridge/surface/methods/assurance/export.d.ts.map +1 -1
  109. package/dist/bridge/surface/methods/assurance/export.js +1 -0
  110. package/dist/bridge/surface/methods/assurance/export.js.map +1 -1
  111. package/dist/bridge/surface/methods/assurance/inspect.d.ts +1 -0
  112. package/dist/bridge/surface/methods/assurance/inspect.d.ts.map +1 -1
  113. package/dist/bridge/surface/methods/assurance/inspect.js +1 -0
  114. package/dist/bridge/surface/methods/assurance/inspect.js.map +1 -1
  115. package/dist/bridge/surface/methods/assurance/map.d.ts +1 -0
  116. package/dist/bridge/surface/methods/assurance/map.d.ts.map +1 -1
  117. package/dist/bridge/surface/methods/assurance/map.js +1 -0
  118. package/dist/bridge/surface/methods/assurance/map.js.map +1 -1
  119. package/dist/bridge/surface/methods/assurance/minimize.d.ts +1 -0
  120. package/dist/bridge/surface/methods/assurance/minimize.d.ts.map +1 -1
  121. package/dist/bridge/surface/methods/assurance/minimize.js +1 -0
  122. package/dist/bridge/surface/methods/assurance/minimize.js.map +1 -1
  123. package/dist/bridge/surface/methods/assurance/propose.d.ts +1 -0
  124. package/dist/bridge/surface/methods/assurance/propose.d.ts.map +1 -1
  125. package/dist/bridge/surface/methods/assurance/propose.js +1 -0
  126. package/dist/bridge/surface/methods/assurance/propose.js.map +1 -1
  127. package/dist/bridge/surface/methods/assurance/replaySession.d.ts +1 -0
  128. package/dist/bridge/surface/methods/assurance/replaySession.d.ts.map +1 -1
  129. package/dist/bridge/surface/methods/assurance/replaySession.js +1 -0
  130. package/dist/bridge/surface/methods/assurance/replaySession.js.map +1 -1
  131. package/dist/bridge/surface/methods/assurance/run.d.ts +1 -0
  132. package/dist/bridge/surface/methods/assurance/run.d.ts.map +1 -1
  133. package/dist/bridge/surface/methods/assurance/run.js +1 -0
  134. package/dist/bridge/surface/methods/assurance/run.js.map +1 -1
  135. package/dist/bridge/surface/methods/assurance/start.d.ts +1 -0
  136. package/dist/bridge/surface/methods/assurance/start.d.ts.map +1 -1
  137. package/dist/bridge/surface/methods/assurance/start.js +1 -0
  138. package/dist/bridge/surface/methods/assurance/start.js.map +1 -1
  139. package/dist/bridge/surface/methods/assurance/testRulesHosted.d.ts +1 -0
  140. package/dist/bridge/surface/methods/assurance/testRulesHosted.d.ts.map +1 -1
  141. package/dist/bridge/surface/methods/assurance/testRulesHosted.js +1 -0
  142. package/dist/bridge/surface/methods/assurance/testRulesHosted.js.map +1 -1
  143. package/dist/bridge/surface/methods/assurance/verify.d.ts +1 -0
  144. package/dist/bridge/surface/methods/assurance/verify.d.ts.map +1 -1
  145. package/dist/bridge/surface/methods/assurance/verify.js +1 -0
  146. package/dist/bridge/surface/methods/assurance/verify.js.map +1 -1
  147. package/dist/bridge/surface/methods/assurance/verifyCases.d.ts +1 -0
  148. package/dist/bridge/surface/methods/assurance/verifyCases.d.ts.map +1 -1
  149. package/dist/bridge/surface/methods/assurance/verifyCases.js +1 -0
  150. package/dist/bridge/surface/methods/assurance/verifyCases.js.map +1 -1
  151. package/dist/bridge/surface/methods/auth/actAsAdmin.d.ts +2 -1
  152. package/dist/bridge/surface/methods/auth/actAsAdmin.d.ts.map +1 -1
  153. package/dist/bridge/surface/methods/auth/actAsAdmin.js +1 -0
  154. package/dist/bridge/surface/methods/auth/actAsAdmin.js.map +1 -1
  155. package/dist/bridge/surface/methods/auth/actAsAnonymous.d.ts +2 -1
  156. package/dist/bridge/surface/methods/auth/actAsAnonymous.d.ts.map +1 -1
  157. package/dist/bridge/surface/methods/auth/actAsAnonymous.js +1 -0
  158. package/dist/bridge/surface/methods/auth/actAsAnonymous.js.map +1 -1
  159. package/dist/bridge/surface/methods/auth/createCustomToken.d.ts +1 -0
  160. package/dist/bridge/surface/methods/auth/createCustomToken.d.ts.map +1 -1
  161. package/dist/bridge/surface/methods/auth/createCustomToken.js +1 -0
  162. package/dist/bridge/surface/methods/auth/createCustomToken.js.map +1 -1
  163. package/dist/bridge/surface/methods/auth/createUser.d.ts +2 -1
  164. package/dist/bridge/surface/methods/auth/createUser.d.ts.map +1 -1
  165. package/dist/bridge/surface/methods/auth/createUser.js +2 -1
  166. package/dist/bridge/surface/methods/auth/createUser.js.map +1 -1
  167. package/dist/bridge/surface/methods/auth/deleteUser.d.ts +2 -1
  168. package/dist/bridge/surface/methods/auth/deleteUser.d.ts.map +1 -1
  169. package/dist/bridge/surface/methods/auth/deleteUser.js +2 -1
  170. package/dist/bridge/surface/methods/auth/deleteUser.js.map +1 -1
  171. package/dist/bridge/surface/methods/auth/getUser.d.ts +2 -1
  172. package/dist/bridge/surface/methods/auth/getUser.d.ts.map +1 -1
  173. package/dist/bridge/surface/methods/auth/getUser.js +2 -1
  174. package/dist/bridge/surface/methods/auth/getUser.js.map +1 -1
  175. package/dist/bridge/surface/methods/auth/getUserByEmail.d.ts +2 -1
  176. package/dist/bridge/surface/methods/auth/getUserByEmail.d.ts.map +1 -1
  177. package/dist/bridge/surface/methods/auth/getUserByEmail.js +2 -1
  178. package/dist/bridge/surface/methods/auth/getUserByEmail.js.map +1 -1
  179. package/dist/bridge/surface/methods/auth/impersonate.d.ts +2 -1
  180. package/dist/bridge/surface/methods/auth/impersonate.d.ts.map +1 -1
  181. package/dist/bridge/surface/methods/auth/impersonate.js +1 -0
  182. package/dist/bridge/surface/methods/auth/impersonate.js.map +1 -1
  183. package/dist/bridge/surface/methods/auth/importUsers.d.ts +2 -1
  184. package/dist/bridge/surface/methods/auth/importUsers.d.ts.map +1 -1
  185. package/dist/bridge/surface/methods/auth/importUsers.js +3 -2
  186. package/dist/bridge/surface/methods/auth/importUsers.js.map +1 -1
  187. package/dist/bridge/surface/methods/auth/listUsers.d.ts +2 -1
  188. package/dist/bridge/surface/methods/auth/listUsers.d.ts.map +1 -1
  189. package/dist/bridge/surface/methods/auth/listUsers.js +2 -1
  190. package/dist/bridge/surface/methods/auth/listUsers.js.map +1 -1
  191. package/dist/bridge/surface/methods/auth/sessions.d.ts +2 -1
  192. package/dist/bridge/surface/methods/auth/sessions.d.ts.map +1 -1
  193. package/dist/bridge/surface/methods/auth/sessions.js +1 -0
  194. package/dist/bridge/surface/methods/auth/sessions.js.map +1 -1
  195. package/dist/bridge/surface/methods/auth/setCustomUserClaims.d.ts +2 -1
  196. package/dist/bridge/surface/methods/auth/setCustomUserClaims.d.ts.map +1 -1
  197. package/dist/bridge/surface/methods/auth/setCustomUserClaims.js +2 -1
  198. package/dist/bridge/surface/methods/auth/setCustomUserClaims.js.map +1 -1
  199. package/dist/bridge/surface/methods/auth/signInAnonymously.d.ts +2 -1
  200. package/dist/bridge/surface/methods/auth/signInAnonymously.d.ts.map +1 -1
  201. package/dist/bridge/surface/methods/auth/signInAnonymously.js +1 -0
  202. package/dist/bridge/surface/methods/auth/signInAnonymously.js.map +1 -1
  203. package/dist/bridge/surface/methods/auth/signInWithCredential.d.ts +2 -1
  204. package/dist/bridge/surface/methods/auth/signInWithCredential.d.ts.map +1 -1
  205. package/dist/bridge/surface/methods/auth/signInWithCredential.js +1 -0
  206. package/dist/bridge/surface/methods/auth/signInWithCredential.js.map +1 -1
  207. package/dist/bridge/surface/methods/auth/signInWithCustomToken.d.ts +2 -1
  208. package/dist/bridge/surface/methods/auth/signInWithCustomToken.d.ts.map +1 -1
  209. package/dist/bridge/surface/methods/auth/signInWithCustomToken.js +1 -0
  210. package/dist/bridge/surface/methods/auth/signInWithCustomToken.js.map +1 -1
  211. package/dist/bridge/surface/methods/auth/signInWithEmailAndPassword.d.ts +2 -1
  212. package/dist/bridge/surface/methods/auth/signInWithEmailAndPassword.d.ts.map +1 -1
  213. package/dist/bridge/surface/methods/auth/signInWithEmailAndPassword.js +1 -0
  214. package/dist/bridge/surface/methods/auth/signInWithEmailAndPassword.js.map +1 -1
  215. package/dist/bridge/surface/methods/auth/signOut.d.ts +2 -1
  216. package/dist/bridge/surface/methods/auth/signOut.d.ts.map +1 -1
  217. package/dist/bridge/surface/methods/auth/signOut.js +1 -0
  218. package/dist/bridge/surface/methods/auth/signOut.js.map +1 -1
  219. package/dist/bridge/surface/methods/auth/takeAuthMail.d.ts +2 -1
  220. package/dist/bridge/surface/methods/auth/takeAuthMail.d.ts.map +1 -1
  221. package/dist/bridge/surface/methods/auth/takeAuthMail.js +1 -0
  222. package/dist/bridge/surface/methods/auth/takeAuthMail.js.map +1 -1
  223. package/dist/bridge/surface/methods/auth/updateUser.d.ts +2 -1
  224. package/dist/bridge/surface/methods/auth/updateUser.d.ts.map +1 -1
  225. package/dist/bridge/surface/methods/auth/updateUser.js +2 -1
  226. package/dist/bridge/surface/methods/auth/updateUser.js.map +1 -1
  227. package/dist/bridge/surface/methods/auth/useAppSession.d.ts +2 -1
  228. package/dist/bridge/surface/methods/auth/useAppSession.d.ts.map +1 -1
  229. package/dist/bridge/surface/methods/auth/useAppSession.js +1 -0
  230. package/dist/bridge/surface/methods/auth/useAppSession.js.map +1 -1
  231. package/dist/bridge/surface/methods/auth/whoami.d.ts +2 -1
  232. package/dist/bridge/surface/methods/auth/whoami.d.ts.map +1 -1
  233. package/dist/bridge/surface/methods/auth/whoami.js +1 -0
  234. package/dist/bridge/surface/methods/auth/whoami.js.map +1 -1
  235. package/dist/bridge/surface/methods/database/crawl.d.ts +2 -1
  236. package/dist/bridge/surface/methods/database/crawl.d.ts.map +1 -1
  237. package/dist/bridge/surface/methods/database/crawl.js +1 -0
  238. package/dist/bridge/surface/methods/database/crawl.js.map +1 -1
  239. package/dist/bridge/surface/methods/database/get.d.ts +2 -1
  240. package/dist/bridge/surface/methods/database/get.d.ts.map +1 -1
  241. package/dist/bridge/surface/methods/database/get.js +1 -0
  242. package/dist/bridge/surface/methods/database/get.js.map +1 -1
  243. package/dist/bridge/surface/methods/database/push.d.ts +2 -1
  244. package/dist/bridge/surface/methods/database/push.d.ts.map +1 -1
  245. package/dist/bridge/surface/methods/database/push.js +1 -0
  246. package/dist/bridge/surface/methods/database/push.js.map +1 -1
  247. package/dist/bridge/surface/methods/database/query.d.ts +2 -1
  248. package/dist/bridge/surface/methods/database/query.d.ts.map +1 -1
  249. package/dist/bridge/surface/methods/database/query.js +1 -0
  250. package/dist/bridge/surface/methods/database/query.js.map +1 -1
  251. package/dist/bridge/surface/methods/database/remove.d.ts +2 -1
  252. package/dist/bridge/surface/methods/database/remove.d.ts.map +1 -1
  253. package/dist/bridge/surface/methods/database/remove.js +1 -0
  254. package/dist/bridge/surface/methods/database/remove.js.map +1 -1
  255. package/dist/bridge/surface/methods/database/set.d.ts +2 -1
  256. package/dist/bridge/surface/methods/database/set.d.ts.map +1 -1
  257. package/dist/bridge/surface/methods/database/set.js +1 -0
  258. package/dist/bridge/surface/methods/database/set.js.map +1 -1
  259. package/dist/bridge/surface/methods/database/update.d.ts +2 -1
  260. package/dist/bridge/surface/methods/database/update.d.ts.map +1 -1
  261. package/dist/bridge/surface/methods/database/update.js +1 -0
  262. package/dist/bridge/surface/methods/database/update.js.map +1 -1
  263. package/dist/bridge/surface/methods/firestore/addDoc.d.ts +2 -1
  264. package/dist/bridge/surface/methods/firestore/addDoc.d.ts.map +1 -1
  265. package/dist/bridge/surface/methods/firestore/addDoc.js +2 -1
  266. package/dist/bridge/surface/methods/firestore/addDoc.js.map +1 -1
  267. package/dist/bridge/surface/methods/firestore/deleteDoc.d.ts +2 -1
  268. package/dist/bridge/surface/methods/firestore/deleteDoc.d.ts.map +1 -1
  269. package/dist/bridge/surface/methods/firestore/deleteDoc.js +2 -1
  270. package/dist/bridge/surface/methods/firestore/deleteDoc.js.map +1 -1
  271. package/dist/bridge/surface/methods/firestore/discoverPaths.d.ts +2 -1
  272. package/dist/bridge/surface/methods/firestore/discoverPaths.d.ts.map +1 -1
  273. package/dist/bridge/surface/methods/firestore/discoverPaths.js +1 -0
  274. package/dist/bridge/surface/methods/firestore/discoverPaths.js.map +1 -1
  275. package/dist/bridge/surface/methods/firestore/extractIndexes.d.ts +7 -6
  276. package/dist/bridge/surface/methods/firestore/extractIndexes.d.ts.map +1 -1
  277. package/dist/bridge/surface/methods/firestore/extractIndexes.js +1 -0
  278. package/dist/bridge/surface/methods/firestore/extractIndexes.js.map +1 -1
  279. package/dist/bridge/surface/methods/firestore/findCollectionGroup.d.ts +2 -1
  280. package/dist/bridge/surface/methods/firestore/findCollectionGroup.d.ts.map +1 -1
  281. package/dist/bridge/surface/methods/firestore/findCollectionGroup.js +1 -0
  282. package/dist/bridge/surface/methods/firestore/findCollectionGroup.js.map +1 -1
  283. package/dist/bridge/surface/methods/firestore/getAggregateFromServer.d.ts +6 -5
  284. package/dist/bridge/surface/methods/firestore/getAggregateFromServer.d.ts.map +1 -1
  285. package/dist/bridge/surface/methods/firestore/getAggregateFromServer.js +1 -0
  286. package/dist/bridge/surface/methods/firestore/getAggregateFromServer.js.map +1 -1
  287. package/dist/bridge/surface/methods/firestore/getCountFromServer.d.ts +6 -5
  288. package/dist/bridge/surface/methods/firestore/getCountFromServer.d.ts.map +1 -1
  289. package/dist/bridge/surface/methods/firestore/getCountFromServer.js +1 -0
  290. package/dist/bridge/surface/methods/firestore/getCountFromServer.js.map +1 -1
  291. package/dist/bridge/surface/methods/firestore/getDoc.d.ts +2 -1
  292. package/dist/bridge/surface/methods/firestore/getDoc.d.ts.map +1 -1
  293. package/dist/bridge/surface/methods/firestore/getDoc.js +2 -1
  294. package/dist/bridge/surface/methods/firestore/getDoc.js.map +1 -1
  295. package/dist/bridge/surface/methods/firestore/getDocs.d.ts +6 -5
  296. package/dist/bridge/surface/methods/firestore/getDocs.d.ts.map +1 -1
  297. package/dist/bridge/surface/methods/firestore/getDocs.js +2 -1
  298. package/dist/bridge/surface/methods/firestore/getDocs.js.map +1 -1
  299. package/dist/bridge/surface/methods/firestore/setDoc.d.ts +2 -1
  300. package/dist/bridge/surface/methods/firestore/setDoc.d.ts.map +1 -1
  301. package/dist/bridge/surface/methods/firestore/setDoc.js +2 -1
  302. package/dist/bridge/surface/methods/firestore/setDoc.js.map +1 -1
  303. package/dist/bridge/surface/methods/firestore/updateDoc.d.ts +2 -1
  304. package/dist/bridge/surface/methods/firestore/updateDoc.d.ts.map +1 -1
  305. package/dist/bridge/surface/methods/firestore/updateDoc.js +2 -1
  306. package/dist/bridge/surface/methods/firestore/updateDoc.js.map +1 -1
  307. package/dist/bridge/surface/methods/firestore/writeBatch.d.ts +2 -1
  308. package/dist/bridge/surface/methods/firestore/writeBatch.d.ts.map +1 -1
  309. package/dist/bridge/surface/methods/firestore/writeBatch.js +2 -1
  310. package/dist/bridge/surface/methods/firestore/writeBatch.js.map +1 -1
  311. package/dist/bridge/surface/methods/firestore/writeIndexes.d.ts +1 -0
  312. package/dist/bridge/surface/methods/firestore/writeIndexes.d.ts.map +1 -1
  313. package/dist/bridge/surface/methods/firestore/writeIndexes.js +1 -0
  314. package/dist/bridge/surface/methods/firestore/writeIndexes.js.map +1 -1
  315. package/dist/bridge/surface/methods/functions/executions.d.ts +3 -2
  316. package/dist/bridge/surface/methods/functions/executions.d.ts.map +1 -1
  317. package/dist/bridge/surface/methods/functions/executions.js +2 -1
  318. package/dist/bridge/surface/methods/functions/executions.js.map +1 -1
  319. package/dist/bridge/surface/methods/functions/fire.d.ts +1 -0
  320. package/dist/bridge/surface/methods/functions/fire.d.ts.map +1 -1
  321. package/dist/bridge/surface/methods/functions/fire.js +6 -5
  322. package/dist/bridge/surface/methods/functions/fire.js.map +1 -1
  323. package/dist/bridge/surface/methods/functions/listTriggers.d.ts +2 -1
  324. package/dist/bridge/surface/methods/functions/listTriggers.d.ts.map +1 -1
  325. package/dist/bridge/surface/methods/functions/listTriggers.js +1 -0
  326. package/dist/bridge/surface/methods/functions/listTriggers.js.map +1 -1
  327. package/dist/bridge/surface/methods/messaging/deliveries.d.ts +2 -1
  328. package/dist/bridge/surface/methods/messaging/deliveries.d.ts.map +1 -1
  329. package/dist/bridge/surface/methods/messaging/deliveries.js +1 -0
  330. package/dist/bridge/surface/methods/messaging/deliveries.js.map +1 -1
  331. package/dist/bridge/surface/methods/messaging/send.d.ts +2 -1
  332. package/dist/bridge/surface/methods/messaging/send.d.ts.map +1 -1
  333. package/dist/bridge/surface/methods/messaging/send.js +2 -1
  334. package/dist/bridge/surface/methods/messaging/send.js.map +1 -1
  335. package/dist/bridge/surface/methods/messaging/subscribeToTopic.d.ts +2 -1
  336. package/dist/bridge/surface/methods/messaging/subscribeToTopic.d.ts.map +1 -1
  337. package/dist/bridge/surface/methods/messaging/subscribeToTopic.js +1 -0
  338. package/dist/bridge/surface/methods/messaging/subscribeToTopic.js.map +1 -1
  339. package/dist/bridge/surface/methods/messaging/tokens.d.ts +2 -1
  340. package/dist/bridge/surface/methods/messaging/tokens.d.ts.map +1 -1
  341. package/dist/bridge/surface/methods/messaging/tokens.js +1 -0
  342. package/dist/bridge/surface/methods/messaging/tokens.js.map +1 -1
  343. package/dist/bridge/surface/methods/messaging/unsubscribeFromTopic.d.ts +2 -1
  344. package/dist/bridge/surface/methods/messaging/unsubscribeFromTopic.d.ts.map +1 -1
  345. package/dist/bridge/surface/methods/messaging/unsubscribeFromTopic.js +1 -0
  346. package/dist/bridge/surface/methods/messaging/unsubscribeFromTopic.js.map +1 -1
  347. package/dist/bridge/surface/methods/registry.d.ts.map +1 -1
  348. package/dist/bridge/surface/methods/registry.js +2 -8
  349. package/dist/bridge/surface/methods/registry.js.map +1 -1
  350. package/dist/bridge/surface/methods/rules/explainDenial.d.ts +1 -0
  351. package/dist/bridge/surface/methods/rules/explainDenial.d.ts.map +1 -1
  352. package/dist/bridge/surface/methods/rules/explainDenial.js +1 -0
  353. package/dist/bridge/surface/methods/rules/explainDenial.js.map +1 -1
  354. package/dist/bridge/surface/methods/rules/getStdlib.d.ts +1 -0
  355. package/dist/bridge/surface/methods/rules/getStdlib.d.ts.map +1 -1
  356. package/dist/bridge/surface/methods/rules/getStdlib.js +1 -0
  357. package/dist/bridge/surface/methods/rules/getStdlib.js.map +1 -1
  358. package/dist/bridge/surface/methods/rules/lint.d.ts +1 -0
  359. package/dist/bridge/surface/methods/rules/lint.d.ts.map +1 -1
  360. package/dist/bridge/surface/methods/rules/lint.js +1 -0
  361. package/dist/bridge/surface/methods/rules/lint.js.map +1 -1
  362. package/dist/bridge/surface/methods/rules/listStdlib.d.ts +1 -0
  363. package/dist/bridge/surface/methods/rules/listStdlib.d.ts.map +1 -1
  364. package/dist/bridge/surface/methods/rules/listStdlib.js +1 -0
  365. package/dist/bridge/surface/methods/rules/listStdlib.js.map +1 -1
  366. package/dist/bridge/surface/methods/rules/set.d.ts +1 -0
  367. package/dist/bridge/surface/methods/rules/set.d.ts.map +1 -1
  368. package/dist/bridge/surface/methods/rules/set.js +1 -0
  369. package/dist/bridge/surface/methods/rules/set.js.map +1 -1
  370. package/dist/bridge/surface/methods/rules/simulate.d.ts +1 -0
  371. package/dist/bridge/surface/methods/rules/simulate.d.ts.map +1 -1
  372. package/dist/bridge/surface/methods/rules/simulate.js +1 -0
  373. package/dist/bridge/surface/methods/rules/simulate.js.map +1 -1
  374. package/dist/bridge/surface/methods/sandbox/activity.d.ts +2 -1
  375. package/dist/bridge/surface/methods/sandbox/activity.d.ts.map +1 -1
  376. package/dist/bridge/surface/methods/sandbox/activity.js +2 -1
  377. package/dist/bridge/surface/methods/sandbox/activity.js.map +1 -1
  378. package/dist/bridge/surface/methods/sandbox/advanceClock.d.ts +2 -1
  379. package/dist/bridge/surface/methods/sandbox/advanceClock.d.ts.map +1 -1
  380. package/dist/bridge/surface/methods/sandbox/advanceClock.js +1 -0
  381. package/dist/bridge/surface/methods/sandbox/advanceClock.js.map +1 -1
  382. package/dist/bridge/surface/methods/sandbox/apply.d.ts +1 -0
  383. package/dist/bridge/surface/methods/sandbox/apply.d.ts.map +1 -1
  384. package/dist/bridge/surface/methods/sandbox/apply.js +1 -0
  385. package/dist/bridge/surface/methods/sandbox/apply.js.map +1 -1
  386. package/dist/bridge/surface/methods/sandbox/checkpoint.d.ts +1 -0
  387. package/dist/bridge/surface/methods/sandbox/checkpoint.d.ts.map +1 -1
  388. package/dist/bridge/surface/methods/sandbox/checkpoint.js +1 -0
  389. package/dist/bridge/surface/methods/sandbox/checkpoint.js.map +1 -1
  390. package/dist/bridge/surface/methods/sandbox/deleteCapture.d.ts +1 -0
  391. package/dist/bridge/surface/methods/sandbox/deleteCapture.d.ts.map +1 -1
  392. package/dist/bridge/surface/methods/sandbox/deleteCapture.js +1 -1
  393. package/dist/bridge/surface/methods/sandbox/deleteCapture.js.map +1 -1
  394. package/dist/bridge/surface/methods/sandbox/deleteCheckpoint.d.ts +1 -0
  395. package/dist/bridge/surface/methods/sandbox/deleteCheckpoint.d.ts.map +1 -1
  396. package/dist/bridge/surface/methods/sandbox/deleteCheckpoint.js +1 -0
  397. package/dist/bridge/surface/methods/sandbox/deleteCheckpoint.js.map +1 -1
  398. package/dist/bridge/surface/methods/sandbox/diff.d.ts +1 -0
  399. package/dist/bridge/surface/methods/sandbox/diff.d.ts.map +1 -1
  400. package/dist/bridge/surface/methods/sandbox/diff.js +1 -0
  401. package/dist/bridge/surface/methods/sandbox/diff.js.map +1 -1
  402. package/dist/bridge/surface/methods/sandbox/discard.d.ts +1 -0
  403. package/dist/bridge/surface/methods/sandbox/discard.d.ts.map +1 -1
  404. package/dist/bridge/surface/methods/sandbox/discard.js +1 -0
  405. package/dist/bridge/surface/methods/sandbox/discard.js.map +1 -1
  406. package/dist/bridge/surface/methods/sandbox/events.d.ts +2 -1
  407. package/dist/bridge/surface/methods/sandbox/events.d.ts.map +1 -1
  408. package/dist/bridge/surface/methods/sandbox/events.js +2 -1
  409. package/dist/bridge/surface/methods/sandbox/events.js.map +1 -1
  410. package/dist/bridge/surface/methods/sandbox/exportFixture.d.ts +1 -0
  411. package/dist/bridge/surface/methods/sandbox/exportFixture.d.ts.map +1 -1
  412. package/dist/bridge/surface/methods/sandbox/exportFixture.js +1 -0
  413. package/dist/bridge/surface/methods/sandbox/exportFixture.js.map +1 -1
  414. package/dist/bridge/surface/methods/sandbox/fork.d.ts +1 -0
  415. package/dist/bridge/surface/methods/sandbox/fork.d.ts.map +1 -1
  416. package/dist/bridge/surface/methods/sandbox/fork.js +1 -0
  417. package/dist/bridge/surface/methods/sandbox/fork.js.map +1 -1
  418. package/dist/bridge/surface/methods/sandbox/inspect.d.ts +2 -1
  419. package/dist/bridge/surface/methods/sandbox/inspect.d.ts.map +1 -1
  420. package/dist/bridge/surface/methods/sandbox/inspect.js +2 -1
  421. package/dist/bridge/surface/methods/sandbox/inspect.js.map +1 -1
  422. package/dist/bridge/surface/methods/sandbox/listBranches.d.ts +1 -0
  423. package/dist/bridge/surface/methods/sandbox/listBranches.d.ts.map +1 -1
  424. package/dist/bridge/surface/methods/sandbox/listBranches.js +1 -0
  425. package/dist/bridge/surface/methods/sandbox/listBranches.js.map +1 -1
  426. package/dist/bridge/surface/methods/sandbox/listCaptures.d.ts +1 -0
  427. package/dist/bridge/surface/methods/sandbox/listCaptures.d.ts.map +1 -1
  428. package/dist/bridge/surface/methods/sandbox/listCaptures.js +1 -1
  429. package/dist/bridge/surface/methods/sandbox/listCaptures.js.map +1 -1
  430. package/dist/bridge/surface/methods/sandbox/listCheckpoints.d.ts +1 -0
  431. package/dist/bridge/surface/methods/sandbox/listCheckpoints.d.ts.map +1 -1
  432. package/dist/bridge/surface/methods/sandbox/listCheckpoints.js +1 -0
  433. package/dist/bridge/surface/methods/sandbox/listCheckpoints.js.map +1 -1
  434. package/dist/bridge/surface/methods/sandbox/listeners.d.ts +2 -1
  435. package/dist/bridge/surface/methods/sandbox/listeners.d.ts.map +1 -1
  436. package/dist/bridge/surface/methods/sandbox/listeners.js +1 -0
  437. package/dist/bridge/surface/methods/sandbox/listeners.js.map +1 -1
  438. package/dist/bridge/surface/methods/sandbox/openCapture.d.ts +1 -0
  439. package/dist/bridge/surface/methods/sandbox/openCapture.d.ts.map +1 -1
  440. package/dist/bridge/surface/methods/sandbox/openCapture.js +1 -1
  441. package/dist/bridge/surface/methods/sandbox/openCapture.js.map +1 -1
  442. package/dist/bridge/surface/methods/sandbox/promote.d.ts +1 -0
  443. package/dist/bridge/surface/methods/sandbox/promote.d.ts.map +1 -1
  444. package/dist/bridge/surface/methods/sandbox/promote.js +1 -0
  445. package/dist/bridge/surface/methods/sandbox/promote.js.map +1 -1
  446. package/dist/bridge/surface/methods/sandbox/renameCapture.d.ts +3 -2
  447. package/dist/bridge/surface/methods/sandbox/renameCapture.d.ts.map +1 -1
  448. package/dist/bridge/surface/methods/sandbox/renameCapture.js +1 -1
  449. package/dist/bridge/surface/methods/sandbox/renameCapture.js.map +1 -1
  450. package/dist/bridge/surface/methods/sandbox/reset.d.ts +3 -2
  451. package/dist/bridge/surface/methods/sandbox/reset.d.ts.map +1 -1
  452. package/dist/bridge/surface/methods/sandbox/reset.js +1 -0
  453. package/dist/bridge/surface/methods/sandbox/reset.js.map +1 -1
  454. package/dist/bridge/surface/methods/sandbox/resetClock.d.ts +2 -1
  455. package/dist/bridge/surface/methods/sandbox/resetClock.d.ts.map +1 -1
  456. package/dist/bridge/surface/methods/sandbox/resetClock.js +1 -0
  457. package/dist/bridge/surface/methods/sandbox/resetClock.js.map +1 -1
  458. package/dist/bridge/surface/methods/sandbox/restore.d.ts +1 -0
  459. package/dist/bridge/surface/methods/sandbox/restore.d.ts.map +1 -1
  460. package/dist/bridge/surface/methods/sandbox/restore.js +1 -0
  461. package/dist/bridge/surface/methods/sandbox/restore.js.map +1 -1
  462. package/dist/bridge/surface/methods/sandbox/saveCapture.d.ts +1 -0
  463. package/dist/bridge/surface/methods/sandbox/saveCapture.d.ts.map +1 -1
  464. package/dist/bridge/surface/methods/sandbox/saveCapture.js +1 -1
  465. package/dist/bridge/surface/methods/sandbox/saveCapture.js.map +1 -1
  466. package/dist/bridge/surface/methods/sandbox/seed.d.ts +2 -1
  467. package/dist/bridge/surface/methods/sandbox/seed.d.ts.map +1 -1
  468. package/dist/bridge/surface/methods/sandbox/seed.js +3 -2
  469. package/dist/bridge/surface/methods/sandbox/seed.js.map +1 -1
  470. package/dist/bridge/surface/methods/sandbox/seedFromFixture.d.ts +1 -0
  471. package/dist/bridge/surface/methods/sandbox/seedFromFixture.d.ts.map +1 -1
  472. package/dist/bridge/surface/methods/sandbox/seedFromFixture.js +1 -0
  473. package/dist/bridge/surface/methods/sandbox/seedFromFixture.js.map +1 -1
  474. package/dist/bridge/surface/methods/sandbox/setClock.d.ts +2 -1
  475. package/dist/bridge/surface/methods/sandbox/setClock.d.ts.map +1 -1
  476. package/dist/bridge/surface/methods/sandbox/setClock.js +1 -0
  477. package/dist/bridge/surface/methods/sandbox/setClock.js.map +1 -1
  478. package/dist/bridge/surface/methods/sandbox-registry.d.ts +6 -0
  479. package/dist/bridge/surface/methods/sandbox-registry.d.ts.map +1 -0
  480. package/dist/bridge/surface/methods/sandbox-registry.js +21 -0
  481. package/dist/bridge/surface/methods/sandbox-registry.js.map +1 -0
  482. package/dist/bridge/surface/methods/storage/deleteObject.d.ts +2 -1
  483. package/dist/bridge/surface/methods/storage/deleteObject.d.ts.map +1 -1
  484. package/dist/bridge/surface/methods/storage/deleteObject.js +1 -0
  485. package/dist/bridge/surface/methods/storage/deleteObject.js.map +1 -1
  486. package/dist/bridge/surface/methods/storage/getBytes.d.ts +2 -1
  487. package/dist/bridge/surface/methods/storage/getBytes.d.ts.map +1 -1
  488. package/dist/bridge/surface/methods/storage/getBytes.js +1 -0
  489. package/dist/bridge/surface/methods/storage/getBytes.js.map +1 -1
  490. package/dist/bridge/surface/methods/storage/getDownloadURL.d.ts +2 -1
  491. package/dist/bridge/surface/methods/storage/getDownloadURL.d.ts.map +1 -1
  492. package/dist/bridge/surface/methods/storage/getDownloadURL.js +1 -0
  493. package/dist/bridge/surface/methods/storage/getDownloadURL.js.map +1 -1
  494. package/dist/bridge/surface/methods/storage/getMetadata.d.ts +2 -1
  495. package/dist/bridge/surface/methods/storage/getMetadata.d.ts.map +1 -1
  496. package/dist/bridge/surface/methods/storage/getMetadata.js +1 -0
  497. package/dist/bridge/surface/methods/storage/getMetadata.js.map +1 -1
  498. package/dist/bridge/surface/methods/storage/listAll.d.ts +2 -1
  499. package/dist/bridge/surface/methods/storage/listAll.d.ts.map +1 -1
  500. package/dist/bridge/surface/methods/storage/listAll.js +1 -0
  501. package/dist/bridge/surface/methods/storage/listAll.js.map +1 -1
  502. package/dist/bridge/surface/methods/storage/provision.d.ts +1 -0
  503. package/dist/bridge/surface/methods/storage/provision.d.ts.map +1 -1
  504. package/dist/bridge/surface/methods/storage/provision.js +1 -0
  505. package/dist/bridge/surface/methods/storage/provision.js.map +1 -1
  506. package/dist/bridge/surface/methods/storage/setCrossServiceIam.d.ts +2 -1
  507. package/dist/bridge/surface/methods/storage/setCrossServiceIam.d.ts.map +1 -1
  508. package/dist/bridge/surface/methods/storage/setCrossServiceIam.js +1 -0
  509. package/dist/bridge/surface/methods/storage/setCrossServiceIam.js.map +1 -1
  510. package/dist/bridge/surface/methods/storage/status.d.ts +1 -0
  511. package/dist/bridge/surface/methods/storage/status.d.ts.map +1 -1
  512. package/dist/bridge/surface/methods/storage/status.js +1 -0
  513. package/dist/bridge/surface/methods/storage/status.js.map +1 -1
  514. package/dist/bridge/surface/methods/storage/updateMetadata.d.ts +6 -5
  515. package/dist/bridge/surface/methods/storage/updateMetadata.d.ts.map +1 -1
  516. package/dist/bridge/surface/methods/storage/updateMetadata.js +1 -0
  517. package/dist/bridge/surface/methods/storage/updateMetadata.js.map +1 -1
  518. package/dist/bridge/surface/methods/storage/uploadBytes.d.ts +1 -0
  519. package/dist/bridge/surface/methods/storage/uploadBytes.d.ts.map +1 -1
  520. package/dist/bridge/surface/methods/storage/uploadBytes.js +1 -0
  521. package/dist/bridge/surface/methods/storage/uploadBytes.js.map +1 -1
  522. package/dist/bridge/surface/render/discriminator-schemas.d.ts +2 -2
  523. package/dist/bridge/surface/request-instant.d.ts +2 -2
  524. package/dist/bridge/surface/request-instant.d.ts.map +1 -1
  525. package/dist/bridge/surface/request-instant.js.map +1 -1
  526. package/dist/bridge/surface/rules-engines/database.d.ts.map +1 -1
  527. package/dist/bridge/surface/rules-engines/database.js +1 -2
  528. package/dist/bridge/surface/rules-engines/database.js.map +1 -1
  529. package/dist/bridge/surface/rules-engines/storage-request-resource.d.ts +38 -0
  530. package/dist/bridge/surface/rules-engines/storage-request-resource.d.ts.map +1 -0
  531. package/dist/bridge/surface/rules-engines/storage-request-resource.js +246 -0
  532. package/dist/bridge/surface/rules-engines/storage-request-resource.js.map +1 -0
  533. package/dist/bridge/surface/rules-engines/storage.d.ts.map +1 -1
  534. package/dist/bridge/surface/rules-engines/storage.js +44 -65
  535. package/dist/bridge/surface/rules-engines/storage.js.map +1 -1
  536. package/dist/bridge/surface/sandbox-context.d.ts +25 -0
  537. package/dist/bridge/surface/sandbox-context.d.ts.map +1 -0
  538. package/dist/bridge/surface/sandbox-context.js +29 -0
  539. package/dist/bridge/surface/sandbox-context.js.map +1 -0
  540. package/dist/bridge/surface/service-handles.d.ts +6 -6
  541. package/dist/bridge/surface/service-handles.d.ts.map +1 -1
  542. package/dist/bridge/surface/service-handles.js +7 -4
  543. package/dist/bridge/surface/service-handles.js.map +1 -1
  544. package/dist/bridge/surface/sign-in.d.ts +2 -2
  545. package/dist/bridge/surface/sign-in.d.ts.map +1 -1
  546. package/dist/bridge/surface/sign-in.js +1 -1
  547. package/dist/bridge/surface/sign-in.js.map +1 -1
  548. package/dist/bridge/surface/storage-rules.d.ts +2 -9
  549. package/dist/bridge/surface/storage-rules.d.ts.map +1 -1
  550. package/dist/bridge/surface/storage-rules.js +0 -10
  551. package/dist/bridge/surface/storage-rules.js.map +1 -1
  552. package/dist/bridge/surface/stored-identity.d.ts +3 -3
  553. package/dist/bridge/surface/stored-identity.d.ts.map +1 -1
  554. package/dist/bridge/surface/stored-identity.js.map +1 -1
  555. package/dist/bridge/surface/types.d.ts +29 -8
  556. package/dist/bridge/surface/types.d.ts.map +1 -1
  557. package/dist/cli/firebase-json.d.ts +35 -7
  558. package/dist/cli/firebase-json.d.ts.map +1 -1
  559. package/dist/cli/firebase-json.js +13 -0
  560. package/dist/cli/firebase-json.js.map +1 -1
  561. package/dist/cli/firestore-indexes.d.ts.map +1 -1
  562. package/dist/cli/firestore-indexes.js +2 -1
  563. package/dist/cli/firestore-indexes.js.map +1 -1
  564. package/dist/cli/index.d.ts +6 -0
  565. package/dist/cli/index.d.ts.map +1 -1
  566. package/dist/cli/index.js +44 -11
  567. package/dist/cli/index.js.map +1 -1
  568. package/dist/cli/public-dir-hint.d.ts +8 -0
  569. package/dist/cli/public-dir-hint.d.ts.map +1 -0
  570. package/dist/cli/public-dir-hint.js +30 -0
  571. package/dist/cli/public-dir-hint.js.map +1 -0
  572. package/dist/cli/run.d.ts +8 -2
  573. package/dist/cli/run.d.ts.map +1 -1
  574. package/dist/cli/run.js +28 -5
  575. package/dist/cli/run.js.map +1 -1
  576. package/dist/cli/sandbox-runner.d.ts.map +1 -1
  577. package/dist/cli/sandbox-runner.js +11 -2
  578. package/dist/cli/sandbox-runner.js.map +1 -1
  579. package/dist/cli/serve-diagnostics.d.ts.map +1 -1
  580. package/dist/cli/serve-diagnostics.js +11 -1
  581. package/dist/cli/serve-diagnostics.js.map +1 -1
  582. package/dist/cli/serve.d.ts.map +1 -1
  583. package/dist/cli/serve.js +25 -24
  584. package/dist/cli/serve.js.map +1 -1
  585. package/dist/cli/snapshot.d.ts.map +1 -1
  586. package/dist/cli/snapshot.js +13 -5
  587. package/dist/cli/snapshot.js.map +1 -1
  588. package/dist/cli/surface-method-runner.js +1 -1
  589. package/dist/cli/surface-method-runner.js.map +1 -1
  590. package/dist/cli/verify.d.ts.map +1 -1
  591. package/dist/cli/verify.js +10 -1
  592. package/dist/cli/verify.js.map +1 -1
  593. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  594. package/dist/conformance/.generated/can-i-use-browser.js +19 -3
  595. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  596. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  597. package/dist/conformance/.generated/can-i-use.js +1 -1
  598. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  599. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  600. package/dist/conformance/.generated/conformance-docs.js +1 -1
  601. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  602. package/dist/conformance/.generated/served-availability.d.ts.map +1 -1
  603. package/dist/conformance/.generated/served-availability.js +1 -1
  604. package/dist/conformance/.generated/served-availability.js.map +1 -1
  605. package/dist/discover/merge.d.ts.map +1 -1
  606. package/dist/discover/merge.js +11 -3
  607. package/dist/discover/merge.js.map +1 -1
  608. package/dist/functions/child-protocol.d.ts +43 -0
  609. package/dist/functions/child-protocol.d.ts.map +1 -0
  610. package/dist/functions/child-protocol.js +14 -0
  611. package/dist/functions/child-protocol.js.map +1 -0
  612. package/dist/functions/child.d.ts +2 -0
  613. package/dist/functions/child.d.ts.map +1 -0
  614. package/dist/functions/child.js +92 -0
  615. package/dist/functions/child.js.map +1 -0
  616. package/dist/{functions-rtdb → functions}/development-runtime.d.ts +5 -4
  617. package/dist/functions/development-runtime.d.ts.map +1 -0
  618. package/dist/{functions-rtdb → functions}/development-runtime.js +2 -2
  619. package/dist/functions/development-runtime.js.map +1 -0
  620. package/dist/functions/endpoints.d.ts +39 -0
  621. package/dist/functions/endpoints.d.ts.map +1 -0
  622. package/dist/functions/endpoints.js +48 -0
  623. package/dist/functions/endpoints.js.map +1 -0
  624. package/dist/functions/events.d.ts.map +1 -0
  625. package/dist/functions/events.js.map +1 -0
  626. package/dist/functions/execution-log.d.ts.map +1 -0
  627. package/dist/functions/execution-log.js.map +1 -0
  628. package/dist/functions/module-loader.d.ts.map +1 -0
  629. package/dist/functions/module-loader.js.map +1 -0
  630. package/dist/functions/project.d.ts +7 -0
  631. package/dist/functions/project.d.ts.map +1 -0
  632. package/dist/{functions-rtdb → functions}/project.js +1 -1
  633. package/dist/functions/project.js.map +1 -0
  634. package/dist/functions/rtdb/child-runtime.d.ts +23 -0
  635. package/dist/functions/rtdb/child-runtime.d.ts.map +1 -0
  636. package/dist/functions/rtdb/child-runtime.js +102 -0
  637. package/dist/functions/rtdb/child-runtime.js.map +1 -0
  638. package/dist/functions/rtdb/delivery.d.ts.map +1 -0
  639. package/dist/functions/rtdb/delivery.js.map +1 -0
  640. package/dist/{functions-rtdb → functions/rtdb}/discovery.d.ts +3 -20
  641. package/dist/functions/rtdb/discovery.d.ts.map +1 -0
  642. package/dist/{functions-rtdb → functions/rtdb}/discovery.js +6 -21
  643. package/dist/functions/rtdb/discovery.js.map +1 -0
  644. package/dist/functions/rtdb/event.d.ts.map +1 -0
  645. package/dist/functions/rtdb/event.js.map +1 -0
  646. package/dist/functions/rtdb/execution.d.ts.map +1 -0
  647. package/dist/functions/rtdb/execution.js.map +1 -0
  648. package/dist/functions/rtdb/in-memory-delivery.d.ts.map +1 -0
  649. package/dist/functions/rtdb/in-memory-delivery.js.map +1 -0
  650. package/dist/functions/rtdb/projection.d.ts.map +1 -0
  651. package/dist/functions/rtdb/projection.js.map +1 -0
  652. package/dist/functions/rtdb/reference-pattern.d.ts.map +1 -0
  653. package/dist/functions/rtdb/reference-pattern.js.map +1 -0
  654. package/dist/{functions-rtdb → functions/rtdb}/remote-delivery.d.ts +1 -1
  655. package/dist/functions/rtdb/remote-delivery.d.ts.map +1 -0
  656. package/dist/functions/rtdb/remote-delivery.js.map +1 -0
  657. package/dist/{functions-rtdb/child.d.ts → functions/spawn.d.ts} +16 -38
  658. package/dist/functions/spawn.d.ts.map +1 -0
  659. package/dist/functions/spawn.js +166 -0
  660. package/dist/functions/spawn.js.map +1 -0
  661. package/dist/functions/unsupported.d.ts +23 -0
  662. package/dist/functions/unsupported.d.ts.map +1 -0
  663. package/dist/functions/unsupported.js +25 -0
  664. package/dist/functions/unsupported.js.map +1 -0
  665. package/dist/google-endpoints.d.ts +9 -2
  666. package/dist/google-endpoints.d.ts.map +1 -1
  667. package/dist/google-endpoints.js +72 -3
  668. package/dist/google-endpoints.js.map +1 -1
  669. package/dist/next/bridge-import-loader.d.ts +9 -0
  670. package/dist/next/bridge-import-loader.d.ts.map +1 -0
  671. package/dist/next/bridge-import-loader.js +45 -0
  672. package/dist/next/bridge-import-loader.js.map +1 -0
  673. package/dist/next/bridge-imports.d.ts +26 -0
  674. package/dist/next/bridge-imports.d.ts.map +1 -0
  675. package/dist/next/bridge-imports.js +90 -0
  676. package/dist/next/bridge-imports.js.map +1 -0
  677. package/dist/next/client-aliases.d.ts +13 -5
  678. package/dist/next/client-aliases.d.ts.map +1 -1
  679. package/dist/next/client-aliases.js +14 -27
  680. package/dist/next/client-aliases.js.map +1 -1
  681. package/dist/next/guard.d.ts +3 -2
  682. package/dist/next/guard.d.ts.map +1 -1
  683. package/dist/next/guard.js +28 -10
  684. package/dist/next/guard.js.map +1 -1
  685. package/dist/next/turbopack-config.d.ts +9 -0
  686. package/dist/next/turbopack-config.d.ts.map +1 -1
  687. package/dist/next/turbopack-config.js +21 -0
  688. package/dist/next/turbopack-config.js.map +1 -1
  689. package/dist/next/webpack-config.d.ts +9 -0
  690. package/dist/next/webpack-config.d.ts.map +1 -1
  691. package/dist/next/webpack-config.js +18 -0
  692. package/dist/next/webpack-config.js.map +1 -1
  693. package/dist/next/with-pyric.d.ts +1 -0
  694. package/dist/next/with-pyric.d.ts.map +1 -1
  695. package/dist/next/with-pyric.js +25 -0
  696. package/dist/next/with-pyric.js.map +1 -1
  697. package/dist/register/activation.d.ts +16 -0
  698. package/dist/register/activation.d.ts.map +1 -0
  699. package/dist/register/activation.js +22 -0
  700. package/dist/register/activation.js.map +1 -0
  701. package/dist/register/app-bridge-admin-app-check.d.ts.map +1 -1
  702. package/dist/register/app-bridge-admin-app-check.js +3 -1
  703. package/dist/register/app-bridge-admin-app-check.js.map +1 -1
  704. package/dist/register/child-process-guard.d.ts +43 -0
  705. package/dist/register/child-process-guard.d.ts.map +1 -0
  706. package/dist/register/child-process-guard.js +165 -0
  707. package/dist/register/child-process-guard.js.map +1 -0
  708. package/dist/register/client/bootstrap.js +6 -1
  709. package/dist/register/client/bootstrap.js.map +1 -1
  710. package/dist/register/connect-prototypes.d.ts +9 -0
  711. package/dist/register/connect-prototypes.d.ts.map +1 -1
  712. package/dist/register/connect-prototypes.js +11 -0
  713. package/dist/register/connect-prototypes.js.map +1 -1
  714. package/dist/register/hooks.d.ts +7 -1
  715. package/dist/register/hooks.d.ts.map +1 -1
  716. package/dist/register/hooks.js +44 -2
  717. package/dist/register/hooks.js.map +1 -1
  718. package/dist/register/index.d.ts.map +1 -1
  719. package/dist/register/index.js +93 -23
  720. package/dist/register/index.js.map +1 -1
  721. package/dist/register/mapping.d.ts +33 -0
  722. package/dist/register/mapping.d.ts.map +1 -1
  723. package/dist/register/mapping.js +45 -3
  724. package/dist/register/mapping.js.map +1 -1
  725. package/dist/register/net-guard.d.ts +17 -0
  726. package/dist/register/net-guard.d.ts.map +1 -1
  727. package/dist/register/net-guard.js +118 -41
  728. package/dist/register/net-guard.js.map +1 -1
  729. package/dist/register/package-identity.d.ts +16 -0
  730. package/dist/register/package-identity.d.ts.map +1 -0
  731. package/dist/register/package-identity.js +97 -0
  732. package/dist/register/package-identity.js.map +1 -0
  733. package/dist/register/swap-or-stop.d.ts +27 -0
  734. package/dist/register/swap-or-stop.d.ts.map +1 -0
  735. package/dist/register/swap-or-stop.js +170 -0
  736. package/dist/register/swap-or-stop.js.map +1 -0
  737. package/dist/register/worker-guard.d.ts +20 -0
  738. package/dist/register/worker-guard.d.ts.map +1 -0
  739. package/dist/register/worker-guard.js +77 -0
  740. package/dist/register/worker-guard.js.map +1 -0
  741. package/dist/remote/resolve-host.d.ts +9 -0
  742. package/dist/remote/resolve-host.d.ts.map +1 -1
  743. package/dist/remote/resolve-host.js +13 -2
  744. package/dist/remote/resolve-host.js.map +1 -1
  745. package/dist/serve/ai-proxy.d.ts +2 -0
  746. package/dist/serve/ai-proxy.d.ts.map +1 -1
  747. package/dist/serve/ai-proxy.js +33 -8
  748. package/dist/serve/ai-proxy.js.map +1 -1
  749. package/dist/serve/app-ports.d.ts +48 -0
  750. package/dist/serve/app-ports.d.ts.map +1 -0
  751. package/dist/serve/app-ports.js +82 -0
  752. package/dist/serve/app-ports.js.map +1 -0
  753. package/dist/serve/bridge-mount.d.ts +13 -0
  754. package/dist/serve/bridge-mount.d.ts.map +1 -1
  755. package/dist/serve/bridge-mount.js +28 -8
  756. package/dist/serve/bridge-mount.js.map +1 -1
  757. package/dist/serve/bundler.d.ts +6 -0
  758. package/dist/serve/bundler.d.ts.map +1 -1
  759. package/dist/serve/bundler.js +78 -26
  760. package/dist/serve/bundler.js.map +1 -1
  761. package/dist/serve/discovery.d.ts +17 -3
  762. package/dist/serve/discovery.d.ts.map +1 -1
  763. package/dist/serve/discovery.js +199 -63
  764. package/dist/serve/discovery.js.map +1 -1
  765. package/dist/serve/entries/auth.d.ts.map +1 -1
  766. package/dist/serve/entries/auth.js +19 -1
  767. package/dist/serve/entries/auth.js.map +1 -1
  768. package/dist/serve/entries/firestore-surface.d.ts +1 -0
  769. package/dist/serve/entries/firestore-surface.d.ts.map +1 -1
  770. package/dist/serve/entries/firestore-surface.js +1 -0
  771. package/dist/serve/entries/firestore-surface.js.map +1 -1
  772. package/dist/serve/entries/init-payload.d.ts +9 -2
  773. package/dist/serve/entries/init-payload.d.ts.map +1 -1
  774. package/dist/serve/entries/init-payload.js +25 -5
  775. package/dist/serve/entries/init-payload.js.map +1 -1
  776. package/dist/serve/entries/moved-host.d.ts +18 -0
  777. package/dist/serve/entries/moved-host.d.ts.map +1 -0
  778. package/dist/serve/entries/moved-host.js +14 -0
  779. package/dist/serve/entries/moved-host.js.map +1 -0
  780. package/dist/serve/entries/runtime-origin.d.ts +6 -0
  781. package/dist/serve/entries/runtime-origin.d.ts.map +1 -1
  782. package/dist/serve/entries/runtime-origin.js.map +1 -1
  783. package/dist/serve/entries/unsupported/firestore.d.ts +0 -1
  784. package/dist/serve/entries/unsupported/firestore.d.ts.map +1 -1
  785. package/dist/serve/entries/unsupported/firestore.js +0 -1
  786. package/dist/serve/entries/unsupported/firestore.js.map +1 -1
  787. package/dist/serve/entries/worker-runtime.d.ts.map +1 -1
  788. package/dist/serve/entries/worker-runtime.js +19 -7
  789. package/dist/serve/entries/worker-runtime.js.map +1 -1
  790. package/dist/serve/firebase-module-swap.d.ts +19 -2
  791. package/dist/serve/firebase-module-swap.d.ts.map +1 -1
  792. package/dist/serve/firebase-module-swap.js +92 -16
  793. package/dist/serve/firebase-module-swap.js.map +1 -1
  794. package/dist/serve/gemini-proxy.js +2 -2
  795. package/dist/serve/gemini-proxy.js.map +1 -1
  796. package/dist/serve/hosted/runtime.d.ts.map +1 -1
  797. package/dist/serve/hosted/runtime.js +10 -3
  798. package/dist/serve/hosted/runtime.js.map +1 -1
  799. package/dist/serve/namespace.d.ts +7 -0
  800. package/dist/serve/namespace.d.ts.map +1 -1
  801. package/dist/serve/namespace.js +32 -24
  802. package/dist/serve/namespace.js.map +1 -1
  803. package/dist/serve/repro/compare.d.ts +2 -1
  804. package/dist/serve/repro/compare.d.ts.map +1 -1
  805. package/dist/serve/repro/compare.js +9 -1
  806. package/dist/serve/repro/compare.js.map +1 -1
  807. package/dist/serve/rules-fixture-check.d.ts.map +1 -1
  808. package/dist/serve/rules-fixture-check.js +22 -10
  809. package/dist/serve/rules-fixture-check.js.map +1 -1
  810. package/dist/serve/rules.d.ts +35 -9
  811. package/dist/serve/rules.d.ts.map +1 -1
  812. package/dist/serve/rules.js +72 -21
  813. package/dist/serve/rules.js.map +1 -1
  814. package/dist/serve/sandbox-session.d.ts +3 -0
  815. package/dist/serve/sandbox-session.d.ts.map +1 -1
  816. package/dist/serve/sandbox-session.js +10 -3
  817. package/dist/serve/sandbox-session.js.map +1 -1
  818. package/dist/serve/server.d.ts +10 -2
  819. package/dist/serve/server.d.ts.map +1 -1
  820. package/dist/serve/server.js +24 -4
  821. package/dist/serve/server.js.map +1 -1
  822. package/dist/serve/site-ui/_astro/{RulesCodeEditor.Cp_-FK3b.js → RulesCodeEditor.D-eQLCvu.js} +1 -1
  823. package/dist/serve/site-ui/_astro/app.BjQiEBOY.js +1 -0
  824. package/dist/serve/site-ui/_astro/app.C84Qr10v.js +151 -0
  825. package/dist/serve/site-ui/_astro/{chess-showcase.CVhCNUi_.js → chess-showcase.CsH1s4g7.js} +1 -1
  826. package/dist/serve/site-ui/_astro/{example-runtime.zC1l-Yka.js → example-runtime.CTp8mh7I.js} +1 -1
  827. package/dist/serve/site-ui/_astro/sandbox-controls.DI8MTU3L.js +1725 -0
  828. package/dist/serve/site-ui/_astro/{seed.B4vza_Bv.js → seed.BvtbLu-q.js} +1 -1
  829. package/dist/serve/site-ui/_astro/writes.D8gcuovU.js +1 -0
  830. package/dist/serve/site-ui/auth/index.html +1 -1
  831. package/dist/serve/site-ui/docs/ai-compat/index.html +48 -9
  832. package/dist/serve/site-ui/docs/ai-compat.md +53 -8
  833. package/dist/serve/site-ui/docs/app-check-compat/index.html +102 -26
  834. package/dist/serve/site-ui/docs/app-check-compat.md +107 -25
  835. package/dist/serve/site-ui/docs/auth-compat/index.html +33 -21
  836. package/dist/serve/site-ui/docs/auth-compat.md +35 -20
  837. package/dist/serve/site-ui/docs/build/ai-logic/index.html +13 -4
  838. package/dist/serve/site-ui/docs/build/ai-logic.md +14 -4
  839. package/dist/serve/site-ui/docs/conformance-scores/index.html +2 -2
  840. package/dist/serve/site-ui/docs/conformance-scores.md +2 -2
  841. package/dist/serve/site-ui/docs/database-compat/index.html +113 -49
  842. package/dist/serve/site-ui/docs/database-compat.md +118 -48
  843. package/dist/serve/site-ui/docs/firestore-compat/index.html +144 -37
  844. package/dist/serve/site-ui/docs/firestore-compat.md +149 -36
  845. package/dist/serve/site-ui/docs/firestore-swift-compat/index.html +1 -1
  846. package/dist/serve/site-ui/docs/firestore-swift-compat.md +1 -1
  847. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +12 -12
  848. package/dist/serve/site-ui/docs/functions-rtdb-compat.md +12 -12
  849. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
  850. package/dist/serve/site-ui/docs/get-started/how-the-swap-works.md +1 -1
  851. package/dist/serve/site-ui/docs/get-started/node-host/index.html +1 -0
  852. package/dist/serve/site-ui/docs/get-started/node-host.md +2 -0
  853. package/dist/serve/site-ui/docs/index.json +45 -5
  854. package/dist/serve/site-ui/docs/messaging-compat/index.html +2 -2
  855. package/dist/serve/site-ui/docs/messaging-compat.md +2 -2
  856. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +3 -1
  857. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api.md +2 -0
  858. package/dist/serve/site-ui/docs/pyric-app-check-reference-api/index.html +11 -3
  859. package/dist/serve/site-ui/docs/pyric-app-check-reference-api.md +13 -3
  860. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
  861. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api.md +1 -1
  862. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +1 -0
  863. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api.md +1 -0
  864. package/dist/serve/site-ui/docs/pyric-cli-register-client-firestore-reference-api/index.html +1 -1
  865. package/dist/serve/site-ui/docs/pyric-cli-register-client-firestore-reference-api.md +1 -1
  866. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +17 -9
  867. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api.md +13 -11
  868. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +8 -4
  869. package/dist/serve/site-ui/docs/pyric-database-reference-api.md +9 -4
  870. package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +15 -4
  871. package/dist/serve/site-ui/docs/pyric-rules-reference-api.md +21 -4
  872. package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +7 -1
  873. package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +1 -0
  874. package/dist/serve/site-ui/docs/reference/cli/index.html +4 -3
  875. package/dist/serve/site-ui/docs/reference/cli.md +5 -3
  876. package/dist/serve/site-ui/docs/rules-compat/index.html +150 -49
  877. package/dist/serve/site-ui/docs/rules-compat.md +149 -51
  878. package/dist/serve/site-ui/docs/storage-compat/index.html +20 -20
  879. package/dist/serve/site-ui/docs/storage-compat.md +20 -20
  880. package/dist/serve/site-ui/docs/tutorial/index.html +2 -1
  881. package/dist/serve/site-ui/docs/tutorial.md +2 -1
  882. package/dist/serve/site-ui/examples/chess/index.html +1 -1
  883. package/dist/serve/site-ui/firestore/index.html +1 -1
  884. package/dist/serve/site-ui/rtdb/index.html +1 -1
  885. package/dist/serve/site-ui/settings/index.html +1 -1
  886. package/dist/serve/site-ui/storage/index.html +1 -1
  887. package/dist/serve/site-ui/studio/index.html +1 -1
  888. package/dist/serve/site-ui/traffic/index.html +1 -1
  889. package/dist/serve/vite-ai-config.d.ts +8 -0
  890. package/dist/serve/vite-ai-config.d.ts.map +1 -1
  891. package/dist/serve/vite-ai-config.js +16 -1
  892. package/dist/serve/vite-ai-config.js.map +1 -1
  893. package/dist/serve/vite-functions-development.d.ts +3 -3
  894. package/dist/serve/vite-functions-development.d.ts.map +1 -1
  895. package/dist/serve/vite-functions-development.js +1 -1
  896. package/dist/serve/vite-functions-development.js.map +1 -1
  897. package/dist/serve/vite-generation-bridge.d.ts +2 -2
  898. package/dist/serve/vite-generation-bridge.d.ts.map +1 -1
  899. package/dist/serve/vite-generation-functions.d.ts +3 -3
  900. package/dist/serve/vite-generation-functions.d.ts.map +1 -1
  901. package/dist/serve/vite-generation-functions.js +1 -1
  902. package/dist/serve/vite-generation-functions.js.map +1 -1
  903. package/dist/serve/vite-generation-middleware.d.ts +1 -1
  904. package/dist/serve/vite-generation-middleware.d.ts.map +1 -1
  905. package/dist/serve/vite-generation-middleware.js +36 -1
  906. package/dist/serve/vite-generation-middleware.js.map +1 -1
  907. package/dist/serve/vite-module-swap.d.ts.map +1 -1
  908. package/dist/serve/vite-module-swap.js +8 -0
  909. package/dist/serve/vite-module-swap.js.map +1 -1
  910. package/dist/serve/vite-page-runtime.d.ts.map +1 -1
  911. package/dist/serve/vite-page-runtime.js +7 -1
  912. package/dist/serve/vite-page-runtime.js.map +1 -1
  913. package/dist/serve/vite-rules-source.d.ts +1 -1
  914. package/dist/serve/vite-rules-source.d.ts.map +1 -1
  915. package/dist/serve/vite-rules-source.js +2 -4
  916. package/dist/serve/vite-rules-source.js.map +1 -1
  917. package/dist/serve/vite-sandbox-generation.d.ts +2 -2
  918. package/dist/serve/vite-sandbox-generation.d.ts.map +1 -1
  919. package/dist/serve/vite-sandbox-generation.js +2 -2
  920. package/dist/serve/vite-sandbox-generation.js.map +1 -1
  921. package/dist/serve/worker/client/auth.d.ts +29 -5
  922. package/dist/serve/worker/client/auth.d.ts.map +1 -1
  923. package/dist/serve/worker/client/auth.js +61 -11
  924. package/dist/serve/worker/client/auth.js.map +1 -1
  925. package/dist/serve/worker/client/clock.d.ts +0 -16
  926. package/dist/serve/worker/client/clock.d.ts.map +1 -1
  927. package/dist/serve/worker/client/clock.js +23 -10
  928. package/dist/serve/worker/client/clock.js.map +1 -1
  929. package/dist/serve/worker/client/firestore-reads.d.ts +12 -5
  930. package/dist/serve/worker/client/firestore-reads.d.ts.map +1 -1
  931. package/dist/serve/worker/client/firestore-reads.js +47 -16
  932. package/dist/serve/worker/client/firestore-reads.js.map +1 -1
  933. package/dist/serve/worker/client/firestore-refs.d.ts.map +1 -1
  934. package/dist/serve/worker/client/firestore-refs.js +4 -14
  935. package/dist/serve/worker/client/firestore-refs.js.map +1 -1
  936. package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts.map +1 -1
  937. package/dist/serve/worker/client/rtdb-connection-lifecycle.js +5 -0
  938. package/dist/serve/worker/client/rtdb-connection-lifecycle.js.map +1 -1
  939. package/dist/serve/worker/client/rtdb-snapshots.d.ts +7 -0
  940. package/dist/serve/worker/client/rtdb-snapshots.d.ts.map +1 -1
  941. package/dist/serve/worker/client/rtdb-snapshots.js +25 -1
  942. package/dist/serve/worker/client/rtdb-snapshots.js.map +1 -1
  943. package/dist/serve/worker/client/rtdb-value-validation.d.ts +21 -0
  944. package/dist/serve/worker/client/rtdb-value-validation.d.ts.map +1 -0
  945. package/dist/serve/worker/client/rtdb-value-validation.js +183 -0
  946. package/dist/serve/worker/client/rtdb-value-validation.js.map +1 -0
  947. package/dist/serve/worker/client/rtdb-writes.d.ts.map +1 -1
  948. package/dist/serve/worker/client/rtdb-writes.js +7 -0
  949. package/dist/serve/worker/client/rtdb-writes.js.map +1 -1
  950. package/dist/serve/worker/client/snapshots.d.ts +2 -0
  951. package/dist/serve/worker/client/snapshots.d.ts.map +1 -1
  952. package/dist/serve/worker/client/snapshots.js +13 -7
  953. package/dist/serve/worker/client/snapshots.js.map +1 -1
  954. package/dist/serve/worker/client/websocket-connection.d.ts +6 -0
  955. package/dist/serve/worker/client/websocket-connection.d.ts.map +1 -1
  956. package/dist/serve/worker/client/websocket-connection.js +32 -3
  957. package/dist/serve/worker/client/websocket-connection.js.map +1 -1
  958. package/dist/serve/worker/host/auth-credential-sign-in.d.ts +33 -0
  959. package/dist/serve/worker/host/auth-credential-sign-in.d.ts.map +1 -0
  960. package/dist/serve/worker/host/auth-credential-sign-in.js +70 -0
  961. package/dist/serve/worker/host/auth-credential-sign-in.js.map +1 -0
  962. package/dist/serve/worker/host/auth-reauthentication.js +3 -3
  963. package/dist/serve/worker/host/auth-reauthentication.js.map +1 -1
  964. package/dist/serve/worker/host/rules.d.ts +15 -1
  965. package/dist/serve/worker/host/rules.d.ts.map +1 -1
  966. package/dist/serve/worker/host/rules.js +43 -34
  967. package/dist/serve/worker/host/rules.js.map +1 -1
  968. package/dist/serve/worker/host/staged-sign-in-results.d.ts +24 -0
  969. package/dist/serve/worker/host/staged-sign-in-results.d.ts.map +1 -0
  970. package/dist/serve/worker/host/staged-sign-in-results.js +40 -0
  971. package/dist/serve/worker/host/staged-sign-in-results.js.map +1 -0
  972. package/dist/serve/worker/host/storage.d.ts.map +1 -1
  973. package/dist/serve/worker/host/storage.js +20 -12
  974. package/dist/serve/worker/host/storage.js.map +1 -1
  975. package/dist/serve/worker/host/subscriptions.d.ts.map +1 -1
  976. package/dist/serve/worker/host/subscriptions.js +6 -2
  977. package/dist/serve/worker/host/subscriptions.js.map +1 -1
  978. package/dist/serve/worker/host-auth.d.ts +3 -0
  979. package/dist/serve/worker/host-auth.d.ts.map +1 -1
  980. package/dist/serve/worker/host-auth.js +32 -13
  981. package/dist/serve/worker/host-auth.js.map +1 -1
  982. package/dist/serve/worker/inbound-validation/operation-arguments.d.ts.map +1 -1
  983. package/dist/serve/worker/inbound-validation/operation-arguments.js +27 -14
  984. package/dist/serve/worker/inbound-validation/operation-arguments.js.map +1 -1
  985. package/dist/serve/worker/operation-persistence.d.ts +1 -0
  986. package/dist/serve/worker/operation-persistence.d.ts.map +1 -1
  987. package/dist/serve/worker/operation-persistence.js +1 -0
  988. package/dist/serve/worker/operation-persistence.js.map +1 -1
  989. package/dist/serve/worker/protocol.d.ts +9 -1
  990. package/dist/serve/worker/protocol.d.ts.map +1 -1
  991. package/dist/serve/worker/protocol.js.map +1 -1
  992. package/dist/serve/worker/rtdb-value-equality.d.ts.map +1 -1
  993. package/dist/serve/worker/rtdb-value-equality.js +3 -1
  994. package/dist/serve/worker/rtdb-value-equality.js.map +1 -1
  995. package/dist/serve/worker/serve-init.d.ts.map +1 -1
  996. package/dist/serve/worker/serve-init.js +3 -9
  997. package/dist/serve/worker/serve-init.js.map +1 -1
  998. package/dist/serve/worker-build-lock.d.ts +23 -0
  999. package/dist/serve/worker-build-lock.d.ts.map +1 -0
  1000. package/dist/serve/worker-build-lock.js +179 -0
  1001. package/dist/serve/worker-build-lock.js.map +1 -0
  1002. package/dist/serve/worker-bundle-cache.d.ts +17 -0
  1003. package/dist/serve/worker-bundle-cache.d.ts.map +1 -0
  1004. package/dist/serve/worker-bundle-cache.js +89 -0
  1005. package/dist/serve/worker-bundle-cache.js.map +1 -0
  1006. package/dist/verify/cases.js +7 -3
  1007. package/dist/verify/cases.js.map +1 -1
  1008. package/dist/verify/index.d.ts.map +1 -1
  1009. package/dist/verify/index.js +11 -5
  1010. package/dist/verify/index.js.map +1 -1
  1011. package/package.json +10 -4
  1012. package/src/assurance/.generated/conformance-verdicts.ts +107 -40
  1013. package/src/assurance/capabilities.ts +11 -15
  1014. package/src/bounded-request.ts +66 -7
  1015. package/src/bridge/client/bridge-url.ts +5 -1
  1016. package/src/bridge/client/bridge.ts +19 -3
  1017. package/src/bridge/frame-output.ts +45 -0
  1018. package/src/bridge/protocol.ts +13 -0
  1019. package/src/bridge/server/in-process.ts +57 -17
  1020. package/src/bridge/server/peer.ts +11 -0
  1021. package/src/bridge/server/standalone.ts +29 -107
  1022. package/src/bridge/surface/arguments/sandbox.ts +2 -69
  1023. package/src/bridge/surface/arguments/seed.ts +78 -0
  1024. package/src/bridge/surface/context.ts +26 -37
  1025. package/src/bridge/surface/database-instance-catalog.ts +4 -32
  1026. package/src/bridge/surface/database-instance-project.ts +40 -0
  1027. package/src/bridge/surface/database-instance.ts +4 -4
  1028. package/src/bridge/surface/functions-runtime.ts +5 -5
  1029. package/src/bridge/surface/held-identity.ts +4 -4
  1030. package/src/bridge/surface/manifest.sandbox.generated.ts +137 -0
  1031. package/src/bridge/surface/method-types.ts +61 -7
  1032. package/src/bridge/surface/methods/ai_logic/clearScripts.ts +2 -1
  1033. package/src/bridge/surface/methods/ai_logic/script.ts +2 -1
  1034. package/src/bridge/surface/methods/ai_logic/scripts.ts +2 -1
  1035. package/src/bridge/surface/methods/ai_logic/status.ts +1 -0
  1036. package/src/bridge/surface/methods/assurance/attach.ts +1 -0
  1037. package/src/bridge/surface/methods/assurance/canIUse.ts +1 -0
  1038. package/src/bridge/surface/methods/assurance/define.ts +1 -0
  1039. package/src/bridge/surface/methods/assurance/export.ts +1 -0
  1040. package/src/bridge/surface/methods/assurance/inspect.ts +1 -0
  1041. package/src/bridge/surface/methods/assurance/map.ts +1 -0
  1042. package/src/bridge/surface/methods/assurance/minimize.ts +1 -0
  1043. package/src/bridge/surface/methods/assurance/propose.ts +1 -0
  1044. package/src/bridge/surface/methods/assurance/replaySession.ts +1 -0
  1045. package/src/bridge/surface/methods/assurance/run.ts +1 -0
  1046. package/src/bridge/surface/methods/assurance/start.ts +1 -0
  1047. package/src/bridge/surface/methods/assurance/testRulesHosted.ts +1 -0
  1048. package/src/bridge/surface/methods/assurance/verify.ts +1 -0
  1049. package/src/bridge/surface/methods/assurance/verifyCases.ts +1 -0
  1050. package/src/bridge/surface/methods/auth/actAsAdmin.ts +1 -0
  1051. package/src/bridge/surface/methods/auth/actAsAnonymous.ts +1 -0
  1052. package/src/bridge/surface/methods/auth/createCustomToken.ts +1 -0
  1053. package/src/bridge/surface/methods/auth/createUser.ts +2 -1
  1054. package/src/bridge/surface/methods/auth/deleteUser.ts +2 -1
  1055. package/src/bridge/surface/methods/auth/getUser.ts +2 -1
  1056. package/src/bridge/surface/methods/auth/getUserByEmail.ts +2 -1
  1057. package/src/bridge/surface/methods/auth/impersonate.ts +1 -0
  1058. package/src/bridge/surface/methods/auth/importUsers.ts +3 -2
  1059. package/src/bridge/surface/methods/auth/listUsers.ts +2 -1
  1060. package/src/bridge/surface/methods/auth/sessions.ts +1 -0
  1061. package/src/bridge/surface/methods/auth/setCustomUserClaims.ts +2 -1
  1062. package/src/bridge/surface/methods/auth/signInAnonymously.ts +1 -0
  1063. package/src/bridge/surface/methods/auth/signInWithCredential.ts +1 -0
  1064. package/src/bridge/surface/methods/auth/signInWithCustomToken.ts +1 -0
  1065. package/src/bridge/surface/methods/auth/signInWithEmailAndPassword.ts +1 -0
  1066. package/src/bridge/surface/methods/auth/signOut.ts +1 -0
  1067. package/src/bridge/surface/methods/auth/takeAuthMail.ts +1 -0
  1068. package/src/bridge/surface/methods/auth/updateUser.ts +2 -1
  1069. package/src/bridge/surface/methods/auth/useAppSession.ts +1 -0
  1070. package/src/bridge/surface/methods/auth/whoami.ts +1 -0
  1071. package/src/bridge/surface/methods/database/crawl.ts +1 -0
  1072. package/src/bridge/surface/methods/database/get.ts +1 -0
  1073. package/src/bridge/surface/methods/database/push.ts +1 -0
  1074. package/src/bridge/surface/methods/database/query.ts +1 -0
  1075. package/src/bridge/surface/methods/database/remove.ts +1 -0
  1076. package/src/bridge/surface/methods/database/set.ts +1 -0
  1077. package/src/bridge/surface/methods/database/update.ts +1 -0
  1078. package/src/bridge/surface/methods/firestore/addDoc.ts +2 -1
  1079. package/src/bridge/surface/methods/firestore/deleteDoc.ts +2 -1
  1080. package/src/bridge/surface/methods/firestore/discoverPaths.ts +1 -0
  1081. package/src/bridge/surface/methods/firestore/extractIndexes.ts +1 -0
  1082. package/src/bridge/surface/methods/firestore/findCollectionGroup.ts +1 -0
  1083. package/src/bridge/surface/methods/firestore/getAggregateFromServer.ts +1 -0
  1084. package/src/bridge/surface/methods/firestore/getCountFromServer.ts +1 -0
  1085. package/src/bridge/surface/methods/firestore/getDoc.ts +2 -1
  1086. package/src/bridge/surface/methods/firestore/getDocs.ts +2 -1
  1087. package/src/bridge/surface/methods/firestore/setDoc.ts +2 -1
  1088. package/src/bridge/surface/methods/firestore/updateDoc.ts +2 -1
  1089. package/src/bridge/surface/methods/firestore/writeBatch.ts +2 -1
  1090. package/src/bridge/surface/methods/firestore/writeIndexes.ts +1 -0
  1091. package/src/bridge/surface/methods/functions/executions.ts +2 -1
  1092. package/src/bridge/surface/methods/functions/fire.ts +7 -6
  1093. package/src/bridge/surface/methods/functions/listTriggers.ts +1 -0
  1094. package/src/bridge/surface/methods/messaging/deliveries.ts +1 -0
  1095. package/src/bridge/surface/methods/messaging/send.ts +2 -1
  1096. package/src/bridge/surface/methods/messaging/subscribeToTopic.ts +1 -0
  1097. package/src/bridge/surface/methods/messaging/tokens.ts +1 -0
  1098. package/src/bridge/surface/methods/messaging/unsubscribeFromTopic.ts +1 -0
  1099. package/src/bridge/surface/methods/registry.ts +2 -12
  1100. package/src/bridge/surface/methods/rules/explainDenial.ts +1 -0
  1101. package/src/bridge/surface/methods/rules/getStdlib.ts +1 -0
  1102. package/src/bridge/surface/methods/rules/lint.ts +1 -0
  1103. package/src/bridge/surface/methods/rules/listStdlib.ts +1 -0
  1104. package/src/bridge/surface/methods/rules/set.ts +1 -0
  1105. package/src/bridge/surface/methods/rules/simulate.ts +1 -0
  1106. package/src/bridge/surface/methods/sandbox/activity.ts +2 -1
  1107. package/src/bridge/surface/methods/sandbox/advanceClock.ts +1 -0
  1108. package/src/bridge/surface/methods/sandbox/apply.ts +1 -0
  1109. package/src/bridge/surface/methods/sandbox/checkpoint.ts +1 -0
  1110. package/src/bridge/surface/methods/sandbox/deleteCapture.ts +1 -1
  1111. package/src/bridge/surface/methods/sandbox/deleteCheckpoint.ts +1 -0
  1112. package/src/bridge/surface/methods/sandbox/diff.ts +1 -0
  1113. package/src/bridge/surface/methods/sandbox/discard.ts +1 -0
  1114. package/src/bridge/surface/methods/sandbox/events.ts +2 -1
  1115. package/src/bridge/surface/methods/sandbox/exportFixture.ts +1 -0
  1116. package/src/bridge/surface/methods/sandbox/fork.ts +1 -0
  1117. package/src/bridge/surface/methods/sandbox/inspect.ts +2 -1
  1118. package/src/bridge/surface/methods/sandbox/listBranches.ts +1 -0
  1119. package/src/bridge/surface/methods/sandbox/listCaptures.ts +1 -1
  1120. package/src/bridge/surface/methods/sandbox/listCheckpoints.ts +1 -0
  1121. package/src/bridge/surface/methods/sandbox/listeners.ts +1 -0
  1122. package/src/bridge/surface/methods/sandbox/openCapture.ts +1 -1
  1123. package/src/bridge/surface/methods/sandbox/promote.ts +1 -0
  1124. package/src/bridge/surface/methods/sandbox/renameCapture.ts +1 -1
  1125. package/src/bridge/surface/methods/sandbox/reset.ts +3 -2
  1126. package/src/bridge/surface/methods/sandbox/resetClock.ts +1 -0
  1127. package/src/bridge/surface/methods/sandbox/restore.ts +1 -0
  1128. package/src/bridge/surface/methods/sandbox/saveCapture.ts +1 -1
  1129. package/src/bridge/surface/methods/sandbox/seed.ts +3 -2
  1130. package/src/bridge/surface/methods/sandbox/seedFromFixture.ts +1 -0
  1131. package/src/bridge/surface/methods/sandbox/setClock.ts +1 -0
  1132. package/src/bridge/surface/methods/sandbox-registry.ts +24 -0
  1133. package/src/bridge/surface/methods/storage/deleteObject.ts +1 -0
  1134. package/src/bridge/surface/methods/storage/getBytes.ts +1 -0
  1135. package/src/bridge/surface/methods/storage/getDownloadURL.ts +1 -0
  1136. package/src/bridge/surface/methods/storage/getMetadata.ts +1 -0
  1137. package/src/bridge/surface/methods/storage/listAll.ts +1 -0
  1138. package/src/bridge/surface/methods/storage/provision.ts +1 -0
  1139. package/src/bridge/surface/methods/storage/setCrossServiceIam.ts +1 -0
  1140. package/src/bridge/surface/methods/storage/status.ts +1 -0
  1141. package/src/bridge/surface/methods/storage/updateMetadata.ts +1 -0
  1142. package/src/bridge/surface/methods/storage/uploadBytes.ts +1 -0
  1143. package/src/bridge/surface/request-instant.ts +2 -2
  1144. package/src/bridge/surface/rules-engines/database.ts +1 -2
  1145. package/src/bridge/surface/rules-engines/storage-request-resource.ts +275 -0
  1146. package/src/bridge/surface/rules-engines/storage.ts +54 -81
  1147. package/src/bridge/surface/sandbox-context.ts +49 -0
  1148. package/src/bridge/surface/service-handles.ts +13 -9
  1149. package/src/bridge/surface/sign-in.ts +3 -3
  1150. package/src/bridge/surface/storage-rules.ts +2 -14
  1151. package/src/bridge/surface/stored-identity.ts +3 -3
  1152. package/src/bridge/surface/types.ts +30 -8
  1153. package/src/cli/firebase-json.ts +45 -7
  1154. package/src/cli/firestore-indexes.ts +2 -1
  1155. package/src/cli/index.ts +46 -11
  1156. package/src/cli/public-dir-hint.ts +35 -0
  1157. package/src/cli/run.ts +35 -7
  1158. package/src/cli/sandbox-runner.ts +10 -2
  1159. package/src/cli/serve-diagnostics.ts +12 -1
  1160. package/src/cli/serve.ts +27 -26
  1161. package/src/cli/service-commands.test.ts +7 -0
  1162. package/src/cli/snapshot.ts +15 -6
  1163. package/src/cli/surface-method-runner.ts +1 -1
  1164. package/src/cli/verify.ts +11 -1
  1165. package/src/conformance/.generated/can-i-use-browser.ts +22 -3
  1166. package/src/conformance/.generated/can-i-use.ts +1 -1
  1167. package/src/conformance/.generated/conformance-docs.ts +1 -1
  1168. package/src/conformance/.generated/served-availability.ts +1 -1
  1169. package/src/discover/merge.ts +12 -3
  1170. package/src/functions/child-protocol.ts +59 -0
  1171. package/src/functions/child.ts +107 -0
  1172. package/src/{functions-rtdb → functions}/development-runtime.ts +13 -14
  1173. package/src/functions/endpoints.ts +80 -0
  1174. package/src/{functions-rtdb → functions}/project.ts +2 -2
  1175. package/src/functions/rtdb/child-runtime.ts +139 -0
  1176. package/src/{functions-rtdb → functions/rtdb}/discovery.ts +9 -43
  1177. package/src/{functions-rtdb → functions/rtdb}/remote-delivery.ts +1 -1
  1178. package/src/functions/spawn.ts +212 -0
  1179. package/src/functions/unsupported.ts +42 -0
  1180. package/src/google-endpoints.ts +74 -3
  1181. package/src/next/bridge-import-loader.ts +56 -0
  1182. package/src/next/bridge-imports.ts +108 -0
  1183. package/src/next/client-aliases.ts +14 -27
  1184. package/src/next/guard.ts +33 -11
  1185. package/src/next/turbopack-config.ts +26 -0
  1186. package/src/next/webpack-config.ts +26 -0
  1187. package/src/next/with-pyric.ts +26 -0
  1188. package/src/register/activation.ts +26 -0
  1189. package/src/register/app-bridge-admin-app-check.ts +3 -1
  1190. package/src/register/child-process-guard.ts +189 -0
  1191. package/src/register/client/bootstrap.ts +7 -1
  1192. package/src/register/connect-prototypes.ts +12 -0
  1193. package/src/register/hooks.ts +56 -3
  1194. package/src/register/index.ts +92 -20
  1195. package/src/register/mapping.ts +57 -3
  1196. package/src/register/net-guard.ts +149 -39
  1197. package/src/register/package-identity.ts +98 -0
  1198. package/src/register/swap-or-stop.ts +194 -0
  1199. package/src/register/worker-guard.ts +90 -0
  1200. package/src/remote/resolve-host.ts +14 -2
  1201. package/src/serve/ai-proxy.ts +36 -8
  1202. package/src/serve/app-ports.ts +119 -0
  1203. package/src/serve/bridge-mount.ts +36 -8
  1204. package/src/serve/bundler.ts +87 -29
  1205. package/src/serve/discovery.ts +244 -67
  1206. package/src/serve/entries/auth.ts +22 -1
  1207. package/src/serve/entries/firestore-surface.ts +1 -0
  1208. package/src/serve/entries/init-payload.ts +28 -5
  1209. package/src/serve/entries/moved-host.ts +28 -0
  1210. package/src/serve/entries/runtime-origin.ts +6 -0
  1211. package/src/serve/entries/unsupported/firestore.ts +0 -1
  1212. package/src/serve/entries/worker-runtime.ts +19 -6
  1213. package/src/serve/firebase-module-swap.ts +98 -15
  1214. package/src/serve/gemini-proxy.ts +2 -2
  1215. package/src/serve/hosted/runtime.ts +10 -2
  1216. package/src/serve/namespace.ts +41 -29
  1217. package/src/serve/repro/compare.ts +9 -1
  1218. package/src/serve/rules-fixture-check.ts +34 -9
  1219. package/src/serve/rules.ts +104 -20
  1220. package/src/serve/sandbox-session.ts +11 -3
  1221. package/src/serve/server.ts +29 -2
  1222. package/src/serve/vite-ai-config.ts +19 -1
  1223. package/src/serve/vite-functions-development.ts +3 -3
  1224. package/src/serve/vite-generation-bridge.ts +2 -2
  1225. package/src/serve/vite-generation-functions.ts +5 -5
  1226. package/src/serve/vite-generation-middleware.ts +38 -2
  1227. package/src/serve/vite-module-swap.ts +8 -0
  1228. package/src/serve/vite-page-runtime.ts +6 -0
  1229. package/src/serve/vite-rules-source.ts +2 -5
  1230. package/src/serve/vite-sandbox-generation.ts +5 -5
  1231. package/src/serve/worker/__tests__/auth-credential-sign-in.test.ts +343 -0
  1232. package/src/serve/worker/__tests__/auth-m2-parity.test.ts +45 -1
  1233. package/src/serve/worker/__tests__/staged-sign-in-results.test.ts +139 -0
  1234. package/src/serve/worker/client/auth.ts +97 -21
  1235. package/src/serve/worker/client/clock.ts +10 -12
  1236. package/src/serve/worker/client/firestore-reads.ts +70 -21
  1237. package/src/serve/worker/client/firestore-refs.ts +4 -14
  1238. package/src/serve/worker/client/rtdb-connection-lifecycle.ts +5 -0
  1239. package/src/serve/worker/client/rtdb-snapshots.ts +24 -2
  1240. package/src/serve/worker/client/rtdb-value-validation.ts +198 -0
  1241. package/src/serve/worker/client/rtdb-writes.ts +7 -0
  1242. package/src/serve/worker/client/snapshots.ts +15 -6
  1243. package/src/serve/worker/client/websocket-connection.ts +39 -3
  1244. package/src/serve/worker/host/auth-credential-sign-in.ts +97 -0
  1245. package/src/serve/worker/host/auth-reauthentication.ts +3 -3
  1246. package/src/serve/worker/host/rules.ts +53 -34
  1247. package/src/serve/worker/host/staged-sign-in-results.ts +53 -0
  1248. package/src/serve/worker/host/storage.ts +26 -11
  1249. package/src/serve/worker/host/subscriptions.ts +7 -4
  1250. package/src/serve/worker/host-auth.ts +33 -15
  1251. package/src/serve/worker/inbound-validation/operation-arguments.ts +27 -14
  1252. package/src/serve/worker/operation-persistence.ts +1 -0
  1253. package/src/serve/worker/protocol.ts +7 -1
  1254. package/src/serve/worker/rtdb-value-equality.ts +3 -1
  1255. package/src/serve/worker/serve-init.ts +3 -9
  1256. package/src/serve/worker-build-lock.ts +207 -0
  1257. package/src/serve/worker-bundle-cache.ts +90 -0
  1258. package/src/verify/cases.ts +6 -3
  1259. package/src/verify/index.ts +16 -4
  1260. package/dist/functions-rtdb/child.d.ts.map +0 -1
  1261. package/dist/functions-rtdb/child.js +0 -386
  1262. package/dist/functions-rtdb/child.js.map +0 -1
  1263. package/dist/functions-rtdb/delivery.d.ts.map +0 -1
  1264. package/dist/functions-rtdb/delivery.js.map +0 -1
  1265. package/dist/functions-rtdb/development-runtime.d.ts.map +0 -1
  1266. package/dist/functions-rtdb/development-runtime.js.map +0 -1
  1267. package/dist/functions-rtdb/discovery.d.ts.map +0 -1
  1268. package/dist/functions-rtdb/discovery.js.map +0 -1
  1269. package/dist/functions-rtdb/event.d.ts.map +0 -1
  1270. package/dist/functions-rtdb/event.js.map +0 -1
  1271. package/dist/functions-rtdb/events.d.ts.map +0 -1
  1272. package/dist/functions-rtdb/events.js.map +0 -1
  1273. package/dist/functions-rtdb/execution-log.d.ts.map +0 -1
  1274. package/dist/functions-rtdb/execution-log.js.map +0 -1
  1275. package/dist/functions-rtdb/execution.d.ts.map +0 -1
  1276. package/dist/functions-rtdb/execution.js.map +0 -1
  1277. package/dist/functions-rtdb/in-memory-delivery.d.ts.map +0 -1
  1278. package/dist/functions-rtdb/in-memory-delivery.js.map +0 -1
  1279. package/dist/functions-rtdb/module-loader.d.ts.map +0 -1
  1280. package/dist/functions-rtdb/module-loader.js.map +0 -1
  1281. package/dist/functions-rtdb/project.d.ts +0 -7
  1282. package/dist/functions-rtdb/project.d.ts.map +0 -1
  1283. package/dist/functions-rtdb/project.js.map +0 -1
  1284. package/dist/functions-rtdb/projection.d.ts.map +0 -1
  1285. package/dist/functions-rtdb/projection.js.map +0 -1
  1286. package/dist/functions-rtdb/reference-pattern.d.ts.map +0 -1
  1287. package/dist/functions-rtdb/reference-pattern.js.map +0 -1
  1288. package/dist/functions-rtdb/remote-delivery.d.ts.map +0 -1
  1289. package/dist/functions-rtdb/remote-delivery.js.map +0 -1
  1290. package/dist/serve/gemini-error-redaction.d.ts +0 -6
  1291. package/dist/serve/gemini-error-redaction.d.ts.map +0 -1
  1292. package/dist/serve/gemini-error-redaction.js +0 -61
  1293. package/dist/serve/gemini-error-redaction.js.map +0 -1
  1294. package/dist/serve/site-ui/_astro/app.C--T2qDK.js +0 -151
  1295. package/dist/serve/site-ui/_astro/app.DqyhRyrU.js +0 -1
  1296. package/dist/serve/site-ui/_astro/sandbox-controls.Bv6lfpIe.js +0 -1725
  1297. package/dist/serve/site-ui/_astro/writes.Bg0YEEA7.js +0 -1
  1298. package/src/functions-rtdb/child.ts +0 -512
  1299. package/src/serve/gemini-error-redaction.ts +0 -60
  1300. /package/dist/{functions-rtdb → functions}/events.d.ts +0 -0
  1301. /package/dist/{functions-rtdb → functions}/events.js +0 -0
  1302. /package/dist/{functions-rtdb → functions}/execution-log.d.ts +0 -0
  1303. /package/dist/{functions-rtdb → functions}/execution-log.js +0 -0
  1304. /package/dist/{functions-rtdb → functions}/module-loader.d.ts +0 -0
  1305. /package/dist/{functions-rtdb → functions}/module-loader.js +0 -0
  1306. /package/dist/{functions-rtdb → functions/rtdb}/delivery.d.ts +0 -0
  1307. /package/dist/{functions-rtdb → functions/rtdb}/delivery.js +0 -0
  1308. /package/dist/{functions-rtdb → functions/rtdb}/event.d.ts +0 -0
  1309. /package/dist/{functions-rtdb → functions/rtdb}/event.js +0 -0
  1310. /package/dist/{functions-rtdb → functions/rtdb}/execution.d.ts +0 -0
  1311. /package/dist/{functions-rtdb → functions/rtdb}/execution.js +0 -0
  1312. /package/dist/{functions-rtdb → functions/rtdb}/in-memory-delivery.d.ts +0 -0
  1313. /package/dist/{functions-rtdb → functions/rtdb}/in-memory-delivery.js +0 -0
  1314. /package/dist/{functions-rtdb → functions/rtdb}/projection.d.ts +0 -0
  1315. /package/dist/{functions-rtdb → functions/rtdb}/projection.js +0 -0
  1316. /package/dist/{functions-rtdb → functions/rtdb}/reference-pattern.d.ts +0 -0
  1317. /package/dist/{functions-rtdb → functions/rtdb}/reference-pattern.js +0 -0
  1318. /package/dist/{functions-rtdb → functions/rtdb}/remote-delivery.js +0 -0
  1319. /package/src/{functions-rtdb → functions}/events.ts +0 -0
  1320. /package/src/{functions-rtdb → functions}/execution-log.ts +0 -0
  1321. /package/src/{functions-rtdb → functions}/module-loader.ts +0 -0
  1322. /package/src/{functions-rtdb → functions/rtdb}/delivery.ts +0 -0
  1323. /package/src/{functions-rtdb → functions/rtdb}/event.ts +0 -0
  1324. /package/src/{functions-rtdb → functions/rtdb}/execution.ts +0 -0
  1325. /package/src/{functions-rtdb → functions/rtdb}/in-memory-delivery.ts +0 -0
  1326. /package/src/{functions-rtdb → functions/rtdb}/projection.ts +0 -0
  1327. /package/src/{functions-rtdb → functions/rtdb}/reference-pattern.ts +0 -0
@@ -19,6 +19,7 @@
19
19
  <div class="compat-key">
20
20
  <span class="compat-key-item"><span class="compat-dot" data-status="ok"></span><strong>Conforming</strong> — observable behavior matches Firebase, locked by a passing probe</span>
21
21
  <span class="compat-key-item"><span class="compat-dot" data-status="diverged"></span><strong>Diverged (documented)</strong> — intentional difference with a written reason</span>
22
+ <span class="compat-key-item"><span class="compat-dot" data-status="bug"></span><strong>Bug</strong> — should match Firebase but does not</span>
22
23
  </div>
23
24
 
24
25
  ## Public API
@@ -87,6 +88,10 @@
87
88
  <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/sandbox-target.test.ts#L16" target="_blank" rel="noopener noreferrer"><code>unit:modular/sandbox-target.test.ts</code></a> ("rejects overlapping paths")</div></div>
88
89
  </details>
89
90
  <details class="compat-row" data-status="ok">
91
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>update()</code> applies when called, as <code>set()</code> does, so a client's writes land in call order: <code>update(r, { x: 2 })</code> then <code>set(child(r, 'x'), 3)</code> stores 3, update then remove leaves the path empty, and a listener sees the update before <code>update()</code> returns (RT-1)</span></span></summary>
92
+ <div class="compat-evidence"><div class="compat-probe">Upstream firebase 12.13.0 run offline (hunt repro SDK-RT-1) and the docs' Event Guarantees: "Writes from a single client will always be written to the server and broadcast out to other users in-order." <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/update-write-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>unit:modular/update-write-order.test.ts</code></a></div></div>
93
+ </details>
94
+ <details class="compat-row" data-status="ok">
90
95
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>push(ref)</code> mints a 20-char auto-id key starting with <code>-</code>, lexicographically sortable</span></span></summary>
91
96
  <div class="compat-evidence"><div class="compat-probe">Sandbox aligned: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/sandbox-target.test.ts#L347" target="_blank" rel="noopener noreferrer"><code>unit:modular/sandbox-target.test.ts</code></a> ("mints 20-char keys starting with \"-\"" + "sequential push keys are lex-sortable"); matches oracle observation <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-push-autoid-format.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-push-autoid-format.json</code></a></div></div>
92
97
  </details>
@@ -207,8 +212,8 @@
207
212
  <div class="compat-evidence"><div class="compat-probe">Sandbox aligned: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/transaction.test.ts#L62" target="_blank" rel="noopener noreferrer"><code>unit:modular/transaction.test.ts</code></a> ("returning undefined aborts — committed: false, no write" + "aborted transaction does NOT fan out to listeners"); matches oracle observation <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-abort-undefined.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-abort-undefined.json</code></a> — known divergence: prod's <code>result.snapshot.val()</code> reflects the CLIENT's pre-fetch (often <code>null</code> even when the server has a value because the speculative invocation runs before the server snap arrives); the sandbox returns the actual pre-transaction value at the path (more useful in single-client harness). The agreed-upon contract callers should rely on is <code>committed === false</code> and unchanged server-side data, NOT the snapshot's <code>.val()</code> on the abort path.</div></div>
208
213
  </details>
209
214
  <details class="compat-row" data-status="diverged">
210
- <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"><span class="compat-behavior">Cold production clients may invoke the update fn first with speculative <code>null</code> and then with the current seeded value; the always-warm in-process sandbox invokes it once with the current value</span></span></summary>
211
- <div class="compat-evidence"><div class="compat-probe">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-current-value-arg.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-runtransaction-current-value-arg</code></a> captures two seeded-path production invocations (<code>null</code>, then current); <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-transactions.test.ts#L52" target="_blank" rel="noopener noreferrer"><code>unit:modular/oracle-conformance-transactions.test.ts</code></a> pins the sandbox's single current-value invocation. The separate warm-client observation matches the sandbox but does not erase the cold-client contract. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/transaction.test.ts#L94" target="_blank" rel="noopener noreferrer"><code>transaction.test.ts</code></a>)</div></div>
215
+ <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"><span class="compat-behavior">Cold production clients may invoke the update fn first with speculative <code>null</code> and then with the current seeded value; the always-warm in-process sandbox invokes it once with the current value, so abort-if-missing aborts in production and commits in pyric (RT-16)</span></span></summary>
216
+ <div class="compat-evidence"><div class="compat-probe">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-current-value-arg.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-runtransaction-current-value-arg</code></a> captures two seeded-path production invocations (<code>null</code>, then current); <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-transactions.test.ts#L52" target="_blank" rel="noopener noreferrer"><code>unit:modular/oracle-conformance-transactions.test.ts</code></a> pins the sandbox's single current-value invocation. The separate warm-client observation matches the sandbox but does not erase the cold-client contract. <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-transaction-then-set.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-transaction-then-set</code></a> key <code>abortIfMissing</code>: production aborts, pyric commits (RT-16). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/transaction.test.ts#L94" target="_blank" rel="noopener noreferrer"><code>transaction.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-transaction-then-set.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-transaction-then-set.test.ts</code></a>)</div></div>
212
217
  </details>
213
218
  <details class="compat-row" data-status="ok">
214
219
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">The update fn arg is a defensive deep clone — mutating it does NOT corrupt the stored tree (matters for code that does <code>current.count++; return undefined</code> and expects abort to preserve state)</span></span></summary>
@@ -315,8 +320,8 @@
315
320
  <div class="compat-evidence"><div class="compat-probe">Sandbox aligned: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/normalization.test.ts#L20" target="_blank" rel="noopener noreferrer"><code>unit:modular/normalization.test.ts</code></a> ("array write is addressable by integer-string child key" + "forEach over an array iterates its elements"); upstream <code>core/snap/nodeFromJSON.ts:118-128</code>, <code>core/snap/ChildrenNode.ts:194-230</code></div></div>
316
321
  </details>
317
322
  <details class="compat-row" data-status="ok">
318
- <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Read-side array coercion: a dense integer-keyed object renders back as an array on <code>snap.val()</code> (<code>allIntegerKeys &amp;&amp; maxKey &lt; 2 * numKeys</code>) (DB-B2)</span></span></summary>
319
- <div class="compat-evidence"><div class="compat-probe">Sandbox aligned: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/normalization.test.ts#L19" target="_blank" rel="noopener noreferrer"><code>unit:modular/normalization.test.ts</code></a> ("a dense integer-keyed object reads back as an array"); upstream <code>core/snap/ChildrenNode.ts:196-230</code></div></div>
323
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Read-side array coercion: a dense integer-keyed object renders back as an array on <code>snap.val()</code> (<code>allIntegerKeys &amp;&amp; maxKey &lt; 2 * numKeys</code>), with a hole at each missing index; <code>exportVal()</code> and <code>toJSON()</code> keep it an object (DB-B2, RT-6)</span></span></summary>
324
+ <div class="compat-evidence"><div class="compat-probe">Sandbox aligned: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/normalization.test.ts#L19" target="_blank" rel="noopener noreferrer"><code>unit:modular/normalization.test.ts</code></a> ("a dense integer-keyed object reads back as an array") and <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/snapshot-serialization.test.ts#L14" target="_blank" rel="noopener noreferrer"><code>unit:modular/snapshot-serialization.test.ts</code></a> (holes, export shape, #1371); <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/client/rtdb-sparse-array-holes.test.ts#L50" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/serve/worker/client/rtdb-sparse-array-holes.test.ts</code></a> reads the holes back on the SharedWorker plane and on the Node host under Node, whose JSON transport writes them as <code>null</code>; upstream <code>core/snap/ChildrenNode.ts:196-230</code></div></div>
320
325
  </details>
321
326
  <details class="compat-row" data-status="ok">
322
327
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>null</code> children and empty objects are pruned at the write boundary — <code>set(ref, {})</code> is equivalent to <code>remove(ref)</code>; nested <code>null</code> collapses empty ancestors ("empty nodes don't exist") (DB-B3)</span></span></summary>
@@ -506,7 +511,7 @@ In production each database URL is its own instance, with its own data and its o
506
511
  </details>
507
512
  <details class="compat-row" data-status="ok">
508
513
  <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">database tool and pyric database &lt;method&gt; --instance</code><span class="compat-sub"><span class="compat-behavior">Every method of the <code>database</code> service tool, and <code>pyric database &lt;method&gt;</code>, takes an optional <code>instance</code>: a bare instance name, any database URL, or <code>default</code>, parsed with the SDK's URL rules, so a malformed URL is refused with the message <code>getDatabase</code> throws. The project's <code>&lt;projectId&gt;-default-rtdb</code>, and <code>&lt;projectId&gt;</code> with its <code>https://&lt;projectId&gt;.firebaseio.com</code> URL, select the default instance, as <code>getDatabase(app)</code> and that URL reach one instance. A call reads and writes only the instance it names, under the held identity and that instance's own rules, on the in-process sandbox and on the Node host. An instance <code>firebase.json</code> does not declare and the sandbox holds no data for is refused with the instances the project has, rather than opened empty. A summary names the instance when it is not the default.</span></span></span></summary>
509
- <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/bridge/surface/methods/database/instance.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/bridge/surface/methods/database/instance.test.ts</code></a> runs all seven methods with each instance form against a project whose <code>firebase.json</code> declares two shards, and asserts the call reaches only the named tree, that <code>default</code> and <code>&lt;projectId&gt;-default-rtdb</code> reach the default instance, the refusal and its list, an undeclared instance the sandbox already holds, the SDK message for a malformed URL, a uid identity held to each instance's own rules, and that the MCP target router hands a hosted call the argument unchanged. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/cli/surface-method-runner.test.ts#L6" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/cli/surface-method-runner.test.ts</code></a> persists a named-instance write to the in-process state and reads it back. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/hosted-sqlite.test.ts#L143" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/serve/hosted-sqlite.test.ts</code></a> runs the Node host's hosted method route: a write a client port reads on that instance and not the default, the URL and default-name forms, an impersonated uid under the shard's rules, and the refusal. App scenario <code>test/apps/rtdb-named-instance-tools</code> drives the installed <code>pyric database get</code> and <code>set --instance</code> against a Vite hosted dev server while Chromium writes to both instances. CDD assertion <code>rtdb-modular#MI5</code> pins the sandbox side: each name and URL form resolves to one instance, <code>default</code> to the default instance, and <code>heldDatabaseInstances</code> names the instances a sandbox holds. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/bridge/surface/database-instance-catalog-legacy-default.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/bridge/surface/database-instance-catalog-legacy-default.test.ts</code></a> asserts <code>&lt;projectId&gt;</code> selects the default instance and is not listed as a named one. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/bridge/surface/database-instance.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>database-instance.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/bridge/surface/database-instance-catalog.test.ts#L3" target="_blank" rel="noopener noreferrer"><code>database-instance-catalog.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/lifecycle-and-identity.test.ts#L28" target="_blank" rel="noopener noreferrer"><code>lifecycle-and-identity.test.ts</code></a>)</div></div>
514
+ <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/bridge/surface/methods/database/instance.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/bridge/surface/methods/database/instance.test.ts</code></a> runs all seven methods with each instance form against a project whose <code>firebase.json</code> declares two shards, and asserts the call reaches only the named tree, that <code>default</code> and <code>&lt;projectId&gt;-default-rtdb</code> reach the default instance, the refusal and its list, an undeclared instance the sandbox already holds, the SDK message for a malformed URL, a uid identity held to each instance's own rules, and that the MCP target router hands a hosted call the argument unchanged. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/cli/surface-method-runner.test.ts#L6" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/cli/surface-method-runner.test.ts</code></a> persists a named-instance write to the in-process state and reads it back. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/hosted-sqlite.test.ts#L143" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/serve/hosted-sqlite.test.ts</code></a> runs the Node host's hosted method route: a write a client port reads on that instance and not the default, the URL and default-name forms, an impersonated uid under the shard's rules, and the refusal. App scenario <code>test/apps/rtdb-named-instance-tools</code> drives the installed <code>pyric database get</code> and <code>set --instance</code> against a Vite hosted dev server while Chromium writes to both instances. CDD assertion <code>rtdb-modular#MI5</code> pins the sandbox side: each name and URL form resolves to one instance, <code>default</code> to the default instance, and <code>heldDatabaseInstances</code> names the instances a sandbox holds. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/bridge/surface/database-instance-catalog-legacy-default.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/bridge/surface/database-instance-catalog-legacy-default.test.ts</code></a> asserts <code>&lt;projectId&gt;</code> selects the default instance and is not listed as a named one. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/bridge/surface/database-instance.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>database-instance.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/bridge/surface/database-instance-catalog.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>database-instance-catalog.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/lifecycle-and-identity.test.ts#L28" target="_blank" rel="noopener noreferrer"><code>lifecycle-and-identity.test.ts</code></a>)</div></div>
510
515
  </details>
511
516
  <details class="compat-row" data-status="ok">
512
517
  <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">pyric verify --rules rtdb:&lt;instance&gt;=&lt;path&gt;</code><span class="compat-sub"><span class="compat-behavior">The verify capture records every instance a session held: the default instance's rules, data and URL, and each named instance's active rules and data under its name, on the SharedWorker, the Node host and the in-page runtime. RTDB events name the instance they hit. <code>pyric verify</code> replays each instance the session used on its own: only that instance's events, into the tree the session left it with, under that instance's candidate rules, so a write to one instance is never checked against another's rules or tree. Candidate rules come from <code>--rules rtdb=&lt;path&gt;</code> for the default instance and <code>--rules rtdb:&lt;instance&gt;=&lt;path&gt;</code> for a named one (a name or a database URL), else from <code>firebase.json</code> as <code>firebase deploy</code> resolves it: an array entry's <code>instance</code>, a <code>target</code> that <code>.firebaserc</code> maps for the project, and <code>database.rules.json</code> when there is no <code>database</code> key. The project's default instance name selects the default instance, and so does <code>&lt;projectId&gt;</code> or its <code>https://&lt;projectId&gt;.firebaseio.com</code> URL. A divergence on a named instance names it. An instance the session used with no candidate rules is an error that names it, with the reason a deploy target did not resolve; rules for an instance the session never used are refused with the instances it did use.</span></span></span></summary>
@@ -556,7 +561,7 @@ In production each database URL is its own instance, with its own data and its o
556
561
  </details>
557
562
  <details class="compat-row" data-status="ok">
558
563
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>snap.val()</code> returns <code>null</code> for a missing path (NOT a thrown error — RTDB diverges from Firestore here; <code>getDoc</code> returns <code>exists()===false</code> but <code>get</code> on RTDB just returns a <code>null</code>-val snapshot)</span></span></summary>
559
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-get-missing-path.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-get-missing-path.json</code></a> — observed <code>threw: false, val: null, exists: false</code> on a never-written path against blockingfun. The root of an empty database is the same case: the production SDK computes <code>DataSnapshot.exists()</code> as <code>!node.isEmpty()</code> at every path, the root included. The in-page sandbox, the served worker host and the Node host each read an empty root as <code>val: null, exists: false</code>, before any write and after the last child is removed. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-reference-writes.test.ts#L194" target="_blank" rel="noopener noreferrer"><code>oracle-conformance-reference-writes.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/rtdb-empty-root.test.ts#L44" target="_blank" rel="noopener noreferrer"><code>rtdb-empty-root.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/hosted-sqlite.test.ts#L19" target="_blank" rel="noopener noreferrer"><code>hosted-sqlite.test.ts</code></a>)</div></div>
564
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-get-missing-path.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-get-missing-path.json</code></a> — observed <code>threw: false, val: null, exists: false</code> on a never-written path against blockingfun. The root of an empty database is the same case: the production SDK computes <code>DataSnapshot.exists()</code> as <code>!node.isEmpty()</code> at every path, the root included. The in-page sandbox, the served worker host and the Node host each read an empty root as <code>val: null, exists: false</code>, before any write and after the last child is removed. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-reference-writes.test.ts#L201" target="_blank" rel="noopener noreferrer"><code>oracle-conformance-reference-writes.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/rtdb-empty-root.test.ts#L44" target="_blank" rel="noopener noreferrer"><code>rtdb-empty-root.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/hosted-sqlite.test.ts#L19" target="_blank" rel="noopener noreferrer"><code>hosted-sqlite.test.ts</code></a>)</div></div>
560
565
  </details>
561
566
  <details class="compat-row" data-status="ok">
562
567
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>snap.exists()</code> is <code>false</code> when <code>val() === null</code>, <code>true</code> otherwise</span></span></summary>
@@ -564,7 +569,7 @@ In production each database URL is its own instance, with its own data and its o
564
569
  </details>
565
570
  <details class="compat-row" data-status="ok">
566
571
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Round-trip: <code>set(ref, payload)</code> then <code>get(ref)</code> returns the payload (lock the basic write→read invariant)</span></span></summary>
567
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-set-then-get-roundtrip.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-set-then-get-roundtrip.json</code></a> — the payload round-trips structurally on both sides (this row's claim holds). NOTE — adjacent divergence pinned in <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/oracle-conformance.test.ts#L101" target="_blank" rel="noopener noreferrer"><code>oracle-conformance.test.ts</code></a>: prod returns object children in LEXICOGRAPHIC key order (the capture's <code>roundTripEqual: false</code> — a <code>JSON.stringify</code> round-trip against a non-sorted payload fails), while the sandbox preserves insertion order (stringify round-trip succeeds). Key-order-sensitive consumers behave differently.</div></div>
572
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-set-then-get-roundtrip.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-set-then-get-roundtrip.json</code></a> — the payload round-trips structurally on both sides (this row's claim holds). <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/oracle-conformance.test.ts#L101" target="_blank" rel="noopener noreferrer"><code>oracle-conformance.test.ts</code></a> also asserts the key order: production returns object children in key order (the capture's <code>roundTripEqual: false</code>: a <code>JSON.stringify</code> round-trip against a non-sorted payload fails), and so does the sandbox since #1371 (RT-7).</div></div>
568
573
  </details>
569
574
  <details class="compat-row" data-status="ok">
570
575
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Rules-denied read throws a plain <code>Error</code> (NOT a <code>FirebaseError</code>) with <code>code: 'PERMISSION_DENIED'</code> (uppercase snake-case) — matches the agent-tool rows #15/#20</span></span></summary>
@@ -589,12 +594,16 @@ In production each database URL is its own instance, with its own data and its o
589
594
  </details>
590
595
  <details class="compat-row" data-status="ok">
591
596
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Primitive round-trip — numbers, strings, booleans, arrays all survive a set→get cycle</span></span></summary>
592
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-set-then-get-roundtrip.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-set-then-get-roundtrip.json</code></a> — the payload round-trips structurally on both sides (this row's claim holds). NOTE — adjacent divergence pinned in <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/oracle-conformance.test.ts#L101" target="_blank" rel="noopener noreferrer"><code>oracle-conformance.test.ts</code></a>: prod returns object children in LEXICOGRAPHIC key order (the capture's <code>roundTripEqual: false</code> — a <code>JSON.stringify</code> round-trip against a non-sorted payload fails), while the sandbox preserves insertion order (stringify round-trip succeeds). Key-order-sensitive consumers behave differently.</div></div>
597
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-set-then-get-roundtrip.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-set-then-get-roundtrip.json</code></a> — the payload round-trips structurally on both sides (this row's claim holds). <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/oracle-conformance.test.ts#L101" target="_blank" rel="noopener noreferrer"><code>oracle-conformance.test.ts</code></a> also asserts the key order: production returns object children in key order (the capture's <code>roundTripEqual: false</code>: a <code>JSON.stringify</code> round-trip against a non-sorted payload fails), and so does the sandbox since #1371 (RT-7).</div></div>
593
598
  </details>
594
599
  <details class="compat-row" data-status="ok">
595
600
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Rules-denied write throws plain <code>Error</code> with <code>code: 'PERMISSION_DENIED'</code> (same shape as #110)</span></span></summary>
596
601
  <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-rules-denied-error-code.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-rules-denied-error-code.json</code></a> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L20" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
597
602
  </details>
603
+ <details class="compat-row" data-status="ok">
604
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">On the SharedWorker and Node host planes, a write whose value, priority or update map the SDK refuses (NaN, Infinity, <code>undefined</code>, a function, an invalid key, an update map that is not an object) throws synchronously at the call with the SDK's text, sends nothing, and leaves stored data unchanged: <code>set</code>, <code>update</code>, <code>push</code>, <code>setPriority</code>, <code>setWithPriority</code> and <code>onDisconnect().set</code>, <code>setWithPriority</code> and <code>update</code></span></span></summary>
605
+ <div class="compat-evidence"><div class="compat-probe">Production behavior: firebase 12.13.0 offline throws synchronously for each call (<code>validateFirebaseDataArg</code>, <code>validateFirebaseMergeDataArg</code> and <code>validatePriority</code> in <code>@firebase/database</code>), recorded in the 2026-10-27 SDK hunt (RP-1, RP-6). <code>packages/cli/src/serve/worker/client/rtdb-value-validation.ts</code> runs those checks with their texts before a frame is sent; <code>bridge/frame-output.ts</code> refuses to encode an RTDB value JSON cannot carry, and the host refuses a non-object update map with the SDK's text. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/rtdb-invalid-writes.test.ts#L14" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/serve/worker/rtdb-invalid-writes.test.ts</code></a> asserts each text and the unchanged data on the SharedWorker client. App scenario <code>test/apps/node-rtdb-invalid-writes</code> runs the client SDK under <code>node --import @pyric/cli/register</code> against the Node host and reads each path back with <code>firebase-admin</code>; on main (c706c6415) <code>set(ref, NaN)</code> resolved and deleted the value. CDD assertion <code>rtdb-modular#SW1</code> pins the sandbox side: the in-page sandbox fails the same writes and keeps the data. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/test/apps/node-rtdb-invalid-writes/scenario.ts#L5" target="_blank" rel="noopener noreferrer"><code>scenario.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L20" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
606
+ </details>
598
607
  </div>
599
608
 
600
609
  ### `update(ref, values)` — partial / multi-path update
@@ -627,15 +636,15 @@ In production each database URL is its own instance, with its own data and its o
627
636
  <div class="compat-list">
628
637
  <details class="compat-row" data-status="ok">
629
638
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Removes the value AND all children; subsequent <code>get</code> returns <code>null</code>-val snapshot</span></span></summary>
630
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-remove-vs-set-null.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-remove-vs-set-null.json</code></a> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L67" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
639
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-remove-vs-set-null.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-remove-vs-set-null.json</code></a> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L82" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
631
640
  </details>
632
641
  <details class="compat-row" data-status="ok">
633
642
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Idempotent — <code>remove</code> on a path that's already absent resolves successfully (no-throw)</span></span></summary>
634
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-remove-idempotent.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-remove-idempotent.json</code></a> — <code>remove</code> on a never-written path observed <code>threw: false, afterExists: false</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L67" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
643
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-remove-idempotent.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-remove-idempotent.json</code></a> — <code>remove</code> on a never-written path observed <code>threw: false, afterExists: false</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L82" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
635
644
  </details>
636
645
  <details class="compat-row" data-status="ok">
637
646
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>remove(ref)</code> and <code>set(ref, null)</code> produce the same end state — locks the documented RTDB invariant</span></span></summary>
638
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-remove-vs-set-null.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-remove-vs-set-null.json</code></a> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L67" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
647
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-remove-vs-set-null.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-remove-vs-set-null.json</code></a> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L82" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
639
648
  </details>
640
649
  </div>
641
650
 
@@ -644,19 +653,19 @@ In production each database URL is its own instance, with its own data and its o
644
653
  <div class="compat-list">
645
654
  <details class="compat-row" data-status="ok">
646
655
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>push(ref).key</code> is a 20-char string starting with <code>-</code>, available <strong>synchronously</strong> (client-side mint, no server round-trip required)</span></span></summary>
647
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-push-autoid-format.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-push-autoid-format.json</code></a> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L70" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
656
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-push-autoid-format.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-push-autoid-format.json</code></a> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L85" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
648
657
  </details>
649
658
  <details class="compat-row" data-status="ok">
650
659
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Sequential <code>push</code> calls produce monotonically-sortable keys (timestamp-prefixed for chronological ordering via <code>orderByKey</code>)</span></span></summary>
651
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-push-autoid-format.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-push-autoid-format.json</code></a> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L70" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
660
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-push-autoid-format.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-push-autoid-format.json</code></a> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L85" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
652
661
  </details>
653
662
  <details class="compat-row" data-status="ok">
654
663
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>push(ref, value)</code> writes the value AND returns the new child ref (both behaviors in one call); <code>push(ref)</code> mints the ref without writing</span></span></summary>
655
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-push-with-value.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-push-with-value.json</code></a> — <code>await push(parent, {hello:'world'})</code> returned a ref with a 20-char key; subsequent <code>get(r)</code> returned <code>{hello:'world'}</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L70" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
664
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-push-with-value.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-push-with-value.json</code></a> — <code>await push(parent, {hello:'world'})</code> returned a ref with a 20-char key; subsequent <code>get(r)</code> returned <code>{hello:'world'}</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L85" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
656
665
  </details>
657
666
  <details class="compat-row" data-status="ok">
658
667
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">The returned ref <code>r = push(parent, value)</code> is usable in follow-up ops: <code>get(r)</code>, <code>set(r, …)</code>, <code>remove(r)</code></span></span></summary>
659
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-push-with-value.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-push-with-value.json</code></a> — observed all 4 follow-up ops succeed through the returned ref (<code>refIsUsableForFollowupOps: true</code>). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L70" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
668
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-push-with-value.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-push-with-value.json</code></a> — observed all 4 follow-up ops succeed through the returned ref (<code>refIsUsableForFollowupOps: true</code>). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L85" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
660
669
  </details>
661
670
  </div>
662
671
 
@@ -665,7 +674,7 @@ In production each database URL is its own instance, with its own data and its o
665
674
  <div class="compat-list">
666
675
  <details class="compat-row" data-status="ok">
667
676
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Subscribing to a path with <strong>existing data</strong> fires the listener once with the current snapshot (the "initial fire")</span></span></summary>
668
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onvalue-initial-with-data.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onvalue-initial-with-data.json</code></a> — observed exactly 1 initial fire within ~46ms of subscribe, snapshot.val() === the seeded payload. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L76" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
677
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onvalue-initial-with-data.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onvalue-initial-with-data.json</code></a> — observed exactly 1 initial fire within ~46ms of subscribe, snapshot.val() === the seeded payload. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L91" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
669
678
  </details>
670
679
  <details class="compat-row" data-status="ok">
671
680
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Subscribing to a <strong>nonexistent path</strong> still fires the listener once — with a <code>null</code>-val snapshot AND <code>exists() === false</code>. Matches Firestore's <code>onSnapshot</code>-on-missing-doc semantics: prod RTDB does NOT silently skip the initial fire for empty paths.</span></span></summary>
@@ -673,11 +682,11 @@ In production each database URL is its own instance, with its own data and its o
673
682
  </details>
674
683
  <details class="compat-row" data-status="ok">
675
684
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Subsequent <code>set(ref, …)</code> fires the listener with the new value</span></span></summary>
676
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-onvalue-fires-on-set.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-onvalue-fires-on-set.json</code></a> — observed 1 fire per <code>set()</code> (1+1+1 = 3 total: initial-null, after-first-set, after-second-set). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L76" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
685
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-onvalue-fires-on-set.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-onvalue-fires-on-set.json</code></a> — observed 1 fire per <code>set()</code> (1+1+1 = 3 total: initial-null, after-first-set, after-second-set). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L91" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
677
686
  </details>
678
687
  <details class="compat-row" data-status="ok">
679
688
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Unsubscribe — the returned unsubscribe function stops further fires; subsequent writes produce 0 additional fires after <code>unsub()</code></span></span></summary>
680
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onvalue-unsubscribe.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onvalue-unsubscribe.json</code></a> — observed <code>preUnsubFires: 2, postUnsubFires: 2</code> (a write performed after <code>unsub()</code> produced 0 additional fires within a 500ms settle window). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L76" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
689
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onvalue-unsubscribe.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onvalue-unsubscribe.json</code></a> — observed <code>preUnsubFires: 2, postUnsubFires: 2</code> (a write performed after <code>unsub()</code> produced 0 additional fires within a 500ms settle window). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L91" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
681
690
  </details>
682
691
  <details class="compat-row" data-status="ok">
683
692
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">The returned value from <code>onValue(ref, cb)</code> is the unsubscribe function (NOT an object); calling it removes the listener</span></span></summary>
@@ -690,19 +699,19 @@ In production each database URL is its own instance, with its own data and its o
690
699
  <div class="compat-list">
691
700
  <details class="compat-row" data-status="ok">
692
701
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>onChildAdded</code> replays the existing children on subscribe — one fire per existing child key, in the default priority index with key tie-breaking (unlike <code>onValue</code> which fires once with the parent snapshot)</span></span></summary>
693
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onchildadded-initial-replay.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onchildadded-initial-replay.json</code></a> — seeded <code>{k1, k2, k3}</code>, observed 3 initial fires with <code>firedKeys: ['k1', 'k2', 'k3']</code>; the default priority/key order is separately pinned by <code>rtdb-modular-priority-contract</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L107" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
702
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onchildadded-initial-replay.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onchildadded-initial-replay.json</code></a> — seeded <code>{k1, k2, k3}</code>, observed 3 initial fires with <code>firedKeys: ['k1', 'k2', 'k3']</code>; the default priority/key order is separately pinned by <code>rtdb-modular-priority-contract</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L122" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
694
703
  </details>
695
704
  <details class="compat-row" data-status="ok">
696
705
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">After subscribe, adding a child via <code>push</code> or <code>set(child, …)</code> fires <code>onChildAdded</code> exactly once for that key</span></span></summary>
697
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onchildadded-post-subscribe.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onchildadded-post-subscribe.json</code></a> — seeded <code>{k1,k2}</code>, observed <code>postSubscribeFires: 1, lastFire: {key:'k3', val:{v:3}}</code> after writing the new child. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L107" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
706
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onchildadded-post-subscribe.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onchildadded-post-subscribe.json</code></a> — seeded <code>{k1,k2}</code>, observed <code>postSubscribeFires: 1, lastFire: {key:'k3', val:{v:3}}</code> after writing the new child. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L122" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
698
707
  </details>
699
708
  <details class="compat-row" data-status="ok">
700
709
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>onChildChanged</code> fires when an existing child's value changes; does NOT fire for added or removed children</span></span></summary>
701
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onchildchanged-fires-on-update.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onchildchanged-fires-on-update.json</code></a> — observed <code>firedOnInitial: 0, firedOnUpdate: 1, lastFire: {key:'k1', val:{v:2}}</code> (the NEW value, not the prior). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L87" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
710
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onchildchanged-fires-on-update.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onchildchanged-fires-on-update.json</code></a> — observed <code>firedOnInitial: 0, firedOnUpdate: 1, lastFire: {key:'k1', val:{v:2}}</code> (the NEW value, not the prior). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L102" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
702
711
  </details>
703
712
  <details class="compat-row" data-status="ok">
704
713
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>onChildRemoved</code> fires when a child is deleted (via <code>remove(child)</code> or <code>set(child, null)</code>); snapshot carries the PRIOR value</span></span></summary>
705
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onchildremoved-fires-on-delete.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onchildremoved-fires-on-delete.json</code></a> — observed <code>firedOnDelete: 1, removedSnapCarriesPriorValue: true</code> (snapshot.val() was the pre-delete value). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L108" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
714
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-onchildremoved-fires-on-delete.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-onchildremoved-fires-on-delete.json</code></a> — observed <code>firedOnDelete: 1, removedSnapCarriesPriorValue: true</code> (snapshot.val() was the pre-delete value). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L123" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
706
715
  </details>
707
716
  <details class="compat-row" data-status="ok">
708
717
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>onChildMoved</code> under an explicit ordered query fires when the ordered field changes, co-fires with <code>child_changed</code>, and supplies the captured <code>previousChildName</code>.</span></span></summary>
@@ -715,11 +724,11 @@ In production each database URL is its own instance, with its own data and its o
715
724
  <div class="compat-list">
716
725
  <details class="compat-row" data-status="ok">
717
726
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>off(ref)</code> removes ALL listeners at that ref (any event type, any callback)</span></span></summary>
718
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-off-stops-child-fires.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-off-stops-child-fires.json</code></a> — after <code>off(ref)</code> with no eventType, a subsequent write produced <code>postOffFires: 0</code> against an <code>onChildAdded</code> registration. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L109" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
727
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-off-stops-child-fires.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-off-stops-child-fires.json</code></a> — after <code>off(ref)</code> with no eventType, a subsequent write produced <code>postOffFires: 0</code> against an <code>onChildAdded</code> registration. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L124" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
719
728
  </details>
720
729
  <details class="compat-row" data-status="ok">
721
730
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>off(ref, 'value')</code> removes only <code>value</code> listeners at that ref</span></span></summary>
722
- <div class="compat-evidence"><div class="compat-probe">Sandbox aligned (M48); oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-off-eventtype-precision.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-off-eventtype-precision.json</code></a> — registered TWO <code>value</code> listeners + one <code>child_added</code> at the same ref; after <code>off(ref, 'value')</code> (no callback), <code>valueListenersStopped: true</code> (neither value cb fired on subsequent writes) AND <code>childListenerStillFiringAfterOffValue: true</code> (the child listener kept firing). <code>offValueClearsAllValueListeners: true</code> confirms the no-callback variant removes ALL value listeners at the ref. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-off-stops-child-fires.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-off-stops-child-fires</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L109" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
731
+ <div class="compat-evidence"><div class="compat-probe">Sandbox aligned (M48); oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-off-eventtype-precision.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-off-eventtype-precision.json</code></a> — registered TWO <code>value</code> listeners + one <code>child_added</code> at the same ref; after <code>off(ref, 'value')</code> (no callback), <code>valueListenersStopped: true</code> (neither value cb fired on subsequent writes) AND <code>childListenerStillFiringAfterOffValue: true</code> (the child listener kept firing). <code>offValueClearsAllValueListeners: true</code> confirms the no-callback variant removes ALL value listeners at the ref. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-off-stops-child-fires.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-off-stops-child-fires</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L124" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
723
732
  </details>
724
733
  <details class="compat-row" data-status="ok">
725
734
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>off(ref, 'value', cb)</code> removes only the specific callback</span></span></summary>
@@ -727,11 +736,11 @@ In production each database URL is its own instance, with its own data and its o
727
736
  </details>
728
737
  <details class="compat-row" data-status="ok">
729
738
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">The returned unsubscribe function from <code>onValue(ref, cb)</code> is equivalent to <code>off(ref, 'value', cb)</code></span></span></summary>
730
- <div class="compat-evidence"><div class="compat-probe">Sandbox aligned (M48); oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-onvalue-unsub-equivalence.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-onvalue-unsub-equivalence.json</code></a> — <code>unsubReturnType: 'function'</code>, <code>unsubReturnedFnStopsListener: true</code> (the captured return value halted fires on write), <code>offRefValueCbStopsListener: true</code> (the same effect via <code>off(ref, 'value', cb)</code>), <code>bothFormsEquivalent: true</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L109" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
739
+ <div class="compat-evidence"><div class="compat-probe">Sandbox aligned (M48); oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb/rtdb-onvalue-unsub-equivalence.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb/rtdb-onvalue-unsub-equivalence.json</code></a> — <code>unsubReturnType: 'function'</code>, <code>unsubReturnedFnStopsListener: true</code> (the captured return value halted fires on write), <code>offRefValueCbStopsListener: true</code> (the same effect via <code>off(ref, 'value', cb)</code>), <code>bothFormsEquivalent: true</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L124" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
731
740
  </details>
732
741
  <details class="compat-row" data-status="ok">
733
742
  <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">off(ref, eventType, callback)</code><span class="compat-sub"><span class="compat-behavior">When the same callback is registered more than once, each <code>off(ref, eventType, callback)</code> removes one registration without orphaning the others</span></span></span></summary>
734
- <div class="compat-evidence"><div class="compat-probe">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-off-duplicate-registration.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-off-duplicate-registration</code></a> proves each matching <code>off</code> removes one registration; sandbox row assertion <code>rtdb-modular#183</code> replays the full sequence. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-reference-writes.test.ts#L175" target="_blank" rel="noopener noreferrer"><code>oracle-conformance-reference-writes.test.ts</code></a>)</div></div>
743
+ <div class="compat-evidence"><div class="compat-probe">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-off-duplicate-registration.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-off-duplicate-registration</code></a> proves each matching <code>off</code> removes one registration; sandbox row assertion <code>rtdb-modular#183</code> replays the full sequence. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-reference-writes.test.ts#L182" target="_blank" rel="noopener noreferrer"><code>oracle-conformance-reference-writes.test.ts</code></a>)</div></div>
735
744
  </details>
736
745
  </div>
737
746
 
@@ -744,39 +753,39 @@ In production each database URL is its own instance, with its own data and its o
744
753
  </details>
745
754
  <details class="compat-row" data-status="ok">
746
755
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>orderByKey()</code> orders by the auto-id / numeric key</span></span></summary>
747
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbykey-window.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-orderbykey-window.json</code></a> — seeded <code>{a,b,c,d,e}</code> in shuffled insertion order, observed <code>matchedKeys: ['b','c','d']</code> for <code>orderByKey() + startAt('b') + endAt('d')</code> (in key order). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L123" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
756
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbykey-window.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-orderbykey-window.json</code></a> — seeded <code>{a,b,c,d,e}</code> in shuffled insertion order, observed <code>matchedKeys: ['b','c','d']</code> for <code>orderByKey() + startAt('b') + endAt('d')</code> (in key order). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L138" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
748
757
  </details>
749
758
  <details class="compat-row" data-status="ok">
750
759
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Under loaded rules, <code>orderByValue()</code> and <code>orderByChild(path)</code> need <code>.indexOn: '.value'</code> or <code>.indexOn: '&lt;path&gt;'</code> at the queried location: <code>get()</code> rejects with <code>Index not defined</code>, limited or unlimited, and a listener downloads the location, filters it locally, and logs the unspecified-index warning only when the query has a limit or a range. <code>orderByKey()</code> needs no index. A rules-bypassing admin handle meets the same requirement: its <code>get()</code> rejects and its listener warns. With no rules loaded, the sandbox requires no index</span></span></summary>
751
- <div class="compat-evidence"><div class="compat-probe">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-query-index-enforcement.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-query-index-enforcement</code></a> covers <code>orderByChild</code> and <code>orderByValue</code> with a limit, without a limit, and with <code>startAt</code>, plus <code>orderByKey</code> with a limit, each at an indexed and an unindexed location; <code>unit:cdd/query-index-contracts.ts</code> replays the <code>get()</code> and <code>onValue()</code> cases in the sandbox and matches outcomes and log lines. The served worker path delivers the same rejection and logs the warning in the page (<a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/client/rtdb-listeners.test.ts#L1" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/serve/worker/client/rtdb-listeners.test.ts</code></a>). Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-admin-query-index.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-admin-query-index</code></a> (captured 2026-10-07) records the Admin SDK getting the same <code>Index not defined</code> rejection from <code>get()</code>, limited and unlimited, and a limited <code>once('value')</code> delivering the filtered window with the unspecified-index warning; <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/admin-query-index.test.ts#L3" target="_blank" rel="noopener noreferrer"><code>unit:modular/admin-query-index.test.ts</code></a> replays it on a <code>getAdminDatabase</code> handle. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbyvalue-numeric.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-orderbyvalue-numeric</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L132" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-queries.test.ts#L53" target="_blank" rel="noopener noreferrer"><code>oracle-conformance-queries.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/index-diagnostics.test.ts#L1" target="_blank" rel="noopener noreferrer"><code>index-diagnostics.test.ts</code></a>)</div></div>
760
+ <div class="compat-evidence"><div class="compat-probe">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-query-index-enforcement.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-query-index-enforcement</code></a> covers <code>orderByChild</code> and <code>orderByValue</code> with a limit, without a limit, and with <code>startAt</code>, plus <code>orderByKey</code> with a limit, each at an indexed and an unindexed location; <code>unit:cdd/query-index-contracts.ts</code> replays the <code>get()</code> and <code>onValue()</code> cases in the sandbox and matches outcomes and log lines. The served worker path delivers the same rejection and logs the warning in the page (<a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/client/rtdb-listeners.test.ts#L1" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/serve/worker/client/rtdb-listeners.test.ts</code></a>). Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-admin-query-index.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-admin-query-index</code></a> (captured 2026-10-07) records the Admin SDK getting the same <code>Index not defined</code> rejection from <code>get()</code>, limited and unlimited, and a limited <code>once('value')</code> delivering the filtered window with the unspecified-index warning; <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/admin-query-index.test.ts#L3" target="_blank" rel="noopener noreferrer"><code>unit:modular/admin-query-index.test.ts</code></a> replays it on a <code>getAdminDatabase</code> handle. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbyvalue-numeric.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-orderbyvalue-numeric</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L147" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-queries.test.ts#L53" target="_blank" rel="noopener noreferrer"><code>oracle-conformance-queries.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/index-diagnostics.test.ts#L1" target="_blank" rel="noopener noreferrer"><code>index-diagnostics.test.ts</code></a>)</div></div>
752
761
  </details>
753
762
  <details class="compat-row" data-status="ok">
754
763
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>equalTo(v)</code> filters children whose ordered field === v (returns 0, 1, or multiple matches — RTDB does NOT enforce uniqueness)</span></span></summary>
755
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-query-equalto.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-query-equalto.json</code></a> — seeded <code>{red, blue, blue, green}</code>, observed <code>matchedKeys: ['k2', 'k3']</code> for <code>equalTo('blue')</code> (both blue children, none of the others). Additional probe: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-equalTo-filter.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-equalTo-filter.json</code></a> (a..b..c groups) confirms <code>equalTo('b')</code> returns the two <code>b</code> children. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L125" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
764
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-query-equalto.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-query-equalto.json</code></a> — seeded <code>{red, blue, blue, green}</code>, observed <code>matchedKeys: ['k2', 'k3']</code> for <code>equalTo('blue')</code> (both blue children, none of the others). Additional probe: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-equalTo-filter.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-equalTo-filter.json</code></a> (a..b..c groups) confirms <code>equalTo('b')</code> returns the two <code>b</code> children. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L140" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
756
765
  </details>
757
766
  <details class="compat-row" data-status="ok">
758
767
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>startAt(v)</code> is <strong>inclusive</strong> (the child whose ordered value === v is included)</span></span></summary>
759
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-query-startat-inclusive.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-query-startat-inclusive.json</code></a> — seeded positions <code>[1,2,3,4]</code>, observed <code>matched: [2,3,4]</code> for <code>startAt(2)</code> (cursor doc included). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbychild-window.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-orderbychild-window</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbykey-window.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-orderbykey-window</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L126" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
768
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-query-startat-inclusive.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-query-startat-inclusive.json</code></a> — seeded positions <code>[1,2,3,4]</code>, observed <code>matched: [2,3,4]</code> for <code>startAt(2)</code> (cursor doc included). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbychild-window.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-orderbychild-window</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbykey-window.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-orderbykey-window</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L141" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
760
769
  </details>
761
770
  <details class="compat-row" data-status="ok">
762
771
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>endAt(v)</code> is <strong>inclusive</strong></span></span></summary>
763
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbychild-window.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-orderbychild-window.json</code></a> — <code>startAt(2) + endAt(4)</code> matched positions <code>[2,3,4]</code> (endAt(4) included its boundary value). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbykey-window.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-orderbykey-window</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L127" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
772
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbychild-window.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-orderbychild-window.json</code></a> — <code>startAt(2) + endAt(4)</code> matched positions <code>[2,3,4]</code> (endAt(4) included its boundary value). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbykey-window.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-orderbykey-window</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L142" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
764
773
  </details>
765
774
  <details class="compat-row" data-status="ok">
766
775
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>startAfter(v)</code> is <strong>exclusive</strong></span></span></summary>
767
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-startafter-endbefore-exclusive.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-startafter-endbefore-exclusive.json</code></a> — <code>startAfter(2) + endBefore(5)</code> matched positions <code>[3,4]</code> (cursor <code>2</code> dropped). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L128" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
776
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-startafter-endbefore-exclusive.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-startafter-endbefore-exclusive.json</code></a> — <code>startAfter(2) + endBefore(5)</code> matched positions <code>[3,4]</code> (cursor <code>2</code> dropped). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L143" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
768
777
  </details>
769
778
  <details class="compat-row" data-status="ok">
770
779
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>endBefore(v)</code> is <strong>exclusive</strong></span></span></summary>
771
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-startafter-endbefore-exclusive.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-startafter-endbefore-exclusive.json</code></a> — same probe; cursor <code>5</code> dropped. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L129" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
780
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-startafter-endbefore-exclusive.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-startafter-endbefore-exclusive.json</code></a> — same probe; cursor <code>5</code> dropped. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L144" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
772
781
  </details>
773
782
  <details class="compat-row" data-status="ok">
774
783
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>limitToFirst(N)</code> caps the result count from the start of the ordered range</span></span></summary>
775
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-query-orderbychild-limit.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-query-orderbychild-limit.json</code></a> plus <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-limittofirst-vs-limittolast.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-limittofirst-vs-limittolast.json</code></a> (firstPositions <code>[1,2]</code>). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbyvalue-numeric.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-orderbyvalue-numeric</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L122" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
784
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-query-orderbychild-limit.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-query-orderbychild-limit.json</code></a> plus <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-limittofirst-vs-limittolast.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-limittofirst-vs-limittolast.json</code></a> (firstPositions <code>[1,2]</code>). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-orderbyvalue-numeric.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-orderbyvalue-numeric</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L137" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
776
785
  </details>
777
786
  <details class="compat-row" data-status="ok">
778
787
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>limitToLast(N)</code> caps from the end</span></span></summary>
779
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-limittofirst-vs-limittolast.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-limittofirst-vs-limittolast.json</code></a> — observed <code>lastKeys: ['d','e'], lastPositions: [4,5]</code> for <code>limitToLast(2)</code> on a 5-child collection ordered by <code>pos</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L131" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
788
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-limittofirst-vs-limittolast.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-limittofirst-vs-limittolast.json</code></a> — observed <code>lastKeys: ['d','e'], lastPositions: [4,5]</code> for <code>limitToLast(2)</code> on a 5-child collection ordered by <code>pos</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L146" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
780
789
  </details>
781
790
  <details class="compat-row" data-status="ok">
782
791
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Listeners on a <code>Query</code> (<code>onValue(q, …)</code>) emit only the windowed snapshot — NOT the parent ref's full data</span></span></summary>
@@ -814,7 +823,7 @@ In production each database URL is its own instance, with its own data and its o
814
823
  <div class="compat-list">
815
824
  <details class="compat-row" data-status="ok">
816
825
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Basic success — <code>runTransaction(ref, current =&gt; (current ?? 0) + 1)</code> resolves <code>{ committed: true, snapshot }</code> where <code>snapshot.val()</code> is the new value</span></span></summary>
817
- <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-success.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-success.json</code></a> — observed <code>committed: true, snapVal: 1</code> after running <code>current =&gt; (current ?? 0) + 1</code> against an empty ref. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-on-rules-denied-path.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-runtransaction-on-rules-denied-path</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-options-applylocally.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-runtransaction-options-applylocally</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L141" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
826
+ <div class="compat-evidence"><div class="compat-probe">oracle: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-success.json" target="_blank" rel="noopener noreferrer"><code>packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-success.json</code></a> — observed <code>committed: true, snapVal: 1</code> after running <code>current =&gt; (current ?? 0) + 1</code> against an empty ref. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-on-rules-denied-path.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-runtransaction-on-rules-denied-path</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-options-applylocally.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-runtransaction-options-applylocally</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/public-operations.test.ts#L156" target="_blank" rel="noopener noreferrer"><code>public-operations.test.ts</code></a>)</div></div>
818
827
  </details>
819
828
  <details class="compat-row" data-status="ok">
820
829
  <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior">Returning <code>undefined</code> from the update fn <strong>aborts</strong> the transaction — resolves <code>{ committed: false }</code>, no write performed (RTDB-specific; distinct from Firestore where the only abort path is throwing)</span></span></summary>
@@ -867,10 +876,9 @@ In production each database URL is its own instance, with its own data and its o
867
876
  <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/fruit-aliases.test.ts#L21" target="_blank" rel="noopener noreferrer"><code>unit:modular/fruit-aliases.test.ts</code></a></div>
868
877
  <div class="compat-note">accepted no-op; no sandbox logger to wire into</div></div>
869
878
  </details>
870
- <details class="compat-row" data-status="diverged">
871
- <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"><span class="compat-behavior"><strong>Divergence:</strong> <code>refFromURL(db, url)</code> matches Firebase's path parsing, query ignoring, FTP-to-database normalization, and fragment rejection, but the single-database sandbox does not validate the URL host/namespace against the handle; Firebase rejects a mismatched host while the sandbox uses its path.</span></span></summary>
872
- <div class="compat-evidence"><div class="compat-probe">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-reference-shape-url.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-reference-shape-url</code></a> captures accepted FTP/query URLs and rejected fragments, malformed URLs, and host mismatches; <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-reference-writes.test.ts#L33" target="_blank" rel="noopener noreferrer"><code>unit:modular/oracle-conformance-reference-writes.test.ts</code></a> pins the conforming validations plus both sides of the host divergence.</div>
873
- <div class="compat-note">path and validation behavior conform except URL host/namespace matching (single-database sandbox)</div></div>
879
+ <details class="compat-row" data-status="ok">
880
+ <summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><span class="compat-behavior"><code>refFromURL(db, url)</code> matches Firebase's path parsing, query ignoring, FTP-to-database normalization, fragment rejection and malformed-URL error. As the SDK does, a URL whose host is not the database's host throws <code>Host name does not match the current database</code>, unless the database's host is custom (any domain but <code>firebaseio.com</code> and <code>firebaseio-demo.com</code>). A sandbox database opened without a URL has no host, so its URLs are not checked.</span></span></summary>
881
+ <div class="compat-evidence"><div class="compat-probe">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-reference-shape-url.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-reference-shape-url</code></a> captures accepted FTP/query URLs and rejected fragments, malformed URLs, and host mismatches; <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-reference-writes.test.ts#L33" target="_blank" rel="noopener noreferrer"><code>unit:modular/oracle-conformance-reference-writes.test.ts</code></a> replays each, and <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/ref-from-url-host.test.ts#L52" target="_blank" rel="noopener noreferrer"><code>unit:modular/ref-from-url-host.test.ts</code></a> pins the host check for an app's default instance, a named instance and a custom host, from hunt finding RT-12.</div></div>
874
882
  </details>
875
883
  </div>
876
884
 
@@ -889,8 +897,8 @@ The web hosted client talks to the Node host over one WebSocket. When that socke
889
897
  <div class="compat-evidence"><div class="compat-probe">Production behavior: the same <code>@firebase/database</code> 1.1.3 code as row HD1 (<code>onRealtimeDisconnect_</code>, <code>restoreState_</code>, <code>sendOnDisconnect_</code>, <code>cancelSentTransactions_</code>); the package runs the same database core in Node. Pyric behavior: <code>packages/cli/src/serve/worker/rtdb-drop-fates.ts</code> is the per-method table both this client and the web hosted client classify a call with, and <code>packages/cli/src/remote/index.ts</code> <code>releaseInFlight</code> applies it, failing a key-less push. <code>packages/cli/src/remote/held-calls.ts</code> holds the calls until the next attach. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/remote/reconnect.test.ts#L22" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/remote/reconnect.test.ts</code></a> stops a real loopback host with calls in flight and asserts each method's outcome, that a write or get is sent again on the restarted host under a new id and resolves on its reply, the order (restored listeners, then calls in flight, then calls issued while down), that a call sent again outlives the hold deadline, and that a returning host refusing the attach or <code>close()</code> fails them unsent. <code>packages/cli/test/remote/loop-hold.test.ts</code> asserts the release by fate and that a held call keeps a Node process alive until it settles. App scenario <code>test/apps/node-client-host-restart</code> runs a <code>firebase-admin</code> writer under <code>node --import @pyric/cli/register</code>, restarts the hosted Vite dev server by editing <code>vite.config.js</code> mid-run, and asserts every write resolves and is stored and none reports the URL as stale (#1107). CDD assertion <code>rtdb-modular#HD2</code> pins the sandbox side: the in-page sandbox has no socket, so a write and a get settle in process across <code>goOffline()</code> and <code>goOnline()</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/test/apps/node-client-host-restart/scenario.ts#L2" target="_blank" rel="noopener noreferrer"><code>scenario.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/lifecycle-and-identity.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>lifecycle-and-identity.test.ts</code></a>)</div></div>
890
898
  </details>
891
899
  <details class="compat-row" data-status="ok">
892
- <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">pyric-admin DataSnapshot forEach / numChildren / hasChildren / child, and worker bridge snapshots</code><span class="compat-sub"><span class="compat-behavior">A node whose keys are integers keeps its children when <code>val()</code> renders it as an array. A <code>pyric-admin</code> snapshot of such a node, read in process or through the remote arm, iterates <code>forEach</code> over children keyed <code>'0'</code>, <code>'1'</code>, ... in index order, skipping indexes that hold no value, and <code>numChildren()</code>, <code>hasChildren()</code>, <code>child('1')</code> and <code>hasChild('1')</code> count and address the same children. A snapshot the worker bridge hydrates without the host's ordered entries, from <code>child()</code> or inside <code>forEach</code>, iterates an array value the same way. <code>forEach</code> stops when the callback returns <code>true</code> and returns <code>true</code>.</span></span></span></summary>
893
- <div class="compat-evidence"><div class="compat-probe">Production behavior read from <code>@firebase/database</code> 1.1.3 <code>dist/index.node.cjs.js</code>: <code>DataSnapshot.forEach</code> returns <code>false</code> only for a leaf node and otherwise walks the node's children in priority, then <code>nameCompare</code> key order; <code>hasChildren</code> is <code>!isLeafNode() &amp;&amp; !isEmpty()</code>; <code>size</code> is <code>ChildrenNode.numChildren()</code>; <code>ChildrenNode.val</code> renders a node as an array only when every key is an integer and the largest is below twice the key count, leaving missing indexes as holes. Pyric behavior: <code>valueChildren</code> (exported from <code>pyric/database/internal</code>) lists a value's children (array indexes as string keys without holes or nulls, or object keys in <code>nameCompare</code> order), used by <code>packages/pyric-admin/src/database/index.ts</code> <code>buildSandboxSnap</code> and <code>packages/cli/src/serve/worker/client/rtdb-snapshots.ts</code> <code>makeRtdbSnapshot</code>. <a href="https://github.com/davideast/pyric/blob/main/packages/pyric-admin/test/database/array-children.test.ts#L3" target="_blank" rel="noopener noreferrer"><code>packages/pyric-admin/test/database/array-children.test.ts</code></a> asserts a dense, sparse and nested array, each child's key, value and reference, and the early exit. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/client/rtdb-snapshots.test.ts#L29" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/serve/worker/client/rtdb-snapshots.test.ts</code></a> iterates a nested and a sparse array below the top level of a worker snapshot. App scenario <code>test/apps/node-client-host-restart</code> reads the stored ticks back with <code>forEach</code> from a <code>firebase-admin</code> process under <code>node --import @pyric/cli/register</code> (#1110). CDD assertion <code>rtdb-modular#AS1</code> pins the sandbox side: an array written through <code>getAdminDatabase</code> iterates as one child per index. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/test/apps/node-client-host-restart/scenario.ts#L86" target="_blank" rel="noopener noreferrer"><code>scenario.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/lifecycle-and-identity.test.ts#L28" target="_blank" rel="noopener noreferrer"><code>lifecycle-and-identity.test.ts</code></a>)</div></div>
900
+ <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">pyric-admin DataSnapshot forEach / numChildren / hasChildren / child, and worker bridge snapshots</code><span class="compat-sub"><span class="compat-behavior">A node whose keys are integers keeps its children when <code>val()</code> renders it as an array. A <code>pyric-admin</code> snapshot of such a node, read in process or through the remote arm, iterates <code>forEach</code> over children keyed <code>'0'</code>, <code>'1'</code>, ... in index order, skipping indexes that hold no value, and <code>numChildren()</code>, <code>hasChildren()</code>, <code>child('1')</code> and <code>hasChild('1')</code> count and address the same children. A snapshot the worker bridge hydrates without the host's ordered entries, from <code>child()</code> or inside <code>forEach</code>, iterates an array value the same way. <code>forEach</code> stops when the callback returns <code>true</code> and returns <code>true</code>. Both <code>pyric-admin</code> arms store a write by key, as the host does, so an object whose keys are integers, written with <code>set()</code>, <code>update()</code> or <code>push()</code>, reads back from <code>val()</code> as an array when its largest key is below twice the key count, with a hole at each missing index, while <code>exportVal()</code> and <code>toJSON()</code> keep the integer keys as object keys. Null children and empty objects are dropped. For a node written without priorities, the in-process arm, the remote arm and the in-page client sandbox agree on <code>val()</code>, <code>exportVal()</code>, <code>toJSON()</code>, <code>numChildren()</code>, <code>forEach</code> keys and order, and <code>child()</code>. Both <code>pyric-admin</code> arms refuse a write firebase-admin refuses (<code>undefined</code>, a function, <code>NaN</code> or an infinity, an invalid key, <code>.value</code> beside children, an inline priority that is not a string or number, or an <code>update()</code> key ending in <code>.priority</code> whose value is not a valid priority) by throwing synchronously with firebase-admin's text, and store nothing. Both arms write a value as RTDB stores it, so a <code>Date</code> is dropped as firebase-admin drops it. Priorities are not modeled on the <code>pyric-admin</code> arms: a valid priority, inline or under an <code>update()</code> key ending in <code>.priority</code>, is accepted and dropped on both, and the in-process arm's <code>exportVal()</code> carries none. The remote arm's <code>exportVal()</code> and <code>toJSON()</code> return the host's export, so a priority another plane set reads back with it.</span></span></span></summary>
901
+ <div class="compat-evidence"><div class="compat-probe">Production behavior read from <code>@firebase/database</code> 1.1.3 <code>dist/index.node.cjs.js</code>: <code>DataSnapshot.forEach</code> returns <code>false</code> only for a leaf node and otherwise walks the node's children in priority, then <code>nameCompare</code> key order; <code>hasChildren</code> is <code>!isLeafNode() &amp;&amp; !isEmpty()</code>; <code>size</code> is <code>ChildrenNode.numChildren()</code>; <code>ChildrenNode.val</code> renders a node as an array only when every key is an integer and the largest is below twice the key count and the call is not exporting (<code>exportVal()</code> and <code>toJSON()</code> call <code>val(true)</code>), leaving missing indexes as holes; <code>validateFirebaseData</code> and <code>validateFirebaseMergeDataArg</code> refuse a write synchronously. Pyric behavior: <code>valueChildren</code> (exported from <code>pyric/database/internal</code>) lists a value's children (array indexes as string keys without holes or nulls, or object keys in <code>nameCompare</code> order), used by <code>packages/pyric-admin/src/database/index.ts</code> <code>buildSandboxSnap</code> and <code>packages/cli/src/serve/worker/client/rtdb-snapshots.ts</code> <code>makeRtdbSnapshot</code>. Both <code>pyric-admin</code> arms validate a write with <code>validateWrite</code> before it runs or is relayed, and their shared snapshot keeps the stored value for <code>exportVal()</code> and <code>toJSON()</code> and renders <code>val()</code> with <code>coerceArrays</code>; the in-process arm stores what <code>normalizeNode</code> builds. These are the write-boundary normalization the in-page sandbox and the host use, exported from <code>pyric/database/internal</code>. <a href="https://github.com/davideast/pyric/blob/main/packages/pyric-admin/test/database/write-validation.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>packages/pyric-admin/test/database/write-validation.test.ts</code></a> runs 35 refused writes on both arms and asserts the synchronous error text firebase-admin 13.10.0 throws for each, read from the SDK run offline, and that nothing is stored; it also asserts a valid priority is dropped on both arms, a <code>Date</code> is dropped on both, and the remote arm's <code>exportVal()</code> carries a priority the host set. <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/write-validation-text.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>packages/pyric/test/database/modular/write-validation-text.test.ts</code></a> asserts the in-page sandbox's refusal text for <code>set</code>, <code>push</code> (naming the parent's path), <code>setWithPriority</code>, <code>update</code>, a transaction result, and <code>onDisconnect().set()</code> and <code>setWithPriority()</code>, and its keyed <code>exportVal()</code> and <code>toJSON()</code>. <a href="https://github.com/davideast/pyric/blob/main/packages/pyric-admin/test/database/array-children.test.ts#L3" target="_blank" rel="noopener noreferrer"><code>packages/pyric-admin/test/database/array-children.test.ts</code></a> asserts a dense, sparse and nested array, each child's key, value and reference, and the early exit. <a href="https://github.com/davideast/pyric/blob/main/packages/pyric-admin/test/database/integer-keys-parity.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>packages/pyric-admin/test/database/integer-keys-parity.test.ts</code></a> writes dense, sparse and over-threshold integer keys, arrays, nested mixes, null children, empty objects, <code>update()</code> and <code>push()</code> on the in-process arm, the remote arm on the real worker host, and the in-page client sandbox, and asserts the same <code>val()</code>, <code>exportVal()</code>, <code>numChildren()</code>, <code>forEach</code> keys and order, and <code>child()</code> on all three (#1121). <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/client/rtdb-snapshots.test.ts#L29" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/serve/worker/client/rtdb-snapshots.test.ts</code></a> iterates a nested and a sparse array below the top level of a worker snapshot. App scenario <code>test/apps/node-client-host-restart</code> reads the stored ticks back with <code>forEach</code> from a <code>firebase-admin</code> process under <code>node --import @pyric/cli/register</code> (#1110). CDD assertion <code>rtdb-modular#AS1</code> pins the sandbox side: an array and an object with keys <code>0</code>, <code>1</code>, <code>2</code> written through <code>getAdminDatabase</code> read back as the same array, which iterates as one child per index. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/test/apps/node-client-host-restart/scenario.ts#L86" target="_blank" rel="noopener noreferrer"><code>scenario.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/lifecycle-and-identity.test.ts#L28" target="_blank" rel="noopener noreferrer"><code>lifecycle-and-identity.test.ts</code></a>)</div></div>
894
902
  </details>
895
903
  </div>
896
904
 
@@ -901,7 +909,7 @@ A server process started with `node --import @pyric/cli/register` and `PYRIC_SAN
901
909
  <div class="compat-list">
902
910
  <details class="compat-row" data-status="diverged">
903
911
  <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">getDatabase(app) in a registered server process</code><span class="compat-sub"><span class="compat-behavior">Under a remote register activation on the Node host, <code>firebase/database</code> in a server process reads and writes the host's data under its rules as the process's signed-in user: a write the rules deny for that user fails with <code>PERMISSION_DENIED</code>, <code>.info/connected</code> follows the process's connection, and an <code>onDisconnect</code> write runs when that connection ends. From its first RTDB call on an instance the process stays up until <code>goOffline()</code> on that instance or <code>deleteApp()</code>, as <code>@firebase/database</code> keeps a Node process up. When the host is not the Node host, every call fails with <code>failed-precondition</code> and a message naming the Node host (<code>pyric sandbox --hosted</code> or <code>pyric({ hosted: true })</code>); when no host is found, with the discovery error <code>pyric-admin</code> gets. No call falls back to an in-process sandbox.</span></span></span></summary>
904
- <div class="compat-evidence"><div class="compat-probe">App scenario <code>test/apps/client-sdk-under-register</code> runs the client SDKs under <code>node --import @pyric/cli/register</code> against a hosted Vite dev server, reads back with <code>firebase-admin</code> and a page, and asserts a write and a read, a denied write to another user's path, <code>.info/connected</code>, an <code>onDisconnect</code> that ran after the process exited, and that a process stays up after a write until <code>goOffline()</code>. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/node-realm.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>node-realm.test.ts</code></a> pins when the process is held. CDD assertion <code>rtdb-modular#RS1</code> pins the sandbox side: rules evaluate per signed-in session, and a registry bound to the refusal opens no database handle. On main (942cb175) it failed: the calls ran against a private in-process sandbox, so an upload returned a <a href="https://github.com/davideast/pyric/blob/main/test/apps/client-sdk-under-register/scenario.ts#L1" target="_blank" rel="noopener noreferrer"><code>data:</code></a> URL and firebase-admin read nothing they wrote. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/node-origin.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/register/node-origin.test.ts</code></a> runs the served surfaces under a Node origin whose host is not the Node host, or cannot be found, and asserts every call fails, <code>useWorker</code> stays true, the served app entry's placeholder sandbox stays empty, and a <code>pyric/*</code> mirror resolved from the app refuses. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/mapping.test.ts#L80" target="_blank" rel="noopener noreferrer"><code>mapping.test.ts</code></a> pins the mapping per activation value.. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/register-child.test.ts#L138" target="_blank" rel="noopener noreferrer"><code>register-child.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/lifecycle-and-identity.test.ts#L28" target="_blank" rel="noopener noreferrer"><code>lifecycle-and-identity.test.ts</code></a>)</div>
912
+ <div class="compat-evidence"><div class="compat-probe">App scenario <code>test/apps/client-sdk-under-register</code> runs the client SDKs under <code>node --import @pyric/cli/register</code> against a hosted Vite dev server, reads back with <code>firebase-admin</code> and a page, and asserts a write and a read, a denied write to another user's path, <code>.info/connected</code>, an <code>onDisconnect</code> that ran after the process exited, and that a process stays up after a write until <code>goOffline()</code>. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/node-realm.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>node-realm.test.ts</code></a> pins when the process is held. CDD assertion <code>rtdb-modular#RS1</code> pins the sandbox side: rules evaluate per signed-in session, and a registry bound to the refusal opens no database handle. On main (942cb175) it failed: the calls ran against a private in-process sandbox, so an upload returned a <a href="https://github.com/davideast/pyric/blob/main/test/apps/client-sdk-under-register/scenario.ts#L1" target="_blank" rel="noopener noreferrer"><code>data:</code></a> URL and firebase-admin read nothing they wrote. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/node-origin.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/register/node-origin.test.ts</code></a> runs the served surfaces under a Node origin whose host is not the Node host, or cannot be found, and asserts every call fails, <code>useWorker</code> stays true, the served app entry's placeholder sandbox stays empty, and a <code>pyric/*</code> mirror resolved from the app refuses. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/mapping.test.ts#L78" target="_blank" rel="noopener noreferrer"><code>mapping.test.ts</code></a> pins the mapping per activation value.. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/register-child.test.ts#L138" target="_blank" rel="noopener noreferrer"><code>register-child.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/lifecycle-and-identity.test.ts#L28" target="_blank" rel="noopener noreferrer"><code>lifecycle-and-identity.test.ts</code></a>)</div>
905
913
  <div class="compat-note">the app must use the same Firebase options as the host's other clients (one configuration per runtime)</div></div>
906
914
  </details>
907
915
  </div>
@@ -923,6 +931,49 @@ Modules Vite loads for server rendering under `vite dev` with `pyric()` (`server
923
931
  </details>
924
932
  </div>
925
933
 
934
+ ## Behavior checked against production captures
935
+
936
+ Each row cites a production capture from the SDK behavior hunt. A `bug` row states production's behavior and pyric's; its test holds both answers until the fix lands.
937
+
938
+ <div class="compat-list">
939
+ <details class="compat-row" data-status="bug">
940
+ <summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">runTransaction(ref, fn) followed at once by set(ref, value)</code><span class="compat-sub"><span class="compat-behavior">On a cold production client the set overtakes the transaction, which rejects with Error('set'); pyric commits it. A warm client commits in both. RT-15.</span></span></span></summary>
941
+ <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-transaction-then-set.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-transaction-then-set</code></a> keys <code>cold</code> and <code>warm</code> (both clients were cold) and <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-transaction-then-set-warm.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-transaction-then-set-warm</code></a>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-transaction-then-set.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-transaction-then-set.test.ts</code></a>)</div></div>
942
+ </details>
943
+ <details class="compat-row" data-status="bug">
944
+ <summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">runTransaction then set on the served planes</code><span class="compat-sub"><span class="compat-behavior">On the served planes the transaction reruns on the set's value and commits on top (101); production keeps the set's 100. RP-4.</span></span></span></summary>
945
+ <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-transaction-then-set.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-transaction-then-set</code></a> and <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-transaction-then-set-warm.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-transaction-then-set-warm</code></a>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/oracle-captures/rtdb-transaction-then-set.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>rtdb-transaction-then-set.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-transaction-then-set.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-transaction-then-set.test.ts</code></a>)</div></div>
946
+ </details>
947
+ <details class="compat-row" data-status="bug">
948
+ <summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">Event order for one remote multi-path update</code><span class="compat-sub"><span class="compat-behavior">Production fires deeper paths first and child events (removed, added, moved, changed) before value; the in-page sandbox fires value first, parents first, in registration order. RT-2, RT-3.</span></span></span></summary>
949
+ <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-remote-update-event-order.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-remote-update-event-order</code></a> key <code>log</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-remote-update-event-order.test.ts</code></a>)</div></div>
950
+ </details>
951
+ <details class="compat-row" data-status="bug">
952
+ <summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">setPriority(ref) and child_changed</code><span class="compat-sub"><span class="compat-behavior">Production fires child_changed on the parent's listeners for a priority-only change. Pyric fires none, on every plane. RT-4.</span></span></span></summary>
953
+ <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-remote-update-event-order.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-remote-update-event-order</code></a> (<code>R changed a</code> and <code>Q changed a</code> after setPriority). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-remote-update-event-order.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/oracle-captures/rtdb-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>rtdb-remote-update-event-order.test.ts</code></a>)</div></div>
954
+ </details>
955
+ <details class="compat-row" data-status="bug">
956
+ <summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">child_moved on a query with no orderBy</code><span class="compat-sub"><span class="compat-behavior">Production fires child_moved for a priority change on a query with no orderBy (<code>L moved a</code>). The in-page sandbox fires none; the served planes match production. RT-5, part of #138.</span></span></span></summary>
957
+ <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-remote-update-event-order.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-remote-update-event-order</code></a>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-remote-update-event-order.test.ts</code></a>)</div></div>
958
+ </details>
959
+ <details class="compat-row" data-status="ok">
960
+ <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">Object.keys(snapshot.val())</code><span class="compat-sub"><span class="compat-behavior">Production and pyric order <code>val()</code> keys by priority, then key, on a ref and a query snapshot. RT-7, fixed in #1371.</span></span></span></summary>
961
+ <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-remote-update-event-order.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-remote-update-event-order</code></a> key <code>valKeys</code>, replayed in page and on the served planes; <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/snapshot-serialization.test.ts#L9" target="_blank" rel="noopener noreferrer"><code>packages/pyric/test/database/modular/snapshot-serialization.test.ts</code></a> adds priorities and nested values. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-remote-update-event-order.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/oracle-captures/rtdb-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>rtdb-remote-update-event-order.test.ts</code></a>)</div></div>
962
+ </details>
963
+ <details class="compat-row" data-status="bug">
964
+ <summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">Event order for one remote update on the served planes</code><span class="compat-sub"><span class="compat-behavior">Production delivers one write's events deepest path first, child events before value. On the SharedWorker and Node host planes they arrive listener by listener in registration order. RP-5.</span></span></span></summary>
965
+ <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-remote-update-event-order.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-remote-update-event-order</code></a>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/oracle-captures/rtdb-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>rtdb-remote-update-event-order.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-remote-update-event-order.test.ts</code></a>)</div></div>
966
+ </details>
967
+ <details class="compat-row" data-status="ok">
968
+ <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">orderByPriority with endAt or endBefore and limitToLast over children with no priority</code><span class="compat-sub"><span class="compat-behavior">Production and pyric give the same keys: <code>z</code> for endAt("1","A") with limitToLast(1), <code>b,z</code> for endBefore("1") with limitToLast(2), <code>1,10,A,a,b,z</code> with no limit, and <code>a,b,z</code> for the endAt(2) limitToLast(3) control. The capture refuted hunt finding RT-17.</span></span></span></summary>
969
+ <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-priority-window-limit-to-last.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-priority-window-limit-to-last</code></a>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-priority-window-limit-to-last.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-priority-window-limit-to-last.test.ts</code></a>)</div></div>
970
+ </details>
971
+ <details class="compat-row" data-status="bug">
972
+ <summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">onValue(query) and a grandchild's priority change</code><span class="compat-sub"><span class="compat-behavior">Production fires a value event on every listener above a grandchild whose priority changes, orderByKey queries included. Pyric's query listeners miss it on every plane, though plain ref listeners get it. RP-8 (differential seed 7395).</span></span></span></summary>
973
+ <div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-grandchild-priority-query-value.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-grandchild-priority-query-value</code></a>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-grandchild-priority-query-value.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-grandchild-priority-query-value.test.ts</code></a>)</div></div>
974
+ </details>
975
+ </div>
976
+
926
977
  ## Current gaps
927
978
 
928
979
  ### Documented divergences
@@ -930,8 +981,8 @@ Modules Vite loads for server rendering under `vite dev` with `pyric()` (`server
930
981
  Known differences between Pyric and production Firebase. Each remains tracked as a non-conforming row.
931
982
 
932
983
  <div class="compat-list">
933
- <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"><span class="compat-sub"><span class="compat-behavior">Cold production clients may invoke the update fn first with speculative <code>null</code> and then with the current seeded value; the always-warm in-process sandbox invokes it once with the current value</span></span></span></summary>
934
- <div class="compat-evidence"><div class="compat-note">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-current-value-arg.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-runtransaction-current-value-arg</code></a> captures two seeded-path production invocations (<code>null</code>, then current); <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-transactions.test.ts#L52" target="_blank" rel="noopener noreferrer"><code>unit:modular/oracle-conformance-transactions.test.ts</code></a> pins the sandbox's single current-value invocation. The separate warm-client observation matches the sandbox but does not erase the cold-client contract. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/transaction.test.ts#L94" target="_blank" rel="noopener noreferrer"><code>transaction.test.ts</code></a>)</div></div></details>
984
+ <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"><span class="compat-sub"><span class="compat-behavior">Cold production clients may invoke the update fn first with speculative <code>null</code> and then with the current seeded value; the always-warm in-process sandbox invokes it once with the current value, so abort-if-missing aborts in production and commits in pyric (RT-16)</span></span></span></summary>
985
+ <div class="compat-evidence"><div class="compat-note">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-runtransaction-current-value-arg.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-runtransaction-current-value-arg</code></a> captures two seeded-path production invocations (<code>null</code>, then current); <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-transactions.test.ts#L52" target="_blank" rel="noopener noreferrer"><code>unit:modular/oracle-conformance-transactions.test.ts</code></a> pins the sandbox's single current-value invocation. The separate warm-client observation matches the sandbox but does not erase the cold-client contract. <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-transaction-then-set.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-transaction-then-set</code></a> key <code>abortIfMissing</code>: production aborts, pyric commits (RT-16). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/transaction.test.ts#L94" target="_blank" rel="noopener noreferrer"><code>transaction.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-transaction-then-set.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-transaction-then-set.test.ts</code></a>)</div></div></details>
935
986
  <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"><span class="compat-sub"><span class="compat-behavior">**Divergence:** two ordinary concurrent <code>runTransaction</code> calls are serialized by the in-process backend, so their update functions are not retried with Firebase's captured contention counts. A synchronous re-entrant conflicting write does trigger a deterministic retry.</span></span></span></summary>
936
987
  <div class="compat-evidence"><div class="compat-note">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-concurrent-transforms.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-concurrent-transforms</code></a> captures invocation counts [2, 3]; <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/transaction-contention-cdd.test.ts#L12" target="_blank" rel="noopener noreferrer"><code>unit:modular/transaction-contention-cdd.test.ts</code></a> pins the sandbox's [1, 1] ordinary-concurrency boundary and separately covers its deterministic re-entrant retry seam.</div></div></details>
937
988
  <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"><span class="compat-sub"><span class="compat-behavior">**Divergence (pending fix):** clean <code>goOffline</code>, app deletion, playground <code>pagehide</code>, and best-effort MessagePort close drain queued operations, but unannounced total renderer/process loss is not guaranteed by the in-memory sandbox</span></span></span></summary>
@@ -954,12 +1005,31 @@ Known differences between Pyric and production Firebase. Each remains tracked as
954
1005
  <div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/fruit-aliases.test.ts#L20" target="_blank" rel="noopener noreferrer"><code>unit:modular/fruit-aliases.test.ts</code></a></div></div></details>
955
1006
  <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"><span class="compat-sub"><span class="compat-behavior"><code>enableLogging(logger?, persistent?)</code> — accepted no-op: the sandbox has no modular-SDK-style logger to wire a level/sink into (it uses host-level <code>console</code> logging directly, matching <code>pyric/firestore</code>'s <code>setLogLevel</code>). Accepted so init code that calls it compiles + runs</span></span></span></summary>
956
1007
  <div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/fruit-aliases.test.ts#L21" target="_blank" rel="noopener noreferrer"><code>unit:modular/fruit-aliases.test.ts</code></a></div></div></details>
957
- <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"><span class="compat-sub"><span class="compat-behavior">**Divergence:** <code>refFromURL(db, url)</code> matches Firebase's path parsing, query ignoring, FTP-to-database normalization, and fragment rejection, but the single-database sandbox does not validate the URL host/namespace against the handle; Firebase rejects a mismatched host while the sandbox uses its path.</span></span></span></summary>
958
- <div class="compat-evidence"><div class="compat-note">Oracle <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-reference-shape-url.json" target="_blank" rel="noopener noreferrer"><code>rtdb-modular-reference-shape-url</code></a> captures accepted FTP/query URLs and rejected fragments, malformed URLs, and host mismatches; <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/modular/oracle-conformance-reference-writes.test.ts#L33" target="_blank" rel="noopener noreferrer"><code>unit:modular/oracle-conformance-reference-writes.test.ts</code></a> pins the conforming validations plus both sides of the host divergence.</div></div></details>
959
1008
  <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">getDatabase(app) in a registered server process</code><span class="compat-sub"><span class="compat-behavior">Under a remote register activation on the Node host, <code>firebase/database</code> in a server process reads and writes the host's data under its rules as the process's signed-in user: a write the rules deny for that user fails with <code>PERMISSION_DENIED</code>, <code>.info/connected</code> follows the process's connection, and an <code>onDisconnect</code> write runs when that connection ends. From its first RTDB call on an instance the process stays up until <code>goOffline()</code> on that instance or <code>deleteApp()</code>, as <code>@firebase/database</code> keeps a Node process up. When the host is not the Node host, every call fails with <code>failed-precondition</code> and a message naming the Node host (<code>pyric sandbox --hosted</code> or <code>pyric({ hosted: true })</code>); when no host is found, with the discovery error <code>pyric-admin</code> gets. No call falls back to an in-process sandbox.</span></span></span></summary>
960
- <div class="compat-evidence"><div class="compat-note">App scenario <code>test/apps/client-sdk-under-register</code> runs the client SDKs under <code>node --import @pyric/cli/register</code> against a hosted Vite dev server, reads back with <code>firebase-admin</code> and a page, and asserts a write and a read, a denied write to another user's path, <code>.info/connected</code>, an <code>onDisconnect</code> that ran after the process exited, and that a process stays up after a write until <code>goOffline()</code>. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/node-realm.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>node-realm.test.ts</code></a> pins when the process is held. CDD assertion <code>rtdb-modular#RS1</code> pins the sandbox side: rules evaluate per signed-in session, and a registry bound to the refusal opens no database handle. On main (942cb175) it failed: the calls ran against a private in-process sandbox, so an upload returned a <a href="https://github.com/davideast/pyric/blob/main/test/apps/client-sdk-under-register/scenario.ts#L1" target="_blank" rel="noopener noreferrer"><code>data:</code></a> URL and firebase-admin read nothing they wrote. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/node-origin.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/register/node-origin.test.ts</code></a> runs the served surfaces under a Node origin whose host is not the Node host, or cannot be found, and asserts every call fails, <code>useWorker</code> stays true, the served app entry's placeholder sandbox stays empty, and a <code>pyric/*</code> mirror resolved from the app refuses. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/mapping.test.ts#L80" target="_blank" rel="noopener noreferrer"><code>mapping.test.ts</code></a> pins the mapping per activation value.. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/register-child.test.ts#L138" target="_blank" rel="noopener noreferrer"><code>register-child.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/lifecycle-and-identity.test.ts#L28" target="_blank" rel="noopener noreferrer"><code>lifecycle-and-identity.test.ts</code></a>)</div></div></details>
1009
+ <div class="compat-evidence"><div class="compat-note">App scenario <code>test/apps/client-sdk-under-register</code> runs the client SDKs under <code>node --import @pyric/cli/register</code> against a hosted Vite dev server, reads back with <code>firebase-admin</code> and a page, and asserts a write and a read, a denied write to another user's path, <code>.info/connected</code>, an <code>onDisconnect</code> that ran after the process exited, and that a process stays up after a write until <code>goOffline()</code>. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/node-realm.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>node-realm.test.ts</code></a> pins when the process is held. CDD assertion <code>rtdb-modular#RS1</code> pins the sandbox side: rules evaluate per signed-in session, and a registry bound to the refusal opens no database handle. On main (942cb175) it failed: the calls ran against a private in-process sandbox, so an upload returned a <a href="https://github.com/davideast/pyric/blob/main/test/apps/client-sdk-under-register/scenario.ts#L1" target="_blank" rel="noopener noreferrer"><code>data:</code></a> URL and firebase-admin read nothing they wrote. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/node-origin.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>packages/cli/test/register/node-origin.test.ts</code></a> runs the served surfaces under a Node origin whose host is not the Node host, or cannot be found, and asserts every call fails, <code>useWorker</code> stays true, the served app entry's placeholder sandbox stays empty, and a <code>pyric/*</code> mirror resolved from the app refuses. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/mapping.test.ts#L78" target="_blank" rel="noopener noreferrer"><code>mapping.test.ts</code></a> pins the mapping per activation value.. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/register-child.test.ts#L138" target="_blank" rel="noopener noreferrer"><code>register-child.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/lifecycle-and-identity.test.ts#L28" target="_blank" rel="noopener noreferrer"><code>lifecycle-and-identity.test.ts</code></a>)</div></div></details>
961
1010
  <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">getDatabase(app) in a server-rendered module under vite dev</code><span class="compat-sub"><span class="compat-behavior">On a hosted dev server, <code>firebase/database</code> in a server-rendered module reads and writes the host's data under its rules as the SSR session's user: a write the rules deny for that user fails with <code>PERMISSION_DENIED</code>. <code>ssrLoadModule</code>, the environment runner and every <code>ssr.noExternal</code> setting share one app and one session. Closing the dev server lets the process go, so a process that created the server through Vite's API ends on its own, though RTDB would otherwise hold it until <code>goOffline()</code>. On a SharedWorker dev server every call fails with <code>failed-precondition</code> and a message naming <code>pyric({ hosted: true })</code>. No call reaches production or an in-process sandbox.</span></span></span></summary>
962
1011
  <div class="compat-evidence"><div class="compat-note">App scenario <code>test/apps/vite-ssr-client-sdk</code> writes and reads the SSR user's own path, is denied another user's, reads the writes back with <code>firebase-admin</code> in SSR and in a process on the host, repeats it with <code>ssr.noExternal</code> <code>['firebase']</code> and <code>true</code>, refuses on a SharedWorker dev server, and creates a dev server through Vite's API that ends on its own after SSR used RTDB. On main (ba2c0bf0a) the scenario failed: SSR sign-in rejected with <code>auth/network-request-failed</code> from the network guard, and the RTDB, Firestore and Storage writes did not settle, because the imports loaded the real SDK. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/vite-module-swap.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>vite-module-swap.test.ts</code></a> pins the routing per specifier, AI mode and environment (Vite 5's <code>ssr</code> option, a runnable environment, a non-runnable one), <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/vite-ssr-activation.test.ts#L1" target="_blank" rel="noopener noreferrer"><code>vite-ssr-activation.test.ts</code></a> the host, the restart hand-over and the SharedWorker refusal, and <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/vite-plugin-firestore.test.ts#L14" target="_blank" rel="noopener noreferrer"><code>vite-plugin-firestore.test.ts</code></a> runs Vite with <code>firebase</code> installed, so it takes the externalized path. CDD assertion <code>rtdb-modular#RS2</code> pins the sandbox side. <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/register/node-realm.test.ts#L1" target="_blank" rel="noopener noreferrer"><code>node-realm.test.ts</code></a> pins the release when the in-process host ends. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/test/apps/vite-ssr-client-sdk/scenario.ts#L1" target="_blank" rel="noopener noreferrer"><code>scenario.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/lifecycle-and-identity.test.ts#L28" target="_blank" rel="noopener noreferrer"><code>lifecycle-and-identity.test.ts</code></a>)</div></div></details>
963
1012
  <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">firebase-admin/database in a server-rendered module under vite dev</code><span class="compat-sub"><span class="compat-behavior">On a hosted dev server, <code>firebase-admin</code> in a server-rendered module resolves to <code>pyric-admin</code> bound to the dev server's host, as a <code>firebase-admin</code> process on the host is: a bare <code>initializeApp()</code> connects to it, reads bypass the rules, and the writes of browsers and SSR sessions are visible. On a SharedWorker dev server its first call fails with <code>failed-precondition</code> and a message naming <code>pyric({ hosted: true })</code>, without dialing.</span></span></span></summary>
964
1013
  <div class="compat-evidence"><div class="compat-note">App scenario <code>test/apps/vite-ssr-client-sdk</code> reads a path the rules let only the SSR user read, and a browser's write, with <code>firebase-admin</code> in SSR through both loaders and with each externalization setting, and gets the refusal on a SharedWorker dev server. On main (ba2c0bf0a) <code>firebase-admin</code> in SSR was the real SDK. <a href="https://github.com/davideast/pyric/blob/main/packages/pyric-admin/test/app/ambient-init.test.ts#L128" target="_blank" rel="noopener noreferrer"><code>ambient-init.test.ts</code></a> pins that a bare <code>initializeApp()</code> binds the in-process activation's sandbox when PYRIC_SANDBOX is unset, and that the variable wins when set. CDD assertion <code>rtdb-modular#RS3</code> pins the sandbox side. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/test/apps/vite-ssr-client-sdk/scenario.ts#L1" target="_blank" rel="noopener noreferrer"><code>scenario.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/lifecycle-and-identity.test.ts#L28" target="_blank" rel="noopener noreferrer"><code>lifecycle-and-identity.test.ts</code></a>)</div></div></details>
965
1014
  </div>
1015
+
1016
+ ### Bugs
1017
+
1018
+ Behavior that should match production Firebase but currently does not.
1019
+
1020
+ <div class="compat-list">
1021
+ <details class="compat-row" data-status="bug"><summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">runTransaction(ref, fn) followed at once by set(ref, value)</code><span class="compat-sub"><span class="compat-behavior">On a cold production client the set overtakes the transaction, which rejects with Error('set'); pyric commits it. A warm client commits in both. RT-15.</span></span></span></summary>
1022
+ <div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-transaction-then-set.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-transaction-then-set</code></a> keys <code>cold</code> and <code>warm</code> (both clients were cold) and <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-transaction-then-set-warm.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-transaction-then-set-warm</code></a>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-transaction-then-set.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-transaction-then-set.test.ts</code></a>)</div></div></details>
1023
+ <details class="compat-row" data-status="bug"><summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">runTransaction then set on the served planes</code><span class="compat-sub"><span class="compat-behavior">On the served planes the transaction reruns on the set's value and commits on top (101); production keeps the set's 100. RP-4.</span></span></span></summary>
1024
+ <div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-transaction-then-set.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-transaction-then-set</code></a> and <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-transaction-then-set-warm.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-transaction-then-set-warm</code></a>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/oracle-captures/rtdb-transaction-then-set.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>rtdb-transaction-then-set.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-transaction-then-set.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-transaction-then-set.test.ts</code></a>)</div></div></details>
1025
+ <details class="compat-row" data-status="bug"><summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">Event order for one remote multi-path update</code><span class="compat-sub"><span class="compat-behavior">Production fires deeper paths first and child events (removed, added, moved, changed) before value; the in-page sandbox fires value first, parents first, in registration order. RT-2, RT-3.</span></span></span></summary>
1026
+ <div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-remote-update-event-order.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-remote-update-event-order</code></a> key <code>log</code>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-remote-update-event-order.test.ts</code></a>)</div></div></details>
1027
+ <details class="compat-row" data-status="bug"><summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">setPriority(ref) and child_changed</code><span class="compat-sub"><span class="compat-behavior">Production fires child_changed on the parent's listeners for a priority-only change. Pyric fires none, on every plane. RT-4.</span></span></span></summary>
1028
+ <div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-remote-update-event-order.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-remote-update-event-order</code></a> (<code>R changed a</code> and <code>Q changed a</code> after setPriority). (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-remote-update-event-order.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/oracle-captures/rtdb-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>rtdb-remote-update-event-order.test.ts</code></a>)</div></div></details>
1029
+ <details class="compat-row" data-status="bug"><summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">child_moved on a query with no orderBy</code><span class="compat-sub"><span class="compat-behavior">Production fires child_moved for a priority change on a query with no orderBy (<code>L moved a</code>). The in-page sandbox fires none; the served planes match production. RT-5, part of #138.</span></span></span></summary>
1030
+ <div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-remote-update-event-order.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-remote-update-event-order</code></a>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-remote-update-event-order.test.ts</code></a>)</div></div></details>
1031
+ <details class="compat-row" data-status="bug"><summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">Event order for one remote update on the served planes</code><span class="compat-sub"><span class="compat-behavior">Production delivers one write's events deepest path first, child events before value. On the SharedWorker and Node host planes they arrive listener by listener in registration order. RP-5.</span></span></span></summary>
1032
+ <div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-remote-update-event-order.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-remote-update-event-order</code></a>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/cli/test/serve/worker/oracle-captures/rtdb-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>rtdb-remote-update-event-order.test.ts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-remote-update-event-order.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-remote-update-event-order.test.ts</code></a>)</div></div></details>
1033
+ <details class="compat-row" data-status="bug"><summary class="compat-line"><span class="compat-dot" data-status="bug" role="img" aria-label="Bug" title="Bug"></span><span class="compat-main"><code class="compat-api">onValue(query) and a grandchild's priority change</code><span class="compat-sub"><span class="compat-behavior">Production fires a value event on every listener above a grandchild whose priority changes, orderByKey queries included. Pyric's query listeners miss it on every plane, though plain ref listeners get it. RP-8 (differential seed 7395).</span></span></span></summary>
1034
+ <div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/rtdb-modular/rtdb-modular-grandchild-priority-query-value.json" target="_blank" rel="noopener noreferrer"><code>oracle:rtdb-modular-grandchild-priority-query-value</code></a>. (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/database/cdd/capture-grandchild-priority-query-value.test.ts#L2" target="_blank" rel="noopener noreferrer"><code>capture-grandchild-priority-query-value.test.ts</code></a>)</div></div></details>
1035
+ </div>