@voltro/plugin-rooms 0.87.0 → 0.89.0

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 (451) hide show
  1. package/CHANGELOG.md +272 -6
  2. package/THIRD-PARTY-NOTICES.md +1542 -368
  3. package/dist/actor.js +1 -2
  4. package/dist/apiBinding.js +1 -2
  5. package/dist/apiRegistryBinding.js +1 -2
  6. package/dist/apiReservations.js +3 -4
  7. package/dist/baselines.js +1 -2
  8. package/dist/bots.js +2 -3
  9. package/dist/catalog.js +1 -2
  10. package/dist/checkpointJson.js +1 -2
  11. package/dist/checkpointStore.js +13 -14
  12. package/dist/client.js +1 -2
  13. package/dist/clockSync.js +1 -2
  14. package/dist/collision.js +3 -4
  15. package/dist/commandDelivery.js +1 -2
  16. package/dist/commandRecord.js +1 -2
  17. package/dist/commandWithdrawal.js +1 -2
  18. package/dist/connection.js +1 -2
  19. package/dist/controlCarrier.js +1 -2
  20. package/dist/controlRegistry.js +1 -2
  21. package/dist/controlTarget.js +1 -2
  22. package/dist/controlTransport.js +1 -2
  23. package/dist/developmentBinding.js +1 -2
  24. package/dist/directory.js +3 -4
  25. package/dist/directoryProjection.js +1 -2
  26. package/dist/errors.js +1 -2
  27. package/dist/fixed32.js +1 -2
  28. package/dist/fixedCollision.js +1 -2
  29. package/dist/fixedCollision32.js +1 -2
  30. package/dist/fixedMath.js +1 -2
  31. package/dist/fixedRaw.js +1 -2
  32. package/dist/fixedSlabs.js +1 -2
  33. package/dist/fixedTrig.js +1 -2
  34. package/dist/fixedTrig32.js +1 -2
  35. package/dist/fixedVectors.js +1 -2
  36. package/dist/fixedVectors32.js +1 -2
  37. package/dist/fixedWide.js +1 -2
  38. package/dist/fixedWords.js +1 -2
  39. package/dist/gateway.js +1 -2
  40. package/dist/geometryActivation.js +1 -2
  41. package/dist/geometryActorInventory.js +1 -2
  42. package/dist/geometryAdminClient.js +1 -2
  43. package/dist/geometryAdminData.js +1 -2
  44. package/dist/geometryAdminFixtures.js +1 -2
  45. package/dist/geometryAdminPorts.js +1 -2
  46. package/dist/geometryAdminRpc.js +1 -2
  47. package/dist/geometryAdminRpcRoutes.js +1 -2
  48. package/dist/geometryAdminSchemas.js +1 -2
  49. package/dist/geometryAdministration.js +1 -2
  50. package/dist/geometryAdministrationPorts.js +1 -2
  51. package/dist/geometryApiBinding.js +1 -2
  52. package/dist/geometryAppStorage.js +1 -2
  53. package/dist/geometryArtifacts.js +1 -2
  54. package/dist/geometryAssetBundle.js +1 -2
  55. package/dist/geometryAssetClient.js +1 -2
  56. package/dist/geometryAssetData.js +1 -2
  57. package/dist/geometryAssetHttp.js +1 -2
  58. package/dist/geometryAssetPorts.js +1 -2
  59. package/dist/geometryAssetRpc.js +1 -2
  60. package/dist/geometryAssetRpcRoutes.js +1 -2
  61. package/dist/geometryAssetStorageGrant.js +1 -2
  62. package/dist/geometryBoxOverlap.js +1 -2
  63. package/dist/geometryCatalogueDigest.js +1 -2
  64. package/dist/geometryCellCoverage.js +1 -2
  65. package/dist/geometryCellLoader.js +1 -2
  66. package/dist/geometryChannel.js +1 -2
  67. package/dist/geometryChunkHttp.js +1 -2
  68. package/dist/geometryChunkLeases.js +1 -2
  69. package/dist/geometryClient.js +1 -2
  70. package/dist/geometryClientChunks.js +1 -2
  71. package/dist/geometryClientDelta.js +1 -2
  72. package/dist/geometryClientHttp.js +1 -2
  73. package/dist/geometryClientInterest.js +1 -2
  74. package/dist/geometryClientStatic.js +1 -2
  75. package/dist/geometryCms.js +1 -2
  76. package/dist/geometryCommitCoordinator.js +1 -2
  77. package/dist/geometryCompactionFixture.js +1 -2
  78. package/dist/geometryCompactionStrategies.js +1 -2
  79. package/dist/geometryConnectionClient.js +1 -2
  80. package/dist/geometryDerivationFixtures.js +1 -2
  81. package/dist/geometryDerivationStrategies.js +1 -2
  82. package/dist/geometryDigest.js +1 -2
  83. package/dist/geometryEditChannel.js +1 -2
  84. package/dist/geometryEditIngress.js +1 -2
  85. package/dist/geometryEdits.js +1 -2
  86. package/dist/geometryEnvelope.js +1 -2
  87. package/dist/geometryGridRaycast.js +1 -2
  88. package/dist/geometryGridSweep.js +1 -2
  89. package/dist/geometryHeightfield.js +1 -2
  90. package/dist/geometryHeightfieldRaycast.js +1 -2
  91. package/dist/geometryHeightfieldSweep.js +1 -2
  92. package/dist/geometryHeightfieldVolume.js +1 -2
  93. package/dist/geometryHost.js +2 -3
  94. package/dist/geometryHostDirectory.js +1 -2
  95. package/dist/geometryHostMutations.js +1 -2
  96. package/dist/geometryHostStreams.js +1 -2
  97. package/dist/geometryHttpBody.js +1 -2
  98. package/dist/geometryHttpRoutes.js +1 -2
  99. package/dist/geometryImportGltf.js +1 -2
  100. package/dist/geometryImportLdtk.js +1 -2
  101. package/dist/geometryImportPng.js +1 -2
  102. package/dist/geometryImportPublication.js +1 -2
  103. package/dist/geometryImportTiled.js +1 -2
  104. package/dist/geometryImportTiles.js +1 -2
  105. package/dist/geometryImportVox.js +1 -2
  106. package/dist/geometryImportedSource.js +1 -2
  107. package/dist/geometryInspectEndpoint.js +1 -2
  108. package/dist/geometryInspection.js +1 -2
  109. package/dist/geometryInstall.js +1 -2
  110. package/dist/geometryJournalArchiveData.js +1 -2
  111. package/dist/geometryJournalArchiveIndex.js +2 -3
  112. package/dist/geometryJournalArchiveTable.js +1 -2
  113. package/dist/geometryJournalCompaction.js +1 -2
  114. package/dist/geometryJournalPatch.js +1 -2
  115. package/dist/geometryJournalRetention.js +1 -2
  116. package/dist/geometryJournalRetentionSchemas.js +1 -2
  117. package/dist/geometryJournalRetentionSweep.js +1 -2
  118. package/dist/geometryJournalRetentionWorkflow.js +1 -2
  119. package/dist/geometryJournalRetentionWorkflowData.js +1 -2
  120. package/dist/geometryJournalStorage.js +1 -2
  121. package/dist/geometryLoader.js +1 -2
  122. package/dist/geometryManifest.js +1 -2
  123. package/dist/geometryManifestChannel.js +1 -2
  124. package/dist/geometryManifestClient.js +1 -2
  125. package/dist/geometryManifestData.js +1 -2
  126. package/dist/geometryManifestPorts.js +1 -2
  127. package/dist/geometryManifestPublication.js +1 -2
  128. package/dist/geometryManifestSource.js +1 -2
  129. package/dist/geometryMigrationJournal.js +1 -2
  130. package/dist/geometryMigrationStrategies.js +1 -2
  131. package/dist/geometryMigrations.js +1 -2
  132. package/dist/geometryNativeMetadata.js +1 -2
  133. package/dist/geometryPatch.js +1 -2
  134. package/dist/geometryPersistence.js +1 -2
  135. package/dist/geometryPersistenceCapture.js +1 -2
  136. package/dist/geometryPersistenceData.js +1 -2
  137. package/dist/geometryPersistencePorts.js +1 -2
  138. package/dist/geometryPlayerAdmission.js +1 -2
  139. package/dist/geometryPlayerEditOwner.js +1 -2
  140. package/dist/geometryPlayerEdits.js +1 -2
  141. package/dist/geometryPrepared.js +1 -2
  142. package/dist/geometryPrivacyFence.js +1 -2
  143. package/dist/geometryProceduralPublication.js +1 -2
  144. package/dist/geometryProceduralWorker.js +1 -2
  145. package/dist/geometryPublication.js +1 -2
  146. package/dist/geometryRayAlgebra.js +1 -2
  147. package/dist/geometryReadClient.js +1 -2
  148. package/dist/geometryReadPorts.js +1 -2
  149. package/dist/geometryReadRpc.js +1 -2
  150. package/dist/geometryReadRpcRoutes.js +1 -2
  151. package/dist/geometryReliablePublication.js +1 -2
  152. package/dist/geometryReloadPorts.js +1 -2
  153. package/dist/geometryReloadSource.js +1 -2
  154. package/dist/geometryRenderCache.js +1 -2
  155. package/dist/geometryRenderLod.js +1 -2
  156. package/dist/geometryRollback.js +1 -2
  157. package/dist/geometryRollbackCoordinator.js +2 -3
  158. package/dist/geometryRollbackPorts.js +1 -2
  159. package/dist/geometryRollbackSource.js +1 -2
  160. package/dist/geometryRollbackStore.js +1 -2
  161. package/dist/geometrySchemas.js +1 -2
  162. package/dist/geometryShapeRaycast.js +1 -2
  163. package/dist/geometryShapeSegments.js +1 -2
  164. package/dist/geometryShapes.js +1 -2
  165. package/dist/geometrySnapshot.js +1 -2
  166. package/dist/geometrySnapshotChannel.js +1 -2
  167. package/dist/geometrySnapshotClient.js +1 -2
  168. package/dist/geometrySnapshotPreparation.js +1 -2
  169. package/dist/geometrySnapshotServer.js +1 -2
  170. package/dist/geometrySqlOwner.js +1 -2
  171. package/dist/geometryStorage.js +1 -2
  172. package/dist/geometryStorageGrant.js +1 -2
  173. package/dist/geometryStorageIdentity.js +1 -2
  174. package/dist/geometryTileArtifact.js +1 -2
  175. package/dist/geometryTileCodec.js +1 -2
  176. package/dist/geometryTileCollision.js +1 -2
  177. package/dist/geometryTileNavigation.js +1 -2
  178. package/dist/geometryTileView.js +1 -2
  179. package/dist/geometryVersionActivation.js +1 -2
  180. package/dist/geometryVersionClient.js +1 -2
  181. package/dist/geometryVersionCompare.js +1 -2
  182. package/dist/geometryVersionMigration.js +1 -2
  183. package/dist/geometryVoxel.js +1 -2
  184. package/dist/geometryWorldEntitySubject.js +1 -2
  185. package/dist/geometryWorldExtent.js +1 -2
  186. package/dist/geometryWorldMetadata.js +1 -2
  187. package/dist/geometryWorldStrategyFixtures.js +1 -2
  188. package/dist/geometryWorldView.js +1 -2
  189. package/dist/host.js +1 -2
  190. package/dist/hostBinding.js +1 -2
  191. package/dist/hostCellObservation.js +1 -2
  192. package/dist/hostClientCapacity.js +1 -2
  193. package/dist/hostCommandScope.js +1 -2
  194. package/dist/hostController.js +2 -3
  195. package/dist/hostDeployment.js +1 -2
  196. package/dist/hostDrain.js +1 -2
  197. package/dist/hostDrainPorts.js +1 -2
  198. package/dist/hostDriver.js +1 -2
  199. package/dist/hostLane.js +1 -2
  200. package/dist/hostListener.js +1 -2
  201. package/dist/hostListenerBinding.js +1 -2
  202. package/dist/hostLoopObservation.js +1 -2
  203. package/dist/hostMetrics.js +1 -2
  204. package/dist/hostRegistryBinding.js +1 -2
  205. package/dist/hostSelection.js +1 -2
  206. package/dist/hostShutdown.js +1 -2
  207. package/dist/hostTurnObservation.js +1 -2
  208. package/dist/identities.js +1 -2
  209. package/dist/index.js +1 -2
  210. package/dist/inputReceipts.js +1 -2
  211. package/dist/inputRedundancy.js +1 -2
  212. package/dist/inspect.js +1 -2
  213. package/dist/lockstep.js +1 -2
  214. package/dist/lockstepAdmission.js +1 -2
  215. package/dist/lockstepAdmissionCodec.js +1 -2
  216. package/dist/lockstepAdmissionPorts.js +1 -2
  217. package/dist/lockstepClientSession.js +1 -2
  218. package/dist/lockstepDefinition.js +1 -2
  219. package/dist/lockstepHostLoop.js +1 -2
  220. package/dist/lockstepInitialAdmission.js +1 -2
  221. package/dist/lockstepInitialStrategyFixtures.js +1 -2
  222. package/dist/lockstepJournal.js +1 -2
  223. package/dist/lockstepJournalCodec.js +1 -2
  224. package/dist/lockstepJournalPorts.js +1 -2
  225. package/dist/lockstepJournalRebuild.js +1 -2
  226. package/dist/lockstepJournalRows.js +1 -2
  227. package/dist/lockstepMembers.js +1 -2
  228. package/dist/lockstepMessages.js +1 -2
  229. package/dist/lockstepOwnedRoom.js +1 -2
  230. package/dist/lockstepPolicies.js +1 -2
  231. package/dist/lockstepReact.js +1 -2
  232. package/dist/lockstepRecoveryTruth.js +1 -2
  233. package/dist/lockstepRosterConfig.js +1 -2
  234. package/dist/lockstepSeed.js +1 -2
  235. package/dist/lockstepSeedFixture.js +1 -2
  236. package/dist/lockstepServer.js +1 -2
  237. package/dist/lockstepServerConfig.js +1 -2
  238. package/dist/lockstepServerRoles.js +1 -2
  239. package/dist/lockstepServerStrategyFixtures.js +1 -2
  240. package/dist/lockstepStrategies.js +1 -2
  241. package/dist/lockstepStrategyFixtures.js +1 -2
  242. package/dist/lockstepTerminal.js +1 -2
  243. package/dist/lockstepTerminalPorts.js +1 -2
  244. package/dist/lockstepTransport.js +1 -2
  245. package/dist/lockstepTransportConfig.js +1 -2
  246. package/dist/lockstepWireRoster.js +1 -2
  247. package/dist/matchRoomProvider.js +1 -2
  248. package/dist/matchRooms.js +1 -2
  249. package/dist/membershipObserver.js +1 -2
  250. package/dist/moderation.js +1 -2
  251. package/dist/movementSpecials.js +1 -2
  252. package/dist/ownership.js +1 -2
  253. package/dist/ownershipWithdrawal.js +1 -2
  254. package/dist/pcg32.js +1 -2
  255. package/dist/ports.js +1 -2
  256. package/dist/quaternion.js +2 -3
  257. package/dist/react.js +1 -2
  258. package/dist/reaper.js +1 -2
  259. package/dist/reaperSchemas.js +1 -2
  260. package/dist/reaperWorkflow.js +1 -2
  261. package/dist/recovery.js +1 -2
  262. package/dist/recoverySeats.js +1 -2
  263. package/dist/replay.js +8 -9
  264. package/dist/replayPorts.js +1 -2
  265. package/dist/replayRecording.js +2 -3
  266. package/dist/replaySchema.js +1 -2
  267. package/dist/replayStorage.js +1 -2
  268. package/dist/reservationBatch.js +1 -2
  269. package/dist/reservationSchemas.js +1 -2
  270. package/dist/reservations.js +1 -2
  271. package/dist/reservePort.js +1 -2
  272. package/dist/resolvedOptions.js +1 -2
  273. package/dist/room.js +1 -2
  274. package/dist/roomAccessSweep.js +1 -2
  275. package/dist/roomAppCommandControl.js +1 -2
  276. package/dist/roomAuthoringStrategy.js +1 -2
  277. package/dist/roomErasure.js +1 -2
  278. package/dist/roomPoolRuntimeDefaults.js +1 -2
  279. package/dist/roomPoolSelection.js +1 -2
  280. package/dist/roomPoolTopology.js +1 -2
  281. package/dist/rpc.js +1 -2
  282. package/dist/rpcClient.js +1 -2
  283. package/dist/rpcRoutes.js +1 -2
  284. package/dist/runtime.js +2 -3
  285. package/dist/schemaHistory.js +1 -2
  286. package/dist/seatStore.js +1 -2
  287. package/dist/seatStrategyFixtures.js +1 -2
  288. package/dist/seatSubject.js +1 -2
  289. package/dist/seats.js +1 -2
  290. package/dist/serverSession.js +1 -2
  291. package/dist/serverSessionConfig.js +1 -2
  292. package/dist/sessionAdmission.js +1 -2
  293. package/dist/sidecarAdmission.js +1 -2
  294. package/dist/sidecarConfig.js +2 -3
  295. package/dist/sidecarConfigPublication.js +1 -2
  296. package/dist/sidecarHostListener.js +1 -2
  297. package/dist/sidecarIpc.js +1 -2
  298. package/dist/sidecarPeer.js +1 -2
  299. package/dist/sidecarProcessPort.js +1 -2
  300. package/dist/sidecarRuntime.js +1 -2
  301. package/dist/sidecarSelection.js +1 -2
  302. package/dist/sidecarWire.js +4 -5
  303. package/dist/sidecarWrites.js +1 -2
  304. package/dist/simulation.js +1 -2
  305. package/dist/simulationAuthoring.js +1 -2
  306. package/dist/simulationBytes.js +1 -2
  307. package/dist/simulationConformance.js +1 -2
  308. package/dist/simulationInputHistoryCapture.js +1 -2
  309. package/dist/simulationInputHistoryWire.js +1 -2
  310. package/dist/simulationOptionsWire.js +1 -2
  311. package/dist/simulationRecoveryWire.js +1 -2
  312. package/dist/simulationReplay.js +1 -2
  313. package/dist/simulationSnapshotWire.js +1 -2
  314. package/dist/simulationState.js +1 -2
  315. package/dist/snapshotBlob.js +2 -3
  316. package/dist/snapshotBlobCleanup.js +1 -2
  317. package/dist/snapshotBlobIndex.js +1 -2
  318. package/dist/snapshotBudget.js +1 -2
  319. package/dist/snapshotChain.js +1 -2
  320. package/dist/snapshotErasure.js +1 -2
  321. package/dist/snapshotInspection.js +1 -2
  322. package/dist/snapshotSegmentBlobs.js +1 -2
  323. package/dist/snapshotUploads.js +1 -2
  324. package/dist/socketTransport.js +1 -2
  325. package/dist/spatial.js +2 -3
  326. package/dist/spectatorPolicy.js +3 -4
  327. package/dist/spectatorProducer.js +2 -3
  328. package/dist/startFailureCause.js +1 -2
  329. package/dist/stateCodec.js +2 -3
  330. package/dist/strategyFixtures.js +1 -2
  331. package/dist/streamFraming.js +1 -2
  332. package/dist/streamTransport.js +1 -2
  333. package/dist/subjectAdmission.js +1 -2
  334. package/dist/subjectPrivacy.js +1 -2
  335. package/dist/subjectPrivacyBinding.js +1 -2
  336. package/dist/systemManifest.js +1 -2
  337. package/dist/tables.js +1 -2
  338. package/dist/testHarness.js +1 -2
  339. package/dist/testing.js +1 -2
  340. package/dist/testingPorts.js +1 -2
  341. package/dist/transform.js +4 -5
  342. package/dist/transform3d.js +1 -2
  343. package/dist/transformCollection.js +1 -2
  344. package/dist/transformCollection3d.js +1 -2
  345. package/dist/transformCollectionCore.js +2 -3
  346. package/dist/transformFrames.js +1 -2
  347. package/dist/transformPrediction3d.js +2 -3
  348. package/dist/transformRules.js +1 -2
  349. package/dist/transformSchemas.js +1 -2
  350. package/dist/transport.js +1 -2
  351. package/dist/transportAuthoring.js +1 -2
  352. package/dist/transportCleanup.js +1 -2
  353. package/dist/transportConformance.js +1 -2
  354. package/dist/transportConnector.js +1 -2
  355. package/dist/transportEndpoints.js +1 -2
  356. package/dist/viewProjection.js +1 -2
  357. package/dist/web.js +1 -2
  358. package/dist/webTransportClient.js +1 -2
  359. package/dist/wire.js +4 -5
  360. package/dist/withdrawalPort.js +1 -2
  361. package/dist/world.js +8 -9
  362. package/dist/worldActorReceipts.js +1 -2
  363. package/dist/worldActorTransferSnapshot.js +1 -2
  364. package/dist/worldAdmissionPending.js +1 -2
  365. package/dist/worldBoundaryCoordinator.js +1 -2
  366. package/dist/worldCatalog.js +3 -4
  367. package/dist/worldCellAllocation.js +2 -3
  368. package/dist/worldCellDestination.js +1 -2
  369. package/dist/worldCells.js +5 -6
  370. package/dist/worldChange.js +4 -5
  371. package/dist/worldClient.js +1 -2
  372. package/dist/worldClientControl.js +6 -7
  373. package/dist/worldClientPendingInput.js +1 -2
  374. package/dist/worldClientRpc.js +1 -2
  375. package/dist/worldClientRpcRoutes.js +1 -2
  376. package/dist/worldClientSchemas.js +1 -2
  377. package/dist/worldCommands.js +5 -6
  378. package/dist/worldData.js +3 -4
  379. package/dist/worldDefaultBinding.js +1 -2
  380. package/dist/worldDefaultGroupAdmission.js +1 -2
  381. package/dist/worldDefaultGroupAppServices.js +1 -2
  382. package/dist/worldDefaultGroupCompensation.js +1 -2
  383. package/dist/worldDefaultGroupContinuation.js +1 -2
  384. package/dist/worldDefaultGroupControl.js +1 -2
  385. package/dist/worldDefaultGroupMembers.js +1 -2
  386. package/dist/worldDefaultGroups.js +1 -2
  387. package/dist/worldDefaultPending.js +1 -2
  388. package/dist/worldDefaultService.js +1 -2
  389. package/dist/worldEntities.js +49 -50
  390. package/dist/worldEntityCodec.js +1 -2
  391. package/dist/worldEntityHandoffView.js +1 -2
  392. package/dist/worldGeometry.js +1 -2
  393. package/dist/worldGhostAdmission.js +1 -2
  394. package/dist/worldGhostDestination.js +3 -4
  395. package/dist/worldGhostGateway.js +1 -2
  396. package/dist/worldGhostHandshake.js +1 -2
  397. package/dist/worldGhostHost.js +1 -2
  398. package/dist/worldGhostIngress.js +1 -2
  399. package/dist/worldGhostNeighborhood.js +1 -2
  400. package/dist/worldGhostNeighbors.js +1 -2
  401. package/dist/worldGhostOutbound.js +1 -2
  402. package/dist/worldGhostPublisher.js +1 -2
  403. package/dist/worldGhostReceiver.js +1 -2
  404. package/dist/worldGhostSender.js +1 -2
  405. package/dist/worldGhostSocket.js +1 -2
  406. package/dist/worldGhostWire.js +3 -4
  407. package/dist/worldGroupCommand.js +1 -2
  408. package/dist/worldGroupDeadline.js +1 -2
  409. package/dist/worldGroupPreparation.js +1 -2
  410. package/dist/worldGroupReadyControl.js +8 -9
  411. package/dist/worldGroupSupervisor.js +3 -4
  412. package/dist/worldHandoffMetrics.js +1 -2
  413. package/dist/worldHandoffView.js +1 -2
  414. package/dist/worldHostSource.js +5 -6
  415. package/dist/worldInspectEndpoint.js +1 -2
  416. package/dist/worldInspection.js +1 -2
  417. package/dist/worldInstanceAdmission.js +1 -2
  418. package/dist/worldInstanceAllocation.js +1 -2
  419. package/dist/worldInstanceDestination.js +1 -2
  420. package/dist/worldInstanceExpiry.js +1 -2
  421. package/dist/worldInstanceExpirySupervisor.js +1 -2
  422. package/dist/worldInstanceLifecycle.js +1 -2
  423. package/dist/worldInstanceState.js +1 -2
  424. package/dist/worldInstances.js +1 -2
  425. package/dist/worldJoin.js +1 -2
  426. package/dist/worldLayers.js +6 -7
  427. package/dist/worldLeases.js +5 -6
  428. package/dist/worldManifest.js +1 -2
  429. package/dist/worldMovement.js +1 -2
  430. package/dist/worldPersistence.js +4 -5
  431. package/dist/worldProjection.js +6 -7
  432. package/dist/worldReact.js +1 -2
  433. package/dist/worldRecoveryActor.js +1 -2
  434. package/dist/worldReturnAnchor.js +1 -2
  435. package/dist/worldRoomHooks.js +5 -6
  436. package/dist/worldRoomPool.js +2 -3
  437. package/dist/worldRoomSteps.js +1 -2
  438. package/dist/worldSeatBinding.js +1 -2
  439. package/dist/worldSourceSeatPending.js +1 -2
  440. package/dist/worldStrategyFixtures.js +1 -2
  441. package/dist/worldTesting.js +1 -2
  442. package/dist/worldTransitionDefaults.js +1 -2
  443. package/dist/worldTransitionExecutor.js +9 -10
  444. package/dist/worldTransitionGroup.js +1 -2
  445. package/dist/worldTransitionPhysicalSteps.js +1 -2
  446. package/dist/worldTransitionResolver.js +8 -9
  447. package/dist/worldTransitionSeatGroup.js +1 -2
  448. package/dist/worldTransitionSeats.js +2 -3
  449. package/dist/worldTransitionState.js +1 -2
  450. package/dist/worldTransitions.js +8 -9
  451. package/package.json +10 -10
