--- orphan: true --- # Changelog Release notes for EDRI, grouped by user-facing impact. Expand the changed-file lists when you need implementation detail. ```{note} Versions ending in `rcN` are release candidates. Their APIs and behavior may still change before the corresponding stable release. ```
How this changelog is generated

This page is generated from reachable Git tags, Conventional Commit subjects, and optional Changelog-* metadata. CI regenerates it before each documentation build.

## Unreleased
In development 0 changes
No unreleased changes.
## 2026.10.03 — 2026-10-15
Stable 2 changes 1 breaking change
Fixed 1 Documentation 1
### Fixed ::::{admonition} Harden static file responses. :class: edri-changelog-entry edri-changelog-entry-fixed Static files are no longer served as text/html when their type is unknown, carry X-Content-Type-Options: nosniff, and accept only GET and HEAD. - Unknown and compressed (.gz) static files are served as application/octet-stream; CSS, JavaScript, fonts, images, and WebAssembly have a fixed Content-Type on every Python version and host. > **Breaking change:** Methods other than GET and HEAD on a static file return 405 instead of the file. **Documentation:** {doc}`static_files`
3 changed files
:::: ### Documentation ::::{admonition} Document static file serving on its own page. :class: edri-changelog-entry edri-changelog-entry-documentation A new Static files page explains how unrouted URLs are served from EDRI_ASSETS_PATH, which routes and clients shadow them, what headers are sent, and why everything in the directory is public. **Documentation:** {doc}`static_files`
7 changed files
:::: ## 2026.10.02 — 2026-10-13
Stable 2 changes
Fixed 2
### Fixed ::::{admonition} FilterBuilder negative filters on relationship paths :class: edri-changelog-entry edri-changelog-entry-fixed Negative FilterBuilder operators on dotted relationship paths now also match rows that have no related row. - `not`, `doesNotContain`, `isNoneOf`, `notBetween`, and `isEmpty` on a dotted path negate the positive EXISTS; on to-many and many-to-many paths they mean that no related row matches. **Documentation:** {doc}`SQLAlchemy integration `
3 changed files
:::: ::::{admonition} orm\_validator() on SQLAlchemy 2.1 :class: edri-changelog-entry edri-changelog-entry-fixed orm_validator() again rejects a column whose type has no known Python type when running on SQLAlchemy 2.1. **Documentation:** {doc}`SQLAlchemy integration `
1 changed file
:::: ## 2026.10.01 — 2026-10-12
Stable 4 changes 2 breaking changes
Added 1 Changed 1 Fixed 2
### Added ::::{admonition} Add the edri new command. :class: edri-changelog-entry edri-changelog-entry-added Add the optional edri command; edri new creates a runnable project skeleton with one placeholder Manager. **Documentation:** {doc}`getting_started`
2 changed files
:::: ### Changed ::::{admonition} At-least-once delivery between Router and Switch :class: edri-changelog-entry edri-changelog-entry-changed Events are kept by the Switch until the receiving Router acknowledges them, so a Router that reconnects no longer loses events that were still waiting for it. Delivery is at-least-once with de-duplication, and an acknowledgement means the event reached the next process, not that a manager finished handling it. - A replay requested with SendFrom for one router is no longer also sent to every subscriber, which delivered it twice. > **Breaking change:** The Connector-Switch wire protocol is version 2; a Switch and its Connectors on different versions refuse each other's frames. > **Migration:** Upgrade the Switch and every Connector together.
15 changed files
:::: ### Fixed ::::{admonition} Cache replay after a Switch outage :class: edri-changelog-entry edri-changelog-entry-fixed A Router now replays only the events it produced itself, and still replays what it has cached when the resume point has already expired. Previously the second case replayed nothing. - Events that already left every cache cannot be recovered, and a replay may deliver some events twice.
5 changed files
:::: ::::{admonition} Run AsyncManagerBase start-up inside the event loop. :class: edri-changelog-entry edri-changelog-entry-fixed AsyncManagerBase runs its start-up, including after_start() and the events received while subscribing, inside the running event loop, so start-up events for async def handlers no longer crash the manager. > **Breaking change:** In AsyncManagerBase, after_start() now runs inside a running event loop, so calling asyncio.run() or loop.run_until_complete() there raises RuntimeError. > **Migration:** Make after_start() create tasks or loop-bound resources directly instead of running its own event loop. **Documentation:** {doc}`async_manager`
4 changed files
:::: ## 2026.09.08 — 2026-10-08
Stable 8 changes
Added 1 Changed 2 Fixed 5
### Added ::::{admonition} Add opt-in SQLite write-behind persistence. :class: edri-changelog-entry edri-changelog-entry-added Add optional SQLite persistence to the KV Store with asynchronous writes, startup restoration and TTL across restarts. **Documentation:** {doc}`specialized_managers`
12 changed files
:::: ### Changed ::::{admonition} Restructure the SQLite persistence section. :class: edri-changelog-entry edri-changelog-entry-changed Reorganize the Store SQLite persistence documentation into short, scannable subsections. **Documentation:** {doc}`specialized_managers`
1 changed file
:::: ::::{admonition} Document the start order of a persistent Store. :class: edri-changelog-entry edri-changelog-entry-changed Document that a persistent Store should be started before the API, Broker, Scheduler and run(). **Documentation:** {doc}`specialized_managers`
1 changed file
:::: ### Fixed ::::{admonition} Exclude the health events from gRPC instead of warning. :class: edri-changelog-entry edri-changelog-entry-fixed EdriHealth and EdriReady are now declared as excluded from gRPC, so building the gRPC schema no longer logs a skip warning for each of them. EdriReady is also no longer offered over WebSocket, since its readiness signal is an HTTP 503.
3 changed files
:::: ::::{admonition} Keep persistence failures observable and preserve Unicode keys. :class: edri-changelog-entry edri-changelog-entry-fixed Keep Store persistence failures observable, preserve surrogate-containing keys and avoid redundant missing-key deletes. **Documentation:** {doc}`specialized_managers`
5 changed files
:::: ::::{admonition} Snapshot updates and propagate persistence startup failures. :class: edri-changelog-entry edri-changelog-entry-fixed Snapshot Store persistence updates, invalidate stale data after serialization errors and propagate startup restoration failures to the application. **Documentation:** {doc}`specialized_managers`
7 changed files
:::: ::::{admonition} Preserve retry wakeups and recover batch preparation failures. :class: edri-changelog-entry edri-changelog-entry-fixed Preserve Store persistence retry wakeups, recover batch preparation failures and allow configurable restoration deadlines. **Documentation:** {doc}`specialized_managers`
9 changed files
:::: ::::{admonition} Enforce database ownership and recover stopped writers. :class: edri-changelog-entry edri-changelog-entry-fixed Enforce exclusive Store database ownership and recover stopped persistence writers without losing buffered commands. **Documentation:** {doc}`specialized_managers`
5 changed files
:::: ## 2026.09.07 — 2026-10-06
Stable 1 change 1 breaking change
Fixed 1
### Fixed ::::{admonition} Treat unset ENVIRONMENT as production. :class: edri-changelog-entry edri-changelog-entry-fixed An unset or empty ENVIRONMENT is now treated as production instead of development, so a deployment that omits the variable no longer exposes /edri/docs, /edri/topology and error details. > **Breaking change:** ENVIRONMENT unset or empty now runs as production instead of development. > **Migration:** Set ENVIRONMENT=development explicitly for local development.
3 changed files
:::: ## 2026.09.06 — 2026-10-06
Stable 1 change 1 breaking change
Fixed 1
### Fixed ::::{admonition} Treat unrecognised ENVIRONMENT values as production. :class: edri-changelog-entry edri-changelog-entry-fixed An unrecognised ENVIRONMENT value such as "prod" is now treated as production instead of development, so /edri/docs, /edri/topology and error details are no longer exposed by a typo. A warning is logged at startup. > **Breaking change:** An ENVIRONMENT value other than "development", "production" or empty now runs as production. > **Migration:** Set ENVIRONMENT=development explicitly if the development behaviour is intended. **Documentation:** {doc}`Environment variables `
3 changed files
:::: ## Older releases
209 older releases
  1. 2026.09.05
  2. 2026.09.04
  3. 2026.09.03
  4. 2026.09.02
  5. 2026.09.01
  6. 2026.09.01rc6
  7. 2026.09.01rc5
  8. 2026.09.01rc4
  9. 2026.09.01rc3
  10. 2026.09.01rc2
  11. 2026.09.01rc1
  12. 2026.08.03rc2
  13. 2026.08.03rc1
  14. 2026.08.02
  15. 2026.08.02rc4
  16. 2026.08.02rc3
  17. 2026.08.02rc2
  18. 2026.08.02rc1
  19. 2026.08.01
  20. 2026.07.04
  21. 2026.07.03
  22. 2026.07.02
  23. 2026.07.02rc12
  24. 2026.07.02rc11
  25. 2026.07.02rc10
  26. 2026.07.02rc9
  27. 2026.07.02rc8
  28. 2026.07.02rc7
  29. 2026.07.02rc6
  30. 2026.07.02rc4
  31. 2026.07.02rc3
  32. 2026.07.01rc10
  33. 2026.07.01rc9
  34. 2026.07.01rc8
  35. 2026.07.01rc7
  36. 2026.07.01rc6
  37. 2026.07.01rc5
  38. 2026.07.01rc4
  39. 2026.07.01rc3
  40. 2026.07.01rc2
  41. 2026.07.01rc1
  42. 2026.06.01
  43. 2026.06.01rc5
  44. 2026.06.01rc4
  45. 2026.06.01rc3
  46. 2026.06.01rc2
  47. 2026.06.01rc1
  48. 2026.03.03
  49. 2026.03.03rc5
  50. 2026.03.03rc4
  51. 2026.03.03rc3
  52. 2026.03.03rc2
  53. 2026.03.03rc1
  54. 2026.03.02
  55. 2026.03.01
  56. 2026.02.03
  57. 2026.02.02
  58. 2026.02.01
  59. 2025.12.03
  60. 2025.12.03rc1
  61. 2025.12.02
  62. 2025.12.02rc1
  63. 2025.12.01
  64. 2025.12.01rc3
  65. 2025.12.01rc2
  66. 2025.12.01rc1
  67. 2025.11.01rc4
  68. 2025.11.01rc3
  69. 2025.11.01rc2
  70. 2025.11.01rc1
  71. 2025.10.02rc1
  72. 2025.10.01
  73. 2025.10.01rc1
  74. 2025.09.04rc2
  75. 2025.09.04rc1
  76. 2025.09.03
  77. 2025.09.03rc1
  78. 2025.09.02
  79. 2025.09.02rc7
  80. 2025.09.02rc6
  81. 2025.09.02rc5
  82. 2025.09.02rc4
  83. 2025.09.02rc3
  84. 2025.09.02rc2
  85. 2025.09.02rc1
  86. 2025.09.01
  87. 2025.08.03rc4
  88. 2025.08.03rc3
  89. 2025.08.03rc2
  90. 2025.08.03rc1
  91. 2025.08.02rc4
  92. 2025.08.02rc3
  93. 2025.08.01
  94. 2025.07.02
  95. 2025.07.02rc3
  96. 2025.07.02rc2
  97. 2025.07.02rc1
  98. 2025.07.01
  99. 2025.07.01rc4
  100. 2025.07.01rc3
  101. 2025.07.01rc2
  102. 2025.07.01rc1
  103. 2025.06.01
  104. 2025.04.05
  105. 2025.04.04
  106. 2025.04.03
  107. 2025.04.02
  108. 2025.04.01
  109. 2025.04.01rc4
  110. 2025.04.01rc3
  111. 2025.04.01rc2
  112. 2025.04.01rc1
  113. 2025.03.03
  114. 2025.03.03rc7
  115. 2025.03.03rc6
  116. 2025.03.03rc5
  117. 2025.03.03rc4
  118. 2025.03.03rc3
  119. 2025.03.03rc2
  120. 2025.03.03RC1
  121. 2025.03.02
  122. 2025.03.02rc5
  123. 2025.03.02rc4
  124. 2025.03.02rc3
  125. 2025.03.02rc2
  126. 2025.03.02rc1
  127. 2025.03.01
  128. 2025.03.01rc6
  129. 2025.03.01rc5
  130. 2025.03.01rc4
  131. 2025.03.01rc3
  132. 2025.03.01rc2
  133. 2025.03.01rc1
  134. 2025.02.02
  135. 2025.02.01
  136. 2025.01.05
  137. 2025.01.04
  138. 2025.01.03
  139. 2025.01.02
  140. 2025.01.01
  141. 2024.12.08
  142. 2024.12.07
  143. 2024.12.06
  144. 2024.12.05
  145. 2024.12.04
  146. 2024.12.03
  147. 2024.12.02
  148. 2024.12.01
  149. 2024.12.0
  150. 2024.11.15
  151. 2024.11.14
  152. 2024.11.13
  153. 2024.11.12
  154. 2024.11.11
  155. 2024.11.10
  156. 2024.11.09
  157. 2024.11.08
  158. 2024.11.07
  159. 2024.11.06
  160. 2024.11.05
  161. 2024.11.04
  162. 2024.11.03
  163. 2024.11.02
  164. 2024.11.01
  165. 2024.10.16
  166. 2024.10.15
  167. 2024.10.14
  168. 2024.10.13
  169. 2024.10.12
  170. 2024.10.11
  171. 2024.10.10
  172. 2024.10.09
  173. 2024.10.08
  174. 2024.10.07
  175. 2024.10.05
  176. 2024.10.04
  177. 2024.10.03
  178. 2024.10.02
  179. 2024.10.01
  180. 2024.09.13
  181. 2024.09.12
  182. 2024.09.11
  183. 2024.09.10
  184. 2024.09.09
  185. 2024.09.08
  186. 2024.09.07
  187. 2024.09.06
  188. 2024.09.05
  189. 2024.09.04
  190. 2024.09.03
  191. 2024.09.02
  192. 2024.09.01
  193. 2024.06.04
  194. 2024.06.03
  195. 2024.06.02
  196. 2024.06.01
  197. 2024.04.01
  198. 2024.03.11
  199. 2024.03.10
  200. 2024.03.09
  201. 2024.03.08
  202. 2024.03.07
  203. 2024.03.06
  204. 2024.03.05
  205. 2024.03.04
  206. 2024.03.03
  207. 2024.03.02
  208. 2024.03.01
  209. 2024.02.01