messagefoundry 0.3.0__tar.gz → 0.3.2__tar.gz

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 (297) hide show
  1. messagefoundry-0.3.2/.gitignore +156 -0
  2. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/CHANGELOG.md +144 -13
  3. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/PKG-INFO +6 -5
  4. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/__init__.py +49 -32
  5. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/__main__.py +1118 -100
  6. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/__init__.py +1 -1
  7. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/leak.py +7 -7
  8. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/surrogates.py +106 -17
  9. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/_ui_seam.py +66 -1
  10. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/app.py +2316 -140
  11. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/approvals.py +18 -3
  12. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/auth_models.py +7 -0
  13. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/auth_routes.py +72 -32
  14. messagefoundry-0.3.2/messagefoundry/api/client_networks.py +287 -0
  15. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/field_authz.py +1 -1
  16. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/metrics.py +62 -4
  17. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/models.py +429 -6
  18. messagefoundry-0.3.2/messagefoundry/api/multipart.py +127 -0
  19. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/security.py +283 -66
  20. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/tls.py +10 -3
  21. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/apiclient/client.py +4 -4
  22. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/identity.py +1 -1
  23. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/ldap.py +37 -7
  24. messagefoundry-0.3.2/messagefoundry/auth/oidc/__init__.py +72 -0
  25. messagefoundry-0.3.2/messagefoundry/auth/oidc/claims.py +286 -0
  26. messagefoundry-0.3.2/messagefoundry/auth/oidc/flow.py +283 -0
  27. messagefoundry-0.3.2/messagefoundry/auth/oidc/jwks.py +225 -0
  28. messagefoundry-0.3.2/messagefoundry/auth/oidc_http.py +132 -0
  29. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/permissions.py +27 -2
  30. messagefoundry-0.3.2/messagefoundry/auth/reconcile.py +220 -0
  31. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/service.py +882 -52
  32. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/totp.py +6 -0
  33. messagefoundry-0.3.2/messagefoundry/auth/trust_anchors.py +357 -0
  34. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/webauthn.py +23 -1
  35. messagefoundry-0.3.2/messagefoundry/checks.py +1419 -0
  36. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/ai_policy.py +34 -7
  37. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/alerts_edit.py +29 -1
  38. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/code_sets.py +10 -1
  39. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/codeset_edit.py +52 -14
  40. messagefoundry-0.3.2/messagefoundry/config/connection_schema.py +297 -0
  41. messagefoundry-0.3.2/messagefoundry/config/connections_edit.py +381 -0
  42. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/connections_file.py +38 -6
  43. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/graph.py +8 -8
  44. messagefoundry-0.3.2/messagefoundry/config/memory_encryption.py +248 -0
  45. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/models.py +71 -8
  46. messagefoundry-0.3.2/messagefoundry/config/security_edit.py +110 -0
  47. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/settings.py +1458 -85
  48. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/tls_policy.py +55 -29
  49. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/wiring.py +660 -72
  50. messagefoundry-0.3.2/messagefoundry/corepoint_import.py +2065 -0
  51. messagefoundry-0.3.2/messagefoundry/crashdump.py +165 -0
  52. messagefoundry-0.3.2/messagefoundry/generators/all_types.py +26 -0
  53. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/documents.py +3 -1
  54. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/hl7schema.py +2 -2
  55. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/hl7structures.py +3 -2
  56. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/integrity.py +3 -3
  57. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/lens.py +534 -7
  58. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/logging_setup.py +67 -0
  59. messagefoundry-0.3.2/messagefoundry/netaddr.py +108 -0
  60. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/__init__.py +29 -10
  61. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/_backend.py +5 -1
  62. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/_builtin_hl7.py +196 -9
  63. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/binary.py +4 -5
  64. messagefoundry-0.3.2/messagefoundry/parsing/compression.py +219 -0
  65. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/__init__.py +2 -1
  66. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/_deps.py +2 -1
  67. messagefoundry-0.3.2/messagefoundry/parsing/dicom/_inflate.py +164 -0
  68. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/dataset.py +7 -1
  69. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/errors.py +9 -1
  70. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/hl7_map.py +3 -2
  71. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/peek.py +6 -0
  72. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/fhir/_deps.py +2 -1
  73. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/message.py +41 -3
  74. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/peek.py +60 -1
  75. messagefoundry-0.3.2/messagefoundry/parsing/sniff.py +203 -0
  76. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/tree.py +1 -1
  77. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/delimiters.py +1 -1
  78. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/validate.py +3 -2
  79. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/__init__.py +14 -0
  80. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/errors.py +17 -0
  81. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/harden.py +31 -1
  82. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/message.py +2 -1
  83. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/schema.py +24 -3
  84. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/signature.py +0 -1
  85. messagefoundry-0.3.2/messagefoundry/parsing/xml/wsdl.py +345 -0
  86. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/_sandbox_worker.py +1 -1
  87. messagefoundry-0.3.2/messagefoundry/pipeline/alert_sinks.py +1153 -0
  88. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/alerts.py +137 -8
  89. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/cert_expiry.py +80 -15
  90. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/cluster.py +40 -4
  91. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/cluster_sqlserver.py +28 -3
  92. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/config_convergence.py +3 -3
  93. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/dr.py +26 -3
  94. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/dr_backup.py +106 -12
  95. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/dryrun.py +77 -18
  96. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/dryrun_trace.py +19 -4
  97. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/engine.py +234 -24
  98. messagefoundry-0.3.2/messagefoundry/pipeline/gcm_invocations.py +187 -0
  99. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/leader_tasks.py +3 -3
  100. messagefoundry-0.3.2/messagefoundry/pipeline/phase_timing.py +429 -0
  101. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/reference_sync.py +35 -5
  102. messagefoundry-0.3.2/messagefoundry/pipeline/retention.py +1010 -0
  103. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/sandbox.py +5 -5
  104. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/saturation.py +1 -1
  105. messagefoundry-0.3.2/messagefoundry/pipeline/secret_rotation.py +449 -0
  106. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/sharding.py +11 -2
  107. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/stage_dispatcher.py +190 -19
  108. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/state_convergence.py +3 -3
  109. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/supervisor.py +4 -4
  110. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/update_check.py +3 -3
  111. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/wiring_runner.py +969 -87
  112. messagefoundry-0.3.2/messagefoundry/pki.py +162 -0
  113. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/scaffold.py +4 -1
  114. messagefoundry-0.3.2/messagefoundry/security/__init__.py +26 -0
  115. messagefoundry-0.3.2/messagefoundry/security/semgrep/handler-security.yml +163 -0
  116. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/service.py +126 -4
  117. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/service_status.py +1 -1
  118. messagefoundry-0.3.2/messagefoundry/spreadsheet.py +79 -0
  119. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/__init__.py +4 -0
  120. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/audit_tee.py +10 -2
  121. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/backup_codec.py +39 -14
  122. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/base.py +257 -15
  123. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/content_search.py +3 -3
  124. messagefoundry-0.3.2/messagefoundry/store/crypto.py +842 -0
  125. messagefoundry-0.3.2/messagefoundry/store/crypto_transit.py +214 -0
  126. messagefoundry-0.3.2/messagefoundry/store/gcm_bound.py +115 -0
  127. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/pool_metrics.py +18 -0
  128. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/postgres.py +1710 -1002
  129. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/sqlserver.py +2517 -408
  130. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/store.py +1584 -223
  131. messagefoundry-0.3.2/messagefoundry/transports/ai_broker.py +238 -0
  132. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/base.py +98 -42
  133. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/database.py +84 -9
  134. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/dicom.py +74 -3
  135. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/dicomweb.py +18 -3
  136. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/email.py +50 -14
  137. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/fhir.py +56 -10
  138. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/file.py +339 -52
  139. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/framing.py +1 -1
  140. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/http_auth.py +32 -6
  141. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/http_listener.py +5 -5
  142. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/loopback.py +1 -1
  143. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/mllp.py +204 -26
  144. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/passthrough.py +1 -1
  145. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/remotefile.py +117 -18
  146. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/rest.py +410 -20
  147. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/signing.py +115 -0
  148. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/smart.py +33 -7
  149. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/soap.py +171 -12
  150. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/tcp.py +210 -14
  151. messagefoundry-0.3.2/messagefoundry/transports/timer.py +341 -0
  152. messagefoundry-0.3.2/messagefoundry/transports/wincred.py +253 -0
  153. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/x12.py +247 -21
  154. messagefoundry-0.3.2/messagefoundry/tray/__init__.py +28 -0
  155. messagefoundry-0.3.2/messagefoundry/tray/__main__.py +82 -0
  156. messagefoundry-0.3.2/messagefoundry/tray/actions.py +102 -0
  157. messagefoundry-0.3.2/messagefoundry/tray/app.py +154 -0
  158. messagefoundry-0.3.2/messagefoundry/tray/assets/foreign_dark.ico +0 -0
  159. messagefoundry-0.3.2/messagefoundry/tray/assets/foreign_light.ico +0 -0
  160. messagefoundry-0.3.2/messagefoundry/tray/assets/not_installed_dark.ico +0 -0
  161. messagefoundry-0.3.2/messagefoundry/tray/assets/not_installed_light.ico +0 -0
  162. messagefoundry-0.3.2/messagefoundry/tray/assets/running_dark.ico +0 -0
  163. messagefoundry-0.3.2/messagefoundry/tray/assets/running_light.ico +0 -0
  164. messagefoundry-0.3.2/messagefoundry/tray/assets/running_unmanaged_dark.ico +0 -0
  165. messagefoundry-0.3.2/messagefoundry/tray/assets/running_unmanaged_light.ico +0 -0
  166. messagefoundry-0.3.2/messagefoundry/tray/assets/starting_dark.ico +0 -0
  167. messagefoundry-0.3.2/messagefoundry/tray/assets/starting_light.ico +0 -0
  168. messagefoundry-0.3.2/messagefoundry/tray/assets/stopped_dark.ico +0 -0
  169. messagefoundry-0.3.2/messagefoundry/tray/assets/stopped_light.ico +0 -0
  170. messagefoundry-0.3.2/messagefoundry/tray/assets/stopping_dark.ico +0 -0
  171. messagefoundry-0.3.2/messagefoundry/tray/assets/stopping_light.ico +0 -0
  172. messagefoundry-0.3.2/messagefoundry/tray/assets/unknown_dark.ico +0 -0
  173. messagefoundry-0.3.2/messagefoundry/tray/assets/unknown_light.ico +0 -0
  174. messagefoundry-0.3.2/messagefoundry/tray/assets/wedged_dark.ico +0 -0
  175. messagefoundry-0.3.2/messagefoundry/tray/assets/wedged_light.ico +0 -0
  176. messagefoundry-0.3.2/messagefoundry/tray/autostart.py +64 -0
  177. messagefoundry-0.3.2/messagefoundry/tray/branding.py +354 -0
  178. messagefoundry-0.3.2/messagefoundry/tray/config.py +416 -0
  179. messagefoundry-0.3.2/messagefoundry/tray/control.py +48 -0
  180. messagefoundry-0.3.2/messagefoundry/tray/iconset.py +30 -0
  181. messagefoundry-0.3.2/messagefoundry/tray/instance.py +42 -0
  182. messagefoundry-0.3.2/messagefoundry/tray/menu.py +170 -0
  183. messagefoundry-0.3.2/messagefoundry/tray/poller.py +207 -0
  184. messagefoundry-0.3.2/messagefoundry/tray/probe.py +137 -0
  185. messagefoundry-0.3.2/messagefoundry/tray/state.py +217 -0
  186. messagefoundry-0.3.2/messagefoundry/tray/theme.py +47 -0
  187. messagefoundry-0.3.2/messagefoundry/tray/winshell.py +459 -0
  188. messagefoundry-0.3.2/messagefoundry/tray/winsvc.py +138 -0
  189. messagefoundry-0.3.2/messagefoundry/uploads.py +606 -0
  190. messagefoundry-0.3.2/messagefoundry/verify/federation.py +432 -0
  191. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/model.py +1 -1
  192. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/report.py +1 -1
  193. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/runner.py +79 -11
  194. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/smoke.py +12 -4
  195. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/pyproject.toml +72 -10
  196. messagefoundry-0.3.0/.gitignore +0 -91
  197. messagefoundry-0.3.0/messagefoundry/checks.py +0 -713
  198. messagefoundry-0.3.0/messagefoundry/config/connections_edit.py +0 -201
  199. messagefoundry-0.3.0/messagefoundry/corepoint_import.py +0 -590
  200. messagefoundry-0.3.0/messagefoundry/generators/all_types.py +0 -24
  201. messagefoundry-0.3.0/messagefoundry/pipeline/alert_sinks.py +0 -691
  202. messagefoundry-0.3.0/messagefoundry/pipeline/phase_timing.py +0 -222
  203. messagefoundry-0.3.0/messagefoundry/pipeline/retention.py +0 -563
  204. messagefoundry-0.3.0/messagefoundry/pipeline/secret_rotation.py +0 -210
  205. messagefoundry-0.3.0/messagefoundry/store/crypto.py +0 -484
  206. messagefoundry-0.3.0/messagefoundry/transports/timer.py +0 -146
  207. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/LICENSE +0 -0
  208. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/NOTICE +0 -0
  209. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/README.md +0 -0
  210. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/actions.py +0 -0
  211. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/adr_analyze.py +0 -0
  212. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/_pools.py +0 -0
  213. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/hl7.py +0 -0
  214. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/keying.py +0 -0
  215. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/rules.py +0 -0
  216. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/__init__.py +0 -0
  217. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/tls_client_cert.py +0 -0
  218. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/apiclient/__init__.py +0 -0
  219. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/__init__.py +0 -0
  220. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
  221. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/data/common_passwords.txt +0 -0
  222. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/notifications.py +0 -0
  223. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/passwords.py +0 -0
  224. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/policy.py +0 -0
  225. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/ratelimit.py +0 -0
  226. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/tokens.py +0 -0
  227. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/__init__.py +0 -0
  228. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/active_environment.py +0 -0
  229. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/anchor.py +0 -0
  230. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/db_lookup.py +0 -0
  231. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/environments.py +0 -0
  232. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/fhir_lookup.py +0 -0
  233. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/fingerprint.py +0 -0
  234. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/impact.py +1 -1
  235. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/ingest_time.py +0 -0
  236. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/reachability.py +0 -0
  237. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/reference.py +0 -0
  238. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/response.py +0 -0
  239. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/run_context.py +0 -0
  240. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/secretprovider.py +0 -0
  241. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/secretprovider_vault.py +0 -0
  242. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/send_snapshot.py +0 -0
  243. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/state.py +0 -0
  244. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/diagnostics.py +0 -0
  245. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/README.md +0 -0
  246. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/__init__.py +0 -0
  247. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/_core.py +1 -1
  248. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/_hl7data.py +0 -0
  249. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/adt.py +1 -1
  250. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/bar.py +0 -0
  251. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/dft.py +0 -0
  252. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/mdm.py +0 -0
  253. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/mfn.py +0 -0
  254. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/oml.py +0 -0
  255. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/orl.py +0 -0
  256. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/orm.py +0 -0
  257. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/oru.py +0 -0
  258. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/ras.py +0 -0
  259. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/rde.py +1 -1
  260. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/siu.py +0 -0
  261. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/vxu.py +0 -0
  262. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/last_resort.py +0 -0
  263. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/consistency.py +0 -0
  264. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/_util.py +0 -0
  265. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/fhir/__init__.py +0 -0
  266. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/fhir/errors.py +0 -0
  267. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/fhir/peek.py +0 -0
  268. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/fhir/resource.py +0 -0
  269. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/groups.py +0 -0
  270. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/split.py +0 -0
  271. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/summary.py +0 -0
  272. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/validate.py +0 -0
  273. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/__init__.py +0 -0
  274. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/_deps.py +0 -0
  275. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/errors.py +0 -0
  276. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/interchange.py +0 -0
  277. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/message.py +0 -0
  278. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/peek.py +0 -0
  279. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/_deps.py +0 -0
  280. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/__init__.py +0 -0
  281. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/connscale_shim.py +0 -0
  282. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/security_notify.py +0 -0
  283. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/py.typed +0 -0
  284. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/redaction.py +0 -0
  285. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/secrets_dpapi.py +0 -0
  286. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/document_strip.py +0 -0
  287. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/keyprovider.py +0 -0
  288. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/keyprovider_vault.py +0 -0
  289. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/metadata.py +0 -0
  290. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/support/__init__.py +0 -0
  291. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/support/bundle.py +0 -0
  292. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/support/redact.py +0 -0
  293. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/timezone.py +0 -0
  294. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/__init__.py +0 -0
  295. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/direct.py +1 -1
  296. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/__init__.py +0 -0
  297. {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/checks.py +0 -0
@@ -0,0 +1,156 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ .venv/
5
+ venv/
6
+ *.egg-info/
7
+ build/
8
+ dist/
9
+
10
+ # Engine runtime data (PHI may live here — never commit)
11
+ *.db
12
+ *.db-wal
13
+ *.db-shm
14
+ *.pid
15
+ out/
16
+ harness_io/
17
+ *.log
18
+
19
+ # One-time bootstrap admin credential written next to the store (consumed + deleted by the operator) — never commit
20
+ bootstrap-admin.txt
21
+
22
+ # Secrets / credentials — never commit (no such files exist today; these are foot-gun guards)
23
+ .env
24
+ .env.*
25
+ *.key
26
+ *.pem
27
+ *.pfx
28
+ secrets/
29
+
30
+ # Container deployment secrets + TLS material — never commit (the *.example templates ARE tracked)
31
+ /docker/secrets.env
32
+ /docker/tls/
33
+
34
+ # are never committed. Ignore every samples/ subdirectory by DEFAULT rather than naming the partner
35
+ # here — fail-closed, so a new unlisted staging dir cannot reach a public repo just because nobody
36
+ # remembered to add a rule. The shipped example dirs are re-included explicitly.
37
+ /samples/*/
38
+ !/samples/config/
39
+ !/samples/consistency/
40
+ !/samples/dicom/
41
+ !/samples/ech-sidecar/
42
+ !/samples/generators/
43
+ !/samples/messages/
44
+ !/samples/results_relay/
45
+ # Generated, regenerable test corpus (build with: python -m messagefoundry.generators.adt). MUST come
46
+ # after the un-ignores above, or the re-included parent would drag it back in.
47
+ /samples/messages/adt/
48
+ # Workflow agent self-verification temp dirs (an isolated copy of a ported migration module + codesets
49
+ # + fixture for a check/dryrun). Customer-estate-derived — never commit. Delete after a porting batch.
50
+ /_verify_*/
51
+ # exports). Customer data — NEVER commit. `git archive` (the publish path) excludes it by
52
+ # construction; this is the local-only working area.
53
+ /migration-local/
54
+
55
+ # Tooling
56
+ .mypy_cache/
57
+ .ruff_cache/
58
+ .pytest_cache/
59
+ .vscode/
60
+ .idea/
61
+
62
+ # CI-only quality artifacts (generated by .github/workflows/quality-advisory.yml, and by anyone
63
+ # reproducing those jobs locally). None of these were ignored before, which mattered: the C901 delta
64
+ # inputs are ruff JSON carrying ABSOLUTE local paths, so a local `git add -A` would stage a home
65
+ # directory path straight into a commit -- exactly what scripts/security/scan_forbidden.py fires on.
66
+ coverage.xml
67
+ .coverage
68
+ diff-cover.md
69
+ jscpd-report/
70
+ .mutmut-cache
71
+ mutants/
72
+ mutmut-run.txt
73
+ mutmut-results.txt
74
+ c901-head.json
75
+ c901-base.json
76
+ base-tree/
77
+
78
+ # Claude Code: settings.json is shared/tracked; settings.local.json is machine-local (never commit)
79
+ .claude/settings.local.json
80
+
81
+ # Local reference notes pointing at machine-specific Claude Code transcript paths — never commit
82
+ TRANSCRIPTS.md
83
+
84
+ # Local planning/marketing/security working docs — keep out of the repo
85
+ # (docs/DUAL_LICENSING_PLAN.md is now a committed artifact — see ADR 0017 / #13 licensing)
86
+ /docs/marketing/
87
+ /docs/security/CISO-REVIEW.md
88
+ /docs/security/DEPENDENCY-POSTURE-REVIEW.md
89
+ /docs/security/DEPENDENCY-RESPONSE-PLAN.md
90
+ /docs/security/DEPENDENCY-CUSTOMER-OFFERINGS.md
91
+ /docs/security/DEPENDENCY-RESPONSE-HANDOFF.md
92
+ /docs/security/DEPENDENCY-RESPONSE-A3-HANDOFF.md
93
+ /docs/security/DEPENDENCY-RESPONSE-A4-HANDOFF.md
94
+ # vuln_metrics.py local CSV output (the CI run uploads it as an artifact; not committed)
95
+ /docs/security/metrics/
96
+
97
+ # Operator-local load/throughput profiles — tuned to a specific deployment's volume; kept OUT of the
98
+ # OSS repo + public mirror (the plan itself lives on the operator share, WIN2025-LOAD-THROUGHPUT-MATRIX.md).
99
+ # Still usable by name (they sit in PROFILES_DIR) and copy-on to the test box.
100
+ /harness/load/profiles/hospital-baseline.toml
101
+ /harness/load/profiles/soak-12h.toml
102
+ # Deep-research survey of alternative OSS DB backends for the shared-DB commit-wall — local working
103
+ # note, not a committed artifact (the conclusion is carried in the throughput ADRs / AI memory).
104
+ /docs/research/db-commit-wall-backend-survey.md
105
+
106
+ # --- MessageFoundry ---
107
+ .mefor/
108
+ *.db*
109
+ .DS_Store
110
+ Thumbs.db
111
+
112
+ # Agent/web-fetch debris dropped in the repo ROOT (e.g. blog.html, contest.txt, free.html) — never
113
+ # commit. Anchored to root (leading /) so tracked *.html/*.txt UNDER subdirs (docs/, samples/,
114
+ # scripts/, packaging/, messagefoundry/auth/data/…) are unaffected; no *.html/*.txt is legitimately
115
+ # tracked at the repo root, so an anchored catch-all is safe. Force-add (git add -f) if one ever is.
116
+ /*.html
117
+ /*.txt
118
+ /*.yml
119
+
120
+ # The real customer/vendor token list consumed by scripts/security/scan_forbidden.py at
121
+ # commit time. Only the SYNTHETIC scan-tokens.local.txt.example is ever committed.
122
+ #
123
+ # Deliberately unconditional, and listed ahead of the scanner it serves: an operator creates
124
+ # this file before the tooling that references it exists, so ignoring the path up front
125
+ # removes any window in which a real token list sits un-ignored in a working tree.
126
+ scripts/security/scan-tokens.local.txt
127
+
128
+ # --- Private-only paths (formerly enforced by scripts/publish/publish-denylist.txt) ---------------
129
+ # The cutover RETIRES the publish deny-list. On the private repo these were TRACKED and stripped from
130
+ # the mirror at publish time; with the deny-list gone and development happening directly on the public
131
+ # repo, a gitignore rule is now the ONLY thing keeping them out of a commit -- and the cutover runbook
132
+ # runs `git add -A`. Same failure shape as the leak-scanner token file, different files.
133
+ #
134
+ # DELIBERATELY NOT LISTED: tests/test_scan_forbidden.py, tests/test_anon_core.py and
135
+ # .github/dependabot.yml. Those were deny-listed too, but this change set publishes synthetic/public
136
+ # versions of them -- ignoring them here would silently drop content that is meant to ship.
137
+ # PUBLISHED by this change (removed from the list above): CLAUDE.md, docs/BACKLOG.md and
138
+ # docs/WORKTREES.md. All three were scanned and carry no customer/estate tokens (BACKLOG.md needed a
139
+ # two-line redaction). CLAUDE.md in particular MUST be tracked: it is gitignored-by-default's worst
140
+ # case here, because `git worktree add` cannot deliver an untracked file, so every worktree silently
141
+ # came up with ZERO project conventions loaded.
142
+ /.claude/
143
+ /TRANSCRIPTS.md
144
+ /docs/security/
145
+ /docs/reviews/
146
+ /docs/marketing/
147
+ # Deliberately still private, each for a different reason:
148
+ # docs/security/ — 32 files of posture/risk-register detail; an attacker roadmap.
149
+ # docs/reviews/ — review findings, same reason.
150
+ # docs/CI-TOPOLOGY.md — STALE: it documents the retired private-repo/public-mirror split and
151
+ # scripts/publish/, which the cutover deleted. Publishing it would actively
152
+ # mislead. Rewrite for the post-cutover topology or delete it.
153
+ # docs/Secure_Development_Standards.md — scans clean, but it was deliberately pulled from the public
154
+ # PyPI sdist (#1020); reversing that is an owner call, not a side effect.
155
+ /docs/CI-TOPOLOGY.md
156
+ /docs/Secure_Development_Standards.md
@@ -6,6 +6,129 @@ All notable changes to MessageFoundry are documented here. The format follows
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.3.2] — 2026-07-28 — Early Access
10
+
11
+ A patch release for one adopter-facing defect shipped in 0.3.1, plus two gates that were passing
12
+ without being able to fail.
13
+
14
+ ### Fixed
15
+ - **The scaffolded supply-chain gate named a repository adopters cannot read.** `messagefoundry init`
16
+ writes a fail-closed CI gate that runs `gh attestation verify --repo …` on the pinned engine wheel
17
+ before installing it. It named the retired private development vault rather than the public
18
+ repository that actually mints the attestations, so **every project scaffolded by 0.3.1 shipped a
19
+ provenance gate that fails on its owner's first CI run.** If you scaffolded against 0.3.1, either
20
+ re-run `messagefoundry init`, or edit that one `--repo` argument in
21
+ `.github/workflows/check.yml` to `MEFORORG/MessageFoundry`; setting the repository variable
22
+ `MEFOR_VERIFY_ENGINE=off` skips the job entirely as a stopgap. The scaffold test had pinned the
23
+ wrong value, so the defect was being actively enforced; it now also pins the negative.
24
+ - **The weekly vulnerability-metrics job measured an empty window instead of failing.**
25
+ `vuln-metrics.yml` invokes `scripts/security/vuln_metrics.py` with no `--repo`, so the argparse
26
+ default silently decided what was measured — and it named the same retired vault, whose Dependabot
27
+ PRs a public token cannot read. All seven KPIs were computed over zero pull requests rather than
28
+ erroring. The default is now `$GITHUB_REPOSITORY`, so the job measures the repository it runs in.
29
+ - **A partially-failed release could not be retried.** The GitHub release step failed when the tag or
30
+ release already existed, so a publish that died midway (as 0.3.0's did) left no clean path forward.
31
+ It is now idempotent.
32
+ - **The load harness's no-loss reconcile false-failed a demonstrably zero-loss run.** It excuses a
33
+ send left unconfirmed at connection teardown, capped so a dead ACK path cannot pass as zero-loss —
34
+ but the cap modelled legitimate stranding as "~one in-flight frame per connection". The sender
35
+ keeps an unbounded in-flight window and paces open-loop sends by offered rate, so real stranding
36
+ scales with rate × ACK-latency instead. A run that stranded 14 of 90 sends while the engine read
37
+ and delivered every one of the rest was reported as message loss. The cap is now
38
+ `max(connections, half the run)`, which keeps `read >= sent // 2` always required.
39
+
40
+ ## [0.3.1] — 2026-07-27 — Early Access
41
+
42
+ ### Security
43
+ - **BREAKING — multi-factor authentication is now an ACCESS gate, not only a step-up gate**
44
+ (ASVS 6.3.3). An MFA-pending session is refused on **every** authorized route with `403` +
45
+ `X-MFA-Required: 1`; a browser session is confined to the new `/ui/mfa` page until it verifies.
46
+ Previously the second factor was demanded only at the step-up (sensitive-action) boundary, so a
47
+ password-only session could read the whole estate.
48
+ **`[security].require_mfa_scope`** (new, default **`every_local_account`**) widens who must enrol
49
+ from the Administrator role to every local account; set it to `administrators` to keep the previous
50
+ posture. It is reported as a loosening on `GET /security/posture` but never refuses to boot.
51
+ **Who is affected on upgrade:**
52
+ - **Existing sessions are unaffected until they expire** — they were minted MFA-satisfied and the
53
+ stamp is honoured. The change bites at the next sign-in.
54
+ - **Every un-enrolled local account must now enrol a factor before it can do anything else.** The
55
+ escape path is reachable from the pending session itself (`/me/reauth` → `/me/mfa/enroll` →
56
+ `/me/mfa/confirm`, or `/ui/account` in the browser), and confirming satisfies that same session.
57
+ Note the consequence: for an un-enrolled account, whoever holds the password can self-enrol the
58
+ second factor. The out-of-band `MFA_ENABLED` notification is the compensating control.
59
+ - **Non-interactive local service accounts using bearer tokens will start failing** with
60
+ `X-MFA-Required` and cannot enrol unattended. Move them to mTLS (`require_service_cert` is exempt
61
+ by design) or to AD, or set `require_mfa_scope = "administrators"`.
62
+ - **The PySide6 test harness** needs an enrolled account or `require_mfa_scope = "administrators"`:
63
+ its API client only retries an `X-MFA-Required` refusal when an MFA handler is registered, and
64
+ none is wired today.
65
+ - **Caveat on factor strength:** a WebAuthn passkey is asserted at `user_verification=preferred`,
66
+ so for a passkey-only account the second factor may be **device possession alone**. This is the
67
+ owner-signed L3 relaxation, recorded in `docs/SECURITY.md`, not an oversight.
68
+ - **BREAKING (federated deployments only) — a directory session is no longer minted MFA-satisfied
69
+ unconditionally** (ASVS 6.3.4). `_complete_ad_login` now takes the grant per mechanism: AD
70
+ simple-bind and Kerberos still pass it under the owner-signed **delegated-directory-MFA
71
+ relaxation** (the engine learns nothing about directory-side strength from a bind or a ticket),
72
+ while the **federated (OIDC) leg passes `[auth].oidc_require_mfa_claim`** — the one directory
73
+ signal the engine actually verifies. With the claim gate on (the default) nothing changes: a token
74
+ carrying no configured `amr`/`acr` was already refused at claims validation. **With
75
+ `oidc_require_mfa_claim = false`, federated sessions are now minted un-verified and refused** —
76
+ turn the claim gate on, move those users to AD, or set `[security].require_mfa = false`, which
77
+ remains the global off-switch.
78
+ Also fail-closed: the directory exemption is now an **allow-list** (`provider == "ad"`) rather than
79
+ a denylist (`!= "local"`), so an unrecognized provider value requires a second factor instead of
80
+ silently skipping one.
81
+ - **New `auth.mfa_denied` audit event.** The MFA gate sits above the permission loop, so
82
+ `auth.permission_denied` never fires for a pending session; without its own row a stolen
83
+ password-only token could enumerate the entire authenticated surface leaving no trace.
84
+ - `ENGINE_UI_SEAM` 13 → 14 — `api.security.require()` gained an `mfa_gate` keyword, and the console
85
+ imports it directly. A console wheel older than this engine refuses to mount, as designed.
86
+ - **In-use data protection for PHI is now declared and reported** ([ADR 0152](docs/adr/0152-in-use-data-protection-for-phi-platform-memory-encryption-attestation-asvs-11-7-1.md),
87
+ ASVS 11.7.1). An **exposed** PHI instance (a non-loopback bind **or** a declared
88
+ `[api].tls_terminated_upstream`, which includes the recommended loopback-behind-proxy topology) that has
89
+ not set **`[security].memory_encryption_operator_declared = true`** — the operator's declaration that the
90
+ host provides hardware memory encryption (AMD SEV-SNP / Intel TDX) — now **warns at every start**.
91
+ **Not a breaking change: nothing that boots today stops booting.** The refusal is opt-in via the new
92
+ `[security].require_memory_encryption_declaration` (default `false`), because this is a **host**
93
+ property that no operator can satisfy on Windows (where the platform read-out is always `null`) — the
94
+ same scoping rule as `[security].allowed_client_networks`' companion refusal (ADR 0151). Loopback and
95
+ synthetic instances are byte-identical. See
96
+ [OFF-LOOPBACK-DEPLOYMENT.md](docs/security/OFF-LOOPBACK-DEPLOYMENT.md) ladder row 12 and
97
+ [SYSTEM-REQUIREMENTS.md](docs/SYSTEM-REQUIREMENTS.md).
98
+ - **Report-only platform memory-encryption read-out on `GET /security/posture`** (ADR 0152 rung 1;
99
+ `ENGINE_UI_SEAM` 12 → 13) — `memory_encryption_self_reported_capability` / `..._self_reported_active` /
100
+ `..._self_reported_mechanism` / `memory_encryption_readout_source`, plus
101
+ `memory_encryption_operator_declared`, the tri-state
102
+ `memory_encryption_readout_contradicts_declaration` (`null` = nothing was measured that could
103
+ contradict anything) and `memory_encryption_note`, the disclaimer carried **in the response body** so it
104
+ travels with any copy of the artifact. Linux reads `/proc/cpuinfo` flags (capability) and
105
+ `/dev/sev-guest` / `/dev/tdx_guest` **character devices** (activation) as **separate** facts; everywhere
106
+ else every field is `null`. **No value of any of these satisfies ASVS 11.7.1** — they are what the host
107
+ says about itself, and cryptographic attestation (rung 3) is **not built**. The read-out is never
108
+ accepted as a substitute for the declaration, in either direction.
109
+ - **Windows crash dumps of the engine process are suppressed** — a WER dump is a full PHI disclosure
110
+ written to disk. `serve` applies the process-local half itself (`SetErrorMode` OR-ed into the inherited
111
+ mode, `WerSetFlags(NOHEAP | NO_UI | DISABLE_SNAPSHOT_*)`); the machine-policy half no process can reach
112
+ is opt-in via `install-service.ps1 -SuppressCrashDumps` (WER `ExcludedApplications`, registered for both
113
+ `messagefoundry.exe` and the venv `python.exe`, plus a **narrowing-only** `LocalDumps` override that is
114
+ written only where LocalDumps is already configured — creating that key would switch dump collection
115
+ ON). Residuals in [SERVICE.md](docs/SERVICE.md).
116
+
117
+ ### Fixed
118
+ - **The harness message list could livelock and stop updating entirely.** `MessagesPanel._apply` cleared
119
+ its in-flight guard, re-fired any refresh latched during the read, then returned *before* rendering —
120
+ discarding the snapshot as superseded. Whenever refreshes arrive faster than a read completes there is
121
+ always a latch waiting when the read lands, so every snapshot was discarded and the table never
122
+ updated: permanently stuck, not merely slow (measured: 391 reads served, 0 rendered). It now renders
123
+ first and drains afterwards, costing at most one read of staleness while still converging on the
124
+ latest filter. This surfaced as an intermittent CI failure that no timeout or retry could fix, because
125
+ neither addresses a livelock.
126
+ - **Two config blocks in the off-loopback runbook aborted at load** — `[diagnostics].audit_all_authz` and
127
+ `[ai].data_class` had been relocated by ADR 0118, so an operator copy-pasting either block got an
128
+ immediate start failure. Corrected to `[security].audit_all_authorization_decisions` and
129
+ `[security].handles_real_patient_data`, and every fenced `toml` block in that runbook is now pinned by a
130
+ test that loads it and fails on a silently-ignored key.
131
+
9
132
  ## [0.3.0] — 2026-07-13 — Early Access
10
133
 
11
134
  Highlights since 0.2.15 — streaming attachments end-to-end, a copy-on-Send message model, richer
@@ -872,16 +995,24 @@ tests, but the external code review + penetration test (the bar for a security-c
872
995
  - Releases are built, SBOM'd (CycloneDX), and signed with [Sigstore](https://www.sigstore.dev/) — see the
873
996
  `release` workflow.
874
997
 
875
- [Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.10...HEAD
876
- [0.2.10]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.9...v0.2.10
877
- [0.2.9]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.8...v0.2.9
878
- [0.2.8]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.7...v0.2.8
879
- [0.2.7]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.6...v0.2.7
880
- [0.2.6]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.5...v0.2.6
881
- [0.2.5]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.4...v0.2.5
882
- [0.2.4]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.3...v0.2.4
883
- [0.2.3]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.2...v0.2.3
884
- [0.2.2]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.1...v0.2.2
885
- [0.2.1]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.0...v0.2.1
886
- [0.2.0]: https://github.com/wshallwshall/MessageFoundry/compare/v0.1.0...v0.2.0
887
- [0.1.0]: https://github.com/wshallwshall/MessageFoundry/releases/tag/v0.1.0
998
+ [Unreleased]: https://github.com/MEFORORG/MessageFoundry/compare/v0.3.2...HEAD
999
+ [0.3.2]: https://github.com/MEFORORG/MessageFoundry/compare/v0.3.1...v0.3.2
1000
+ [0.3.1]: https://github.com/MEFORORG/MessageFoundry/compare/v0.3.0...v0.3.1
1001
+ [0.3.0]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.15...v0.3.0
1002
+ [0.2.15]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.14...v0.2.15
1003
+ [0.2.14]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.13...v0.2.14
1004
+ [0.2.13]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.12...v0.2.13
1005
+ [0.2.12]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.11...v0.2.12
1006
+ [0.2.11]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.10...v0.2.11
1007
+ [0.2.10]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.9...v0.2.10
1008
+ [0.2.9]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.8...v0.2.9
1009
+ [0.2.8]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.7...v0.2.8
1010
+ [0.2.7]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.6...v0.2.7
1011
+ [0.2.6]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.5...v0.2.6
1012
+ [0.2.5]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.4...v0.2.5
1013
+ [0.2.4]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.3...v0.2.4
1014
+ [0.2.3]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.2...v0.2.3
1015
+ [0.2.2]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.1...v0.2.2
1016
+ [0.2.1]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.0...v0.2.1
1017
+ [0.2.0]: https://github.com/MEFORORG/MessageFoundry/compare/v0.1.0...v0.2.0
1018
+ [0.1.0]: https://github.com/MEFORORG/MessageFoundry/releases/tag/v0.1.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: messagefoundry
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Open-source healthcare integration engine — route, transform, and validate messages across many formats and connection types
5
5
  Project-URL: Homepage, https://messagefoundry.org/
6
6
  Project-URL: Documentation, https://messagefoundry.org/
@@ -24,12 +24,14 @@ Classifier: Topic :: System :: Networking
24
24
  Classifier: Typing :: Typed
25
25
  Requires-Python: >=3.14
26
26
  Requires-Dist: aiosqlite>=0.20
27
+ Requires-Dist: annotated-types<0.8
27
28
  Requires-Dist: argon2-cffi>=23.1
28
29
  Requires-Dist: cryptography>=48.0.1
29
30
  Requires-Dist: defusedxml>=0.7.1
30
31
  Requires-Dist: fastapi>=0.137.1
31
32
  Requires-Dist: hl7>=0.4.5
32
33
  Requires-Dist: hl7apy>=1.3
34
+ Requires-Dist: httpx>=0.27
33
35
  Requires-Dist: ldap3>=2.9
34
36
  Requires-Dist: prometheus-client>=0.20
35
37
  Requires-Dist: psutil>=6.0
@@ -37,26 +39,25 @@ Requires-Dist: pydantic>=2.6
37
39
  Requires-Dist: pyspnego>=0.10
38
40
  Requires-Dist: starlette>=1.3.1
39
41
  Requires-Dist: tomlkit>=0.12
42
+ Requires-Dist: truststore>=0.10
40
43
  Requires-Dist: tzdata>=2024.1
41
44
  Requires-Dist: uvicorn[standard]>=0.29
42
45
  Provides-Extra: dev
43
- Requires-Dist: httpx>=0.27; extra == 'dev'
44
46
  Requires-Dist: mypy>=1.10; extra == 'dev'
45
47
  Requires-Dist: pytest-asyncio>=0.26; extra == 'dev'
46
48
  Requires-Dist: pytest-rerunfailures>=16.0; extra == 'dev'
47
49
  Requires-Dist: pytest-timeout>=2.3; extra == 'dev'
48
50
  Requires-Dist: pytest>=9.0.3; extra == 'dev'
49
- Requires-Dist: ruff>=0.4; extra == 'dev'
51
+ Requires-Dist: ruff<0.16,>=0.4; extra == 'dev'
50
52
  Provides-Extra: dicom
51
53
  Requires-Dist: pydicom<4,>=3.0.2; extra == 'dicom'
52
54
  Requires-Dist: pynetdicom<4,>=3.0.4; extra == 'dicom'
53
55
  Provides-Extra: fhir
56
+ Requires-Dist: annotated-types<0.8; extra == 'fhir'
54
57
  Requires-Dist: fhir-resources>=7.1.0; extra == 'fhir'
55
58
  Requires-Dist: fhirpathpy>=2.2.0; extra == 'fhir'
56
59
  Provides-Extra: harness
57
- Requires-Dist: httpx>=0.27; extra == 'harness'
58
60
  Requires-Dist: pyside6>=6.6; extra == 'harness'
59
- Requires-Dist: truststore>=0.10; extra == 'harness'
60
61
  Provides-Extra: otel
61
62
  Requires-Dist: opentelemetry-exporter-otlp>=1.20; extra == 'otel'
62
63
  Requires-Dist: opentelemetry-sdk>=1.20; extra == 'otel'
@@ -11,6 +11,27 @@ Config modules define the message graph against this surface::
11
11
  from messagefoundry import inbound, outbound, router, handler, Send, MLLP, File, Message
12
12
  """
13
13
 
14
+ from messagefoundry.actions import (
15
+ append_to_field,
16
+ arith_field,
17
+ code_lookup,
18
+ convert_case,
19
+ copy_field,
20
+ copy_segment,
21
+ date_diff_field,
22
+ delete_segment,
23
+ format_date,
24
+ pad_field,
25
+ replace_literal,
26
+ set_field,
27
+ split_field,
28
+ substring_field,
29
+ trim_field,
30
+ )
31
+ from messagefoundry.config.active_environment import current_environment
32
+ from messagefoundry.config.db_lookup import DbLookupError, db_lookup
33
+ from messagefoundry.config.fhir_lookup import FhirLookupError, fhir_lookup
34
+ from messagefoundry.config.ingest_time import current_ingest_time
14
35
  from messagefoundry.config.models import (
15
36
  AckMode,
16
37
  BatchConfig,
@@ -22,44 +43,40 @@ from messagefoundry.config.models import (
22
43
  SaturationThreshold,
23
44
  StallThreshold,
24
45
  )
25
- from messagefoundry.config.active_environment import current_environment
26
- from messagefoundry.config.db_lookup import DbLookupError, db_lookup
27
- from messagefoundry.config.fhir_lookup import FhirLookupError, fhir_lookup
28
- from messagefoundry.config.ingest_time import current_ingest_time
29
46
  from messagefoundry.config.reference import reference
30
47
  from messagefoundry.config.response import response_get
31
48
  from messagefoundry.config.state import state_get
32
49
  from messagefoundry.config.wiring import (
50
+ DICOM,
51
+ FHIR,
52
+ MLLP,
53
+ SMTP,
54
+ X12,
33
55
  CodeSet,
34
56
  Database,
35
57
  DatabaseLookup,
36
58
  DatabasePoll,
37
59
  DatabaseRef,
60
+ DICOMweb,
38
61
  Direct,
39
62
  Email,
40
63
  FhirLookup,
41
64
  File,
42
65
  FileRef,
43
66
  Ftp,
44
- FHIR,
45
67
  Http,
46
- DICOM,
47
- DICOMweb,
48
68
  Loopback,
49
- MLLP,
69
+ MessageTypeError,
50
70
  PassThrough,
51
71
  Reference,
52
72
  Rest,
53
- SMTP,
73
+ Send,
74
+ SetMeta,
75
+ SetState,
54
76
  Sftp,
55
77
  Soap,
56
78
  Tcp,
57
79
  Timer,
58
- X12,
59
- Send,
60
- SetMeta,
61
- SetState,
62
- MessageTypeError,
63
80
  code_set,
64
81
  env,
65
82
  handler,
@@ -68,24 +85,16 @@ from messagefoundry.config.wiring import (
68
85
  outbound,
69
86
  router,
70
87
  )
71
- from messagefoundry.actions import (
72
- append_to_field,
73
- arith_field,
74
- code_lookup,
75
- convert_case,
76
- copy_field,
77
- copy_segment,
78
- date_diff_field,
79
- delete_segment,
80
- format_date,
81
- pad_field,
82
- replace_literal,
83
- set_field,
84
- split_field,
85
- substring_field,
86
- trim_field,
87
- )
88
88
  from messagefoundry.diagnostics import checkpoint, log_note
89
+ from messagefoundry.parsing.compression import (
90
+ CompressionError,
91
+ deflate_compress,
92
+ deflate_decompress,
93
+ gzip_compress,
94
+ gzip_decompress,
95
+ zip_compress,
96
+ zip_decompress,
97
+ )
89
98
  from messagefoundry.parsing.groups import SegmentGroup
90
99
  from messagefoundry.parsing.message import Message, RawMessage
91
100
  from messagefoundry.parsing.split import split_by_obr
@@ -98,7 +107,7 @@ from messagefoundry.timezone import (
98
107
  to_zone,
99
108
  )
100
109
 
101
- __version__ = "0.3.0"
110
+ __version__ = "0.3.2"
102
111
 
103
112
  __all__ = [
104
113
  "Message",
@@ -183,5 +192,13 @@ __all__ = [
183
192
  "hl7_now",
184
193
  "age_from_dob",
185
194
  "length_of_stay",
195
+ # Compression codec (ADR 0123) — pure gzip/zlib-deflate/zip for on-demand Handler use.
196
+ "CompressionError",
197
+ "gzip_compress",
198
+ "gzip_decompress",
199
+ "deflate_compress",
200
+ "deflate_decompress",
201
+ "zip_compress",
202
+ "zip_decompress",
186
203
  "__version__",
187
204
  ]