package/CHANGELOG.md CHANGED
@@ -41,6 +41,269 @@ _Changes staged for the next release accumulate here (rolled up from
41
41
 
42
42
  ---
43
43
 
44
+ ## [0.89.0] — 2026-11-05
45
+
46
+ ### ⚠ BREAKING
47
+
48
+ - **describeIfReachable moves to @voltro/testing/reachable** — `@voltro/testing`, `@voltro/cli`
49
+
50
+ The root of `@voltro/testing` imported `vitest` for `describeIfReachable` / `describeIfAvailable`. With two vitest snapshots in one lockfile (they can differ by nothing more than an optional peer of vite), every test that imported `@voltro/testing` loaded the second instance, and the app's own `expect(...).rejects.toThrow('…')` then reported `but got ''`. The root entry now imports no test runner. Migration: import `describeIfReachable` and `describeIfAvailable` from `@voltro/testing/reachable`; `voltro update` rewrites the imports. `isTcpReachable`, `ReachableTarget` and `reportEngineVersion` stay on the root.
51
+
52
+ ### Added
53
+
54
+ - **Retain exact historical CMS deployment receipts** — `@voltro/cms`
55
+
56
+ Record the original atomic deployment request and result with a signed receipt in its existing activation-history row. The private receipt endpoint can return that exact result after another activation, with the current epochs and whether it is still current. Missing legacy receipts remain unknown; reads never reconstruct history or activate output. Current-only confirmation and public serving admission remain unchanged.
57
+
58
+ Apply the additive nullable activation-history column before starting the updated publisher. Existing custom deployment services can omit the optional receipt port and keep their original routes; existing probe, confirmation and acknowledgement wire formats are unchanged.
59
+ - **Fence unresolved CMS output publication requests** — `@voltro/cms`
60
+
61
+ Native private publication fencing makes an original unresolved request ineligible for future commit and exact-current acknowledgement, while preserving the actual application, policy and activation history. An already-current result is returned unchanged. Fencing never proves an earlier commit did not occur.
62
+
63
+ Apply the normal nullable deployment-head schema plan for `app` and `renderPolicyDigest` before use. Never-bound namespaces gain only an unbound revision; they receive no fabricated application, build or serving authority. Upgrade readers and writers together before creating these heads, and regenerate private clients from the mounted descriptors. Custom services can omit the new port; their mounts expose no fence operation.
64
+ - **Inspect epochs against a retained CMS target** — `@voltro/cms`
65
+
66
+ Private output inspection accepts an optional target ID. Native services first verify that retained target in their fixed namespace before returning current epochs, without reopening source contracts, physical custody or publication. Existing empty-body inspection stays unchanged. The optional service port keeps custom implementations compatible; a custom mount without it refuses the new selector instead of falling back to unrelated epochs.
67
+ - **voltro doctor names two copies of @ai-sdk/provider** — `@voltro/cli`
68
+
69
+ Each `ai` and `@ai-sdk/*` release pins its `@ai-sdk/provider` exactly, and `@voltro/ai` resolves its provider packages by caret, so an app pinning an older `ai` could hold two copies and `tsc` reported `Type 'LanguageModelV4' is not assignable to type 'LanguageModel'`. `voltro doctor` (and `--json`, field `aiProviderSkew`) now lists every package with the provider version it loads when there is more than one, and names the alignment. Measured: `ai` 7.0.156 beside `@voltro/ai` 0.88.0 resolves 4.0.34 and 4.0.35; 7.0.162 resolves one.
70
+
71
+ ### Changed
72
+
73
+ - **The db pool boot line names the connection the workflow runner holds** — `@voltro/cli`
74
+
75
+ With SQL runner storage on postgres or mysql/mariadb, the workflow runner holds one pool connection for its shard-lock session for the life of the process. The `db pool:` line said `max=5` while the app was served by 4. It now adds `1 of the 5 pooled connections is held for the life of the process (the workflow runner's shard-lock session), so 4 serve the app` after the fleet arithmetic, which is unchanged.
76
+
77
+ ### Fixed
78
+
79
+ - **voltro add patches removes the patch files of the version left** — `@voltro/cli`
80
+
81
+ Retiring a `patchedDependencies` entry for an earlier Effect version left its file in `patches/`, and a leftover is not inert: patch-package (npm, or a root `postinstall` beside pnpm) applies every file there and reports it as unrecognised. `voltro add patches` now removes the framework's own patch files for another version of the same major once nothing references them, in each package manager's naming. A file still named in `pnpm-workspace.yaml` or `package.json`, a patch for another Effect major and a file of your own naming stay.
82
+ - **voltro agents-md --force keeps symlinks and app guides it never wrote** — `@voltro/cli`
83
+
84
+ A forced refresh followed a symlinked app guide (`apps/api/CLAUDE.md` → `../../AGENTS.md`) and replaced the repo-root core guide it had just refreshed, and on flat layouts it replaced hand-written app `CLAUDE.md` files that carried no keep marker. A symbolic link is now never written through, and a nested guide that does not start with the heading the command seeds (`# api — agent notes`, `# web — agent notes`, `# database — agent notes`) is reported as protected instead of overwritten.
85
+ - **Keep known CMS rollback independent of expired build snapshots** — `@voltro/cms`
86
+
87
+ Roll back a previously activated complete native output using its retained contracts after the private build snapshot expires. Preserve current publisher, region, graph, rights, policy and CAS checks; expired unactivated targets and new forward activation still refuse.
88
+
89
+ The deployment-reader callback gains an optional third mode argument. Existing two-argument readers remain assignable and existing calls remain valid; the returned contract is unchanged.
90
+ - **Keep visible movement labels in accessible names** — `@voltro/cms`
91
+
92
+ CMS movement controls keep the complete visible action together in their contextual accessible names, so speech input can find them by the words shown. Localized controls retain their explicit label callbacks.
93
+ - **Reject Git deletion markers in CMS rollback previews** — `@voltro/cli`
94
+
95
+ Reject the all-zero Git deletion marker before a CMS rollback is queued. The CLI now matches the API's existing commit validation while preserving image rollback previews.
96
+ - **voltro update reviews many test files without running out of memory** — `@voltro/cli`
97
+
98
+ The syntax reviews `voltro update` prints parsed every matching file with its own copy of the TypeScript standard library, so a workspace with a few hundred test files importing `@voltro/testing` exhausted Node's default heap in the request-harness review (`JavaScript heap out of memory`, exit 134), including under `--codemods-only --dry-run`. The reviews read local bindings and imports only and now load no standard library: the same tree completes in seconds with about 140 MB and lists the same call sites.
99
+ - **voltro update --codemods-only names dependencies below the framework's peers** — `@voltro/cli`
100
+
101
+ `--codemods-only` promises not to edit dependencies, so it skipped peer alignment without a word — on the recovery path after a `--no-install` update, an app's own dependency below a framework peer (a direct `ioredis ^5` against `@voltro/kv`'s optional `ioredis ^6.0.0`) surfaced only in `pnpm peers check`. It now prints each one under `Peer review` with its manifest and the framework package requiring it, and still changes nothing.
102
+ - **Scaffolds show the object cache form; comments no longer stop voltro add redis** — `@voltro/cli`
103
+
104
+ The api templates still showed the refused scalar form in commented-out examples (`// cache: 'redis' as const`, `// kv: 'redis' as const`) and in two explanations; they now show `{ backend: 'redis' as const }`. `voltro add redis` treated a `cache:` that appeared only in a comment as an existing declaration and declared nothing, which is every config scaffolded from the api template; it now reads declarations only. The upgrade lists commented-out scalar examples in code so they can be rewritten before someone uncomments one.
105
+ - **voltro dev waits for the api's own drain deadline before SIGKILL** — `@voltro/cli`
106
+
107
+ On a restart the dev supervisor sent SIGKILL 1.5 seconds after SIGTERM. The api child bounds its own drain by `VOLTRO_SHUTDOWN_GRACE_MS` (10 seconds by default), and an app with workflows legitimately takes longer than 1.5 seconds against a remote or pooled database: its runner hands every shard back, two round trips per shard. Such restarts logged `child ignored SIGTERM — escalated to SIGKILL` every time, and the teardown after the cut (CDC detach, trace flush, the startups' `onShutdown`, pool close) never ran. The child now reports its deadline to the supervisor, which waits one second past it. The child logs `drained in …ms`, or `drain deadline exceeded` when it does not finish.
108
+ - **A lazy boundary still loading after hydration keeps its server HTML** — `@voltro/web`
109
+
110
+ A server-rendered page whose layout code-splits part of itself behind `lazy()` + `<Suspense>` blanked once on every first load and mounted that part afresh: its iframes reloaded, inputs and scroll positions inside it started over. Hydration keeps such a boundary's server HTML while its chunk loads, but the framework's own work right after hydration — adopting the server's loader data, mounting the route announcer and the development chrome, the API runtime arriving or changing its version — re-rendered the page as an urgent update, and React discards the server HTML of a boundary an urgent update reaches. That work now runs as transitions, which wait for the boundary. The route announcer also no longer speaks on the first load (it did when the route meta settled after hydration, and in development on StrictMode's second effect run); it announces navigations only, as documented.
111
+ - **Pages and layouts with a loader never render without their data** — `@voltro/web`
112
+
113
+ `useLoaderData()` promises a page that declares a `loader` its result, yet a first load without server data rendered the page once with `undefined` before the loader settled: a client-rendered app, a `renderMode: 'spa'` page with its own loader under a server-rendered layout (it received the server's placeholder), a second `<Router>` in the same process (component tests) and, behind a `Pending` skeleton swap, a layout with a loader that differs from the previous route's. A page reading `data.title` threw into its error boundary, and that boundary stayed up after the data arrived because the pathname had not changed. The router now renders a page or layout only with its own loader result; until then the route's `Pending` skeleton stands in for it and everything inside it, or nothing when the route has none. Hydration of server-rendered pages is unchanged. A page that drew its own loading state from an absent value never sees one now: export `Pending` (or `loading.tsx`) for that.
114
+ - **Avoid duplicate reads when reopening application archives** — `@voltro/cli`
115
+
116
+ Reopening a retained application reuses the complete inventory verified during that call when checking its exact directory contents. Every new open still rehashes all retained source, executable and web bytes and rejects corruption, symlinks and extra files.
117
+ - **Reduce allocation while verifying retained runtime bytes** — `@voltro/cli`
118
+
119
+ Verify the complete Node executable before and after retained execution with one bounded reusable read buffer. Keep the fresh byte hash, no-follow file admission and 256-MiB limit; no runtime pin is cached between calls.
120
+ - **A replica that loses a schedule claim no longer counts a failed insert** — `@voltro/runtime`
121
+
122
+ Replicas that share schedules decide each firing with a claim row. The losing replica found out through a failing INSERT (the primary-key conflict), so every lost race raised `voltro_db_errors_total{op="insert"}` with no log line naming it, and the database logged a duplicate-key error for it. The claim is now an insert that is ignored on conflict. The winner is decided exactly as before; a lost race is no longer a statement failure.
123
+ - **voltro update re-keys the Effect patches for a release on a newer Effect** — `@voltro/cli`
124
+
125
+ pnpm patch entries name an exact version, and pnpm refuses an install whose entry matches nothing. An update to a release on a newer Effect therefore failed its own install with `ERR_PNPM_UNUSED_PATCH` over the driver patch an earlier `voltro add patches` wrote, and the codemod naming the repair only runs after that install. `voltro update` now reads the Effect version the target's patches are keyed to, moves the lockstep overrides to it and retires the earlier CLI's patch entries before installing; afterwards the installed CLI writes the target's patches and the update installs once more. A failed first install restores `pnpm-workspace.yaml` byte for byte, a patch you created yourself keeps its key, and a custom Effect override stops the update before anything is written. `voltro add patches` also accepts the `4.1.0` overrides an earlier release wrote instead of refusing them as custom. An update started by a CLI without this repair still needs the manual order in the update documentation.
126
+ - **voltro update keeps the old release-age exclusion until the install is done** — `@voltro/cli`
127
+
128
+ `voltro update` moved each `minimumReleaseAgeExclude` entry from the release being left to the target before installing. pnpm checks the lockfile's existing entries against its release-age window too, so while the release being left was still inside the window — an update the day after a release — the install refused the lockfile with `ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION`, and the update's message suggested waiting for a registry instead. The entry being left now stays beside the target until the install has replaced the lockfile and is removed afterwards; the preview and the result say so. A failed install still restores the file byte for byte. When the refusal comes from pnpm's default window without exclusions, the message names the window and the two versions to exclude.
129
+ - **Preserve existing rules for generated web files** — `@voltro/cli`
130
+
131
+ Web generation recognizes rooted and unrooted rules for the `.framework` directory and leaves `.gitignore` unchanged when that directory is already covered.
132
+ - **A workflow finalizer observes the terminal exit once, not a success per replay** — `@voltro/cli`, `@voltro/workflow`
133
+
134
+ On Effect 4.1.0 a body that suspended and ran again registered its `addFinalizer` callback twice, and the superseded registration was called with `Exit.succeed(undefined)` whatever the outcome — after a failed or interrupted workflow too, so a finalizer that treats success as commit committed a failed run. The shipped Effect patch now skips finalizers of a run that suspended: the run that reaches the terminal state calls its finalizer once with the real exit; compensations still run once on failure. Run `voltro add patches` and install to pick up the refreshed patch.
135
+ - **A backlog of due workflows no longer takes the whole connection pool** — `@voltro/workflow`, `@voltro/cli`, `@voltro/database`, `@voltro/sql-postgres`, `@voltro/sql-mysql`, `@voltro/sql-mssql`
136
+
137
+ A runner that took over shards with many due executions resumed all of them at once, and their journal writes filled the pool the app shares. With a pool of 5, 1,000 due executions and a 20 ms round trip, a `SELECT 1` waited up to 9.8 s for a connection and the runner's storage sync timed out after 5 s. The engine now admits at most half of the connections the process does not hold for life to its journal at once (at least 1). In the same measurement the longest wait was 1.6 s, no timeout occurred, and the backlog took about 40 % longer to drain. A journal write made inside a SQL transaction is never held back, so the bound cannot deadlock against connections that transactions hold. The `db pool:` boot line states the bound. The postgres, mysql/mariadb and mssql adapters now register their effective pool size, including the driver default of 10 when `DB_MAX_CONNECTIONS` is unset.
138
+ - **Workflow journal rows written before Effect 4 no longer stall the runner** — `@voltro/workflow`
139
+
140
+ A database whose workflow journal holds rows from a release before 0.85.0 carries two shapes Effect 3 wrote and Effect 4's codecs refuse: a void result without its `value` key — every interrupt recorded then has it — and a failure cause as a tree. Effect 4 loads an execution's persisted interrupt whenever the execution activates, so a boot with such an interrupt and a pending message logged `Defect building entity handlers` every few seconds for that execution, its message never received a reply, and other workflows on the same runner did not finish meanwhile. Polling such a run failed on the cause tree, and restart tooling read it as an unrecognized reply. The engine now reads both shapes as their Effect 4 form on every dialect; rows are not rewritten, and rows written today are unchanged. A stray step message of a run that already ended is answered without running the step again.
141
+ - **voltro workflows run commands accept the execution id start prints** — `@voltro/cli`
142
+
143
+ `voltro workflows start` prints the run handle's execution id, and `discard` (like `show`, `retry`, `cancel`, `suspend`, `resume`, `signal` and `update`) answered "Workflow run target not found" for it; only the run id from `list` worked. An id that names a run's execution is now resolved to that run first.
144
+
145
+ ---
146
+
147
+ ## [0.88.0] — 2026-11-02
148
+
149
+ ### ⚠ BREAKING
150
+
151
+ - **Direct computed-cache key callers handle unencodable subjects** — `@voltro/runtime`, `@voltro/voltro`
152
+
153
+ `computedCacheKey()` can return `bypass: 'subject-not-encodable'` for claims that cannot safely identify a cache entry. Direct consumers with exhaustive bypass switches must handle this case by running without caching. `voltro update` identifies the direct imports to review. Queries using the native `cache:` declaration and `invoke()` tests need no manual key or code change.
154
+ - **The framework runs on effect 4.1.0** — `@voltro/cli`, `@voltro/devtools`, `@voltro/runtime`, `@voltro/database`, `@voltro/voltro`, `@voltro/sql-sqlite`, `@voltro/sql-mysql`, `@voltro/sql-mssql`, `@voltro/sql-postgres`
155
+
156
+ Every `@voltro/*` package now pins `effect` and its `@effect/*` companions to 4.1.0. Apps pin the same version and run `voltro add patches`: it writes the 4.1.0 patch files, retires the `patchedDependencies` entries an earlier CLI shipped for 4.0.1 (pnpm refuses an install over an unused patch) and moves the lockstep overrides. Two former patch fixes ship upstream in 4.1.0 (SQL Server request cancellation, the SQL Server message-storage MERGE). On SQL Server the shared transaction key now applies to every client in the process, not only the first one built.
157
+
158
+ `chunkRowsForInsert` from `@voltro/database` returns non-empty chunks (`NonEmptyReadonlyArray`), the shape effect 4.1's `sql.insert` requires; an empty input yields no chunk instead of one empty chunk.
159
+
160
+ SQL statement spans are named after their database, following the OpenTelemetry database conventions: the database name, else the server address, else the system name (`postgresql`, `mysql`, `microsoft.sql_server`, `sqlite`). Before, every statement span was `sql.execute`. Trace queries and dashboards that match that name should match the `db.query.text` attribute instead; the devtools trace panel and durable-trace sampling already do.
161
+
162
+ **`voltro update` carries you across this** — codemod `0.88.0/01_effect-4-1`. If you pin versions by hand and never run it, print the notes without changing anything: `voltro update --codemods-only --from <your current version> --dry-run` (this one ships in 0.88.0).
163
+ - **Runtime patch pins preserve third-party Effect majors** — `@voltro/cli`
164
+
165
+ `voltro add patches` scopes Effect pins to their current major instead of replacing unrelated libraries' Effect 3 dependencies. It migrates exact pins previously shipped by the framework, preserves unrelated policies, and refuses conflicting custom policies before writing files. In pnpm workspaces it names competing nonempty root `resolutions` or `pnpm.overrides` and explains their explicit reconciliation. Peer repair refuses cross-major global policy changes. Bun workspaces require Bun >=1.4.4 and a supported `packageManager` pin or `engines.bun` floor; upgrade the actual tool and older declarations before retrying, because Bun 1.2.0 ignored the scoped companion pin. `voltro update` carries the review as `0.88.0/06_effect-override-scope`.
166
+ - **Keep test runners out of production KV and workflow dependency closures** — `@voltro/kv`, `@voltro/workflow`
167
+
168
+ The test-only HotStore and workflow conformance suites now require their caller to supply runner operations. Pass `{ describe, it, expect }` as the third argument to `hotStoreConformance`, and `{ describe, test, expect, beforeAll, afterEach }` as the second argument to `runClusterEngineSuite` and `runJournalEncryptionSuite`. The exported structural runner interfaces have no dependency on Vitest. Both production packages remove their optional Vitest peer; an application's development runner can no longer enter a production deployment through those peer links. Keep Vitest in the test application's own devDependencies. Runtime KV/workflow calls and `runHotStoreSqlParity` are unchanged. `voltro update` identifies direct suite imports for review.
169
+ - **REST test handlers publish events under the request tenant** — `@voltro/testing`, `@voltro/cli`
170
+
171
+ When crossing 0.87.0, custom `makeTestApp({ restRoutes })` handlers receive a request-scoped `ctx.app` instead of the root fixture context. Event assertions must subscribe to that request tenant: the default anonymous request uses `acme` or `x-tenant`; an explicit `anonymous: 'no-tenant'` uses `''`, distinct from the event bus subscriber's default `null`. Pass the app's anonymous policy, select the subscriber tenant explicitly and assert delivered payloads even when HTTP success and `notified` already pass. Direct `invoke` retains its supplied context identity, and projected `publicApi` handlers already use request-scoped invocation. Plugin HTTP routes are not mounted by this request harness. `voltro update` locates raw request harness calls and prints the review steps.
172
+
173
+ ### Added
174
+
175
+ - **voltro add patches --ai accepts ai 7.0.156** — `@voltro/cli`, `@voltro/ai`
176
+
177
+ `voltro add patches --ai 7.0.156` wires the AI SDK declaration correction for `@ai-sdk/provider-utils` 5.0.70, regenerated with the original build from the release commit; JavaScript stays byte-identical to the published package. 7.0.105 and 7.0.132 remain selectable. `@voltro/ai` is built and tested against ai 7.0.156.
178
+ - **The retained invoice observations table is exported from the billing package** — `@voltro/plugin-billing`
179
+
180
+ `billingRetainedInvoiceObservationsTable` is exported from `@voltro/plugin-billing` beside the other billing tables, so an app can reference it.
181
+ - **plugin-billing accepts stripe 23** — `@voltro/plugin-billing`
182
+
183
+ The `stripe` peer range is `^22.6.1 || ^23.0.1`. stripe 23 pins Stripe API version `2026-09-30.endive`; the plugin still sends no `apiVersion` of its own, so the SDK's pinned version applies.
184
+
185
+ ### Changed
186
+
187
+ - **A booting server holds requests until the app is ready instead of answering 503** — `@voltro/runtime`, `@voltro/voltro`
188
+
189
+ `voltro serve`, `voltro start` and `voltro dev` used to answer every request that arrived before the boot finished with a plain-text `503 starting`. On a platform that scales to zero, that request is the visitor who woke the instance, and a browser does not act on `Retry-After` for a navigation. Requests and WebSocket upgrades that arrive while the app boots now wait and are handed to the app in arrival order once it is ready. The wait is bounded by `VOLTRO_BOOT_HOLD_MS` (default `30000`, at most five minutes, `0` restores the immediate `503`) and by 512 waiting requests. A request the wait cannot cover still gets `503` with `Retry-After: 1`, and a browser navigation gets a minimal page that reloads itself. `/internal/startup` reports waiting requests as `held`, and `bindBootListener` accepts `holdMs` and `maxHeld`. Probes are unchanged, so nothing changes under Kubernetes.
190
+ - **DocsLayout navigation nests collapsible groups with page counts** — `@voltro/ui-shadcn`
191
+
192
+ `DocsLayout` renders its sidebar as one tree: headerless groups are flat start links, other groups and sub-groups are collapsible rows with page counts, `DocsNavSubGroup` accepts nested `subgroups` and `trailingEntries`, the current page's link carries `aria-current="page"` (forwarded through `ShellLinkProps`), and the rail scrolls the active link into view after navigation.
193
+ - **Native Redis connections use ioredis 6 and keep the RESP2 protocol** — `@voltro/kv`, `@voltro/runtime`, `@voltro/cli`
194
+
195
+ The native Redis transport moved to ioredis 6, which defaults to RESP3. Registry connections set `protocol: 2`, so command replies, Pub/Sub and Lua results keep their shapes.
196
+ - **Connection drivers install only with the server runtime** — `@voltro/kv`, `@voltro/runtime`
197
+
198
+ `ioredis`, `@upstash/redis` and `@nats-io/transport-node` are optional peers of `@voltro/kv` and dependencies of `@voltro/runtime`. API apps keep all three without a step; web apps and SDKs that reach `@voltro/kv` only through types no longer download server drivers. Code that opens a connection without `@voltro/runtime` adds its driver, and a missing driver now fails naming the package.
199
+ - **The mobile template targets Expo SDK 58** — `@voltro/cli`
200
+
201
+ New mobile apps scaffold on Expo SDK 58 with React Native 0.88.1 and React 19.3.0, using the versions SDK 58 bundles for its native modules.
202
+ - **plugin-sentry runs on Sentry 11 and exports server spans over OTLP** — `@voltro/plugin-sentry`
203
+
204
+ Sentry 11 removed `SentrySpanProcessor`. The plugin now exports the framework's spans to the OTLP endpoint Sentry derives from the DSN and links errors and logs to the active span with `openTelemetryIntegration()`; the Sentry SDK records no spans of its own. `tracesSampleRate` keeps its meaning and is applied per trace id at the export. Server traces need the optional `@opentelemetry/sdk-trace-base` and `@opentelemetry/exporter-trace-otlp-http` packages (they replace `@sentry/opentelemetry`); without them the plugin warns and reports errors and breadcrumbs only. `init.tracesSampleRate` and `init.enableOpenTelemetrySetup` are ignored, and `init.skipOpenTelemetrySetup` no longer exists in Sentry 11.
205
+
206
+ ### Fixed
207
+
208
+ - **Deferred workflow starts retain their original caller receipt** — `@voltro/workflow`, `@voltro/cli`
209
+
210
+ A controlled workflow start now returns its existing queued receipt when another replica exhausts submission retries, or shared capacity moves, before its acceptance callback dispatches. It no longer reports an ordinary start failure while the committed submission remains unresolved. Execution identity, caller input, capacity ownership and retry limits stay unchanged; definite rejection and invalid ownership still fail explicitly.
211
+
212
+ - **Aggregate counters are non-negative safe integers on every dialect** — `@voltro/database`
213
+
214
+ A `count()` / `countDistinct()` / ranking counter now decodes to a number only when it is a non-negative safe integer; a fractional, negative, non-numeric or larger value is refused instead of passed through or rounded. SQLite and Turso decode counters too when the queried table has decimal columns, where they used to stay strings.
215
+ - **Cache clear honors connection namespace prefixes** — `@voltro/kv`, `@voltro/cache`
216
+
217
+ Clearing a cache through a named, namespaced Redis connection now binds logical cache keys to that connection's physical namespace. Redis-family engines and the local transport preserve neighboring caches and invalidation fences, while refusing foreign prefixes and forged key sets. The existing atomic cache command format remains unchanged.
218
+ - **Cache commands use the selected app's configuration and connections** — `@voltro/cli`
219
+
220
+ `voltro cache status`, `flush` and `invalidate` resolve `app.config.ts`, environment overrides and named Redis connections exactly like Dev and Serve, including an optional target app directory. Invalid configuration fails instead of silently reporting memory, in-process transports refuse CLI mutation, and diagnostics omit endpoint URLs and credentials.
221
+ - **Generated cache examples boot and upgrade reviews name affected lines** — `@voltro/cli`
222
+
223
+ The seeded core API example now uses an object cache declaration. Forced guide refresh discovers both flat and project-grouped app layouts, replacing stale nested examples without executing configs or crossing an app boundary. The shared cache/KV migration review lists authored code locations, including asserted backend literals, and a new review reaches applications that already crossed the original migration. It also identifies stale core guides for refresh; protected hand-maintained guides stay under their owner's control.
224
+ - **Subject query caches follow current authority** — `@voltro/runtime`, `@voltro/testing`
225
+
226
+ Subject-scoped computed queries key the complete subject claims and raw and resolved permission sets. Removing an admin grant, changing roles or switching tenant or credential type cannot reuse a result admitted under earlier authority. Authentication refreshes before lookup, and a change while a read is pending refuses retention and delivery. Connection-local state is never covered by subject scope; handlers that read it do not retain their results. The same decisions apply to `invoke` tests, memory caches and Redis caches.
227
+ - **Preserve connection declaration errors across module boundaries** — `@voltro/kv`
228
+
229
+ Redis, NATS, Storage, Analytics and SQL registries retain typed configuration diagnostics across module and VM boundaries instead of mislabeling them as dynamic credential failures. Errors returned by credential resolvers remain redacted.
230
+ - **Bind demo API tenants consistently in browser and server renders** — `@voltro/cli`
231
+
232
+ The fullstack, admin, SSR API and public status templates now send their explicit demo tenant to header-based anonymous APIs. SSR API and status pages use the same binding for server-side RPC reads, so a fresh scaffold renders successfully and its browser subscriptions select the same data. API refusals for missing tenants and access checks remain enforced. These demo bindings select rows and do not authenticate users; private production data requires verified authentication. Fresh-consumer diagnostics retain uppercase error log lines.
233
+ - **Two voltro dev processes starting together mint one set of secrets, not two** — `@voltro/cli`
234
+
235
+ `voltro dev` mints missing project secrets into `.env.local`. Two processes on one project starting at the same time (two local replicas, a dev server beside a test boot) each minted their own values; with field encryption the database recorded one key and refused the second process at boot. Minting now runs under a lock and adopts a value another process wrote meanwhile; a lock left by a crashed mint is taken over.
236
+ - **Event warnings follow workspace package exports** — `@voltro/cli`
237
+
238
+ Development event wiring warnings now recognise sibling `useEvent` consumers imported through package exports, TypeScript path aliases, named and namespace re-exports, and static local aliases. Each subscription is matched to its descriptor so an unused import or another API's same-named module does not hide a missing consumer. Workspace discovery supports declared pnpm, npm, Yarn and Bun members and excludes nested projects and build output.
239
+ - **Index audit preserves partial row coverage and uniqueness** — `@voltro/database`
240
+
241
+ The index audit recommends dropping an index only when another B-tree index preserves its row coverage and uniqueness. Partial unique indexes no longer make full indexes appear redundant; specialized index methods and unproved predicate relationships are excluded, and recommendations name only the safe replacement direction.
242
+ - **Migration logs identify which operations their count includes** — `@voltro/database`
243
+
244
+ Development auto-migration logs now identify their applied-operation count as the planner pass, excluding framework bootstrap and file-based migrations. A schema plan taken before boot can include work completed by those earlier stages; run a new plan after boot to verify that no operations remain.
245
+ - **Filter completed workflow pool owners before recovery transport** — `@voltro/cli`, `@voltro/voltro`, `@voltro/workflow`
246
+
247
+ Pool release recovery now persists its terminal settlement on submission and restart owners and filters those markers through indexed SQL predicates. Finished owner history no longer crosses the wire on every idle pass or after process restart. Lost release acknowledgements, held owners and missing evidence remain recoverable and reported; immutable owners and permit tombstones remain for receipt and replay safety. Normal framework schema migration adds two nullable settlement markers and their indexes; existing history is checked once in bounded pages. Settlement indexes use explicit short names within SQL identifier limits. Reconciliation cadence is unchanged.
248
+ - **Presence transport warnings follow actual subscription readiness** — `@voltro/plugin-presence`
249
+
250
+ Presence reports pending binding or subscription acquisition without a false missing-provider warning after five seconds. It reports cross-instance readiness only after acquiring the broadcast subscription, while local-only bindings and failed subscriptions still warn. Closing or replacing a binding prevents stale callbacks and releases subscriptions acquired afterward.
251
+ - **Self-updates finish after the old CLI installation is removed** — `@voltro/cli`, `@voltro/runtime`
252
+
253
+ `voltro update` loads its completion helpers before installing the target version, so removing the running CLI package no longer turns a successful upgrade into a missing-module failure. Error reporting uses the shared lightweight `@voltro/runtime/boot-refusal` entry loaded before dispatch; genuine failures keep their original message and exit code without loading the server dependency graph for help or version commands.
254
+ - **Compiled API servers start without a source-analysis dependency** — `@voltro/cli`
255
+
256
+ The development event-consumer audit loads its source compiler only when scanning. A compiled API server can start after relocation without app sources or a direct `ts-morph` dependency. Package-export consumer discovery keeps its existing scope and does not execute application modules.
257
+ - **SignalHeader centers its brand in the masthead** — `@voltro/ui-shadcn`
258
+
259
+ The `SignalHeader` brand slot is a centered flex row, so a brand link no longer sits on the text baseline and renders a few pixels above the masthead's center.
260
+ - **Update reports changed runtime patch assets before boot** — `@voltro/cli`
261
+
262
+ `voltro update` compares configured pnpm Effect and SQL-driver patches with the target CLI's assets during its codemod step, including `--codemods-only`. Changed bytes produce refresh and install instructions even without workflows. Same-version checks also report drift. Custom patch paths are named and files remain untouched.
263
+ - **Upgrade reviews omit locator counts and unchanged REST type plumbing** — `@voltro/cli`
264
+
265
+ The aggregate review excludes locator chains and local locator aliases while retaining uncertain query receivers. The idempotency review lists REST context constructions, context factories and guard definitions instead of every context or guard parameter annotation. Aliased imported calls in JavaScript custom hosts remain visible.
266
+
267
+ ### Internal (no consumer-facing effect)
268
+
269
+ - **Effect audits distinguish regression data from executable legacy APIs**
270
+
271
+ Effect migration audits allow test data to describe a foreign dependency's retained major. Removed package imports and obsolete bound API calls remain findings in tests and application code, while production migration-residue checks remain unchanged.
272
+ - **The doctor's table nullability manifest covers the billing history tables** — `@voltro/cli`
273
+
274
+ The generated nullability manifest `voltro doctor` reads was missing the invoice-history and customer-account tables the billing plugin added; it is regenerated from the declarations.
275
+ - **Installation checks refuse ambient workspaces and source overrides**
276
+
277
+ Installation checks require standalone directories before creating projects. Artifact consumers use shipped template and documentation assets without inheriting maintainer source overrides or Node module loaders. Registry, package-manager and explicit application settings remain available.
278
+ - **Installation checks require healthy applications and usable modules**
279
+
280
+ Installation checks require API readiness, successful web responses and transformed JavaScript modules while the development process remains running. HTTP errors and HTML fallbacks cannot satisfy those checks. Diagnostics distinguish application startup from shutdown.
281
+ - **Keep CLI fixture temporary roots and child outcomes explicit**
282
+
283
+ Automatic sidecar tests inspect the actual operating-system temporary directory and release their bound owner even when an assertion fails. Schema-boot fixtures retain the child's exit signal and assert the real exit tuple alongside readiness and migration counts, so a signal cannot become a false successful process result. Production security and signal guards remain unchanged.
284
+
285
+ Workflow recovery tests distinguish the recorded failure budget from concurrent dispatches already in flight. They retain the same prepared execution identity, require one body execution, and verify that stopped or accepted submissions cannot dispatch again.
286
+ - **Native SQL checks isolate schema ownership across fixtures**
287
+
288
+ Wallet and shop checks own separate server databases so concurrent schema creation cannot contend with another fixture's live writes. Independent pools within a fixture still share the real database. Cleanup closes all acquired pools before dropping only the owned namespace, and a native regression verifies isolation with identical wallet identities.
289
+ - **Native reload checks retain manifests published during SQL observation**
290
+
291
+ Native geometry checks establish the expected-version receiver before reload activation. A real transport regression holds the consumer until the new manifest arrives, so asynchronous SQL observation cannot hide a missed publication. Frame deadlines retain their original call sites.
292
+ - **Native snapshot probes join their scheduled driver**
293
+
294
+ Held-source stream probes quiesce and join the actual Host driver before directly pumping its captured graph. This prevents a scheduled turn from concurrently entering that graph and closing the fixture's native Session. Listener, SQL, controller, wire delivery, rights withdrawal and final cleanup assertions remain active; ordinary stream cases retain the running driver.
295
+ - **Bound the reviewed Sentry tool exception and retain every dependency instance**
296
+
297
+ The owner-reviewed exception accepts only sentry 0.45.0 under FSL-1.1-Apache-2.0 as unmodified external tooling for the Sentry integration. This does not classify FSL as permissive or remove its competing-use restriction. The runtime license walk checks every resolved instance, so an accepted version cannot hide a second version or license. Generated notices and the SBOM use actual package identities. Containment checks cover framework, workspace and scaffold patch files plus declared patches with arbitrary filenames; the API bundler leaves the tool external.
298
+ - **Stack scaffold checks require major-scoped runtime alignment**
299
+
300
+ The normal stack scaffold regression parses its generated workspace policy and verifies both Effect 4 selectors while refusing unqualified Effect and companion pins. Patch declaration and actual patch-byte checks remain, so the regression follows the preserved foreign-major contract instead of demanding its earlier unsafe global override. Its synthetic workspace declares its own pnpm version, making Compose baseline coverage independent of the test runner's package-manager environment.
301
+ - **Dependency security checks verify installed source remediations**
302
+
303
+ Dependency security checks accept a reviewed source remediation only after verifying exact patch and implementation hashes, patched references in every lockfile document, actual caller resolution and runtime behavior. Deepmerge's returned-object prototype protection preserves ordinary configuration merging. Unaffected dependency graphs receive no exception, and a local source remediation is never reported as an upstream fixed version.
304
+
305
+ ---
306
+
44
307
  ## [0.87.0] — 2026-10-31
45
308
 
46
309
  ### ⚠ BREAKING
@@ -3231,6 +3494,15 @@ _Changes staged for the next release accumulate here (rolled up from
3231
3494
  - **Prepare the exact XYFlow type correction before normal installation** — `@voltro/cli`
3232
3495
 
3233
3496
  `voltro add patches --xyflow 12.12.0` prepares the original XYFlow declaration correction and its complete license/notice before a normal package-manager or UI installation. Existing conflicting project patch assets are preserved and rejected before writes.
3497
+ - **Dispatchers drain accepted reads before store disposal** — `@voltro/runtime`, `@voltro/cli`
3498
+
3499
+ Runtime adds `Dispatcher.closeAndDrain()` to join accepted reads and deliveries before store disposal. Normal Dev and Serve API shutdown await it; synchronous `close()` remains available.
3500
+ - **Workflow cluster hosts declare shard groups and ClusterCron routing groups** — `@voltro/workflow`, `@voltro/cli`
3501
+
3502
+ Workflow cluster hosts can explicitly declare available/assigned shard groups and ClusterCron routing groups. Omitted settings retain existing routing; persistent journal migration is a separate prerequisite for changing groups.
3503
+ - **PostgreSQL workflow hosts can persist routing-generation admission** — `@voltro/workflow`, `@voltro/cli`
3504
+
3505
+ PostgreSQL workflow engine hosts can opt into persisted routing-generation admission with `journalRouting`; actual durable MessageStorage operations use the ownership guard. Full API-role wiring and maintenance rollout remain separate requirements.
3234
3506
 
3235
3507
  ### Changed
3236
3508
 
@@ -24321,9 +24593,3 @@ public registry yet.
24321
24593
 
24322
24594
  Subsequent releases record their deltas from here under dated headings, with
24323
24595
  `⚠ BREAKING` first.
24324
-
24325
- - Runtime adds `Dispatcher.closeAndDrain()` to join accepted reads and deliveries before store disposal. Normal Dev and Serve API shutdown await it; synchronous `close()` remains available.
24326
-
24327
- - Workflow cluster hosts can explicitly declare available/assigned shard groups and ClusterCron routing groups. Omitted settings retain existing routing; persistent journal migration is a separate prerequisite for changing groups.
24328
-
24329
- - PostgreSQL workflow engine hosts can opt into persisted routing-generation admission with `journalRouting`; actual durable MessageStorage operations use the ownership guard. Full API-role wiring and maintenance rollout remain separate requirements.