messagefoundry 0.2.1__tar.gz → 0.2.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 (716) hide show
  1. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/SECURITY.md +8 -3
  2. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/workflows/benchmark.yml +3 -3
  3. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/workflows/ci.yml +27 -62
  4. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/workflows/dependabot-lock-resync.yml +1 -1
  5. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/workflows/release-sync-check.yml +1 -1
  6. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/workflows/release.yml +1 -1
  7. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/workflows/security.yml +11 -8
  8. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/workflows/vuln-metrics.yml +1 -1
  9. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/CHANGELOG.md +51 -0
  10. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/CLAUDE.md +1 -1
  11. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/CONTRIBUTING.md +1 -1
  12. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/PKG-INFO +37 -36
  13. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/README.md +35 -34
  14. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docker/Dockerfile +2 -2
  15. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docker/README.md +1 -1
  16. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docker/locks/requirements-core.lock +4 -267
  17. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docker/locks/requirements-sqlserver.lock +5 -295
  18. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/BACKLOG.md +101 -3
  19. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/CLUSTERING.md +17 -0
  20. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/CONFIGURATION.md +2 -1
  21. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/CONNECTIONS.md +7 -1
  22. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/DEPLOY-SERVER-DB.md +86 -1
  23. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/EARLY-ADOPTER-GUIDE.md +1 -1
  24. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/INSTALL-GUIDE.md +1 -1
  25. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/MENTAL-MODEL.md +2 -2
  26. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/PHI.md +110 -29
  27. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/SECURITY.md +6 -6
  28. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/SERVICE.md +10 -5
  29. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/SYSTEM-REQUIREMENTS.md +1 -1
  30. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/Secure_AI_Development_Standards.md +10 -5
  31. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/Secure_Development_Standards.md +4 -11
  32. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/USER-GUIDE.md +1 -1
  33. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0001-staged-pipeline-architecture.md +14 -0
  34. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +19 -7
  35. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0025-dicom-codec-store-connectors.md +5 -6
  36. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +1 -1
  37. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/testing/VERIFY.md +19 -2
  38. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/testing/WIN2025-TEST-MATRIX.md +1 -1
  39. messagefoundry-0.2.2/docs/testing/WIN2025-TEST-PLAN.md +1550 -0
  40. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/acceptance/matrix.py +6 -3
  41. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/acceptance/probes.py +3 -3
  42. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/failover.py +45 -10
  43. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/failover_track.py +37 -0
  44. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/profiles/README.md +4 -0
  45. messagefoundry-0.2.2/harness/load/profiles/malformed-load.toml +44 -0
  46. messagefoundry-0.2.2/harness/load/profiles/spike-burst.toml +50 -0
  47. messagefoundry-0.2.2/harness/load/profiles/sustained-overload.toml +51 -0
  48. messagefoundry-0.2.2/harness/load/profiles/writeamp.toml +41 -0
  49. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/__init__.py +1 -1
  50. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/__main__.py +77 -27
  51. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/api/app.py +78 -0
  52. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/api/models.py +30 -0
  53. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/settings.py +36 -4
  54. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/cluster.py +90 -7
  55. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/cluster_sqlserver.py +68 -22
  56. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/engine.py +13 -0
  57. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/retention.py +20 -0
  58. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/wiring_runner.py +21 -0
  59. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/scaffold.py +3 -3
  60. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/secrets_dpapi.py +3 -1
  61. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/store/base.py +24 -1
  62. messagefoundry-0.2.2/messagefoundry/store/crypto.py +271 -0
  63. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/store/postgres.py +198 -17
  64. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/store/sqlserver.py +310 -51
  65. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/store/store.py +221 -19
  66. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/verify/checks.py +5 -5
  67. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/verify/runner.py +73 -2
  68. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/verify/smoke.py +110 -1
  69. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/pyproject.toml +21 -22
  70. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/requirements.lock +9 -493
  71. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/publish/scan_forbidden.py +8 -0
  72. messagefoundry-0.2.2/scripts/service/import-db-ca.ps1 +97 -0
  73. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/anon/leak.py +3 -0
  74. messagefoundry-0.2.2/tests/conftest.py +171 -0
  75. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_api_auth.py +109 -1
  76. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_cli.py +102 -7
  77. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_cluster.py +24 -0
  78. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_cluster_failover_postgres.py +65 -0
  79. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_cluster_failover_sqlserver.py +59 -0
  80. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_cluster_graph_gating.py +51 -0
  81. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_cluster_lease.py +96 -6
  82. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_icon.py +1 -5
  83. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_status.py +15 -2
  84. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_db_lookup.py +49 -0
  85. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_dicom_scp.py +77 -1
  86. messagefoundry-0.2.2/tests/test_docs_runbooks.py +102 -0
  87. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_fifo_ordering.py +20 -0
  88. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_harness_scenarios.py +36 -18
  89. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_load_config.py +13 -0
  90. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_load_failover_postgres.py +6 -0
  91. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_load_failover_sqlserver.py +6 -0
  92. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_load_failover_unit.py +73 -2
  93. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_logging.py +3 -0
  94. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_postgres_store.py +181 -0
  95. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_response_capture.py +35 -0
  96. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_retention.py +43 -0
  97. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_scan_forbidden.py +19 -0
  98. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_smart_backend.py +60 -0
  99. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_sqlserver_store.py +353 -2
  100. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_startup_fault_isolation.py +20 -4
  101. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_store.py +201 -0
  102. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_store_encryption.py +262 -0
  103. messagefoundry-0.2.2/tests/test_store_ssl.py +76 -0
  104. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_verify.py +74 -0
  105. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_wiring_engine.py +102 -0
  106. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/uv.lock +2 -510
  107. messagefoundry-0.2.1/messagefoundry/store/crypto.py +0 -166
  108. messagefoundry-0.2.1/scripts/soak/store_soak.py +0 -92
  109. messagefoundry-0.2.1/tests/conftest.py +0 -279
  110. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.claude/settings.json +0 -0
  111. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.dockerignore +0 -0
  112. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.gitattributes +0 -0
  113. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/CODEOWNERS +0 -0
  114. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  115. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  116. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  117. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  118. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/dependabot.yml +0 -0
  119. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/workflows/cla.yml +0 -0
  120. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.github/workflows/dependabot-auto-merge.yml +0 -0
  121. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.gitignore +0 -0
  122. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.gitleaks.toml +0 -0
  123. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.pre-commit-config.yaml +0 -0
  124. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/.semgrep/messagefoundry.yml +0 -0
  125. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/CLA.md +0 -0
  126. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/CODE_OF_CONDUCT.md +0 -0
  127. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/COMMERCIAL-LICENSE.md +0 -0
  128. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/GOVERNANCE.md +0 -0
  129. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/LICENSE +0 -0
  130. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/MAINTAINERS.md +0 -0
  131. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/NOTICE +0 -0
  132. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docker/compose.yaml +0 -0
  133. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docker/k8s/secret.example.yaml +0 -0
  134. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docker/k8s/statefulset.yaml +0 -0
  135. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docker/secrets.env.example +0 -0
  136. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docker/smoke/Dockerfile +0 -0
  137. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docker/smoke/config/IB_Test_ADT.py +0 -0
  138. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docker/smoke/send_adt.py +0 -0
  139. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/ADOPTER-CI.md +0 -0
  140. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/AI.md +0 -0
  141. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/ARCHITECTURE.md +0 -0
  142. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/CI-QUALITY.md +0 -0
  143. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/CONTAINER-EXPOSURE-EVALUATION.md +0 -0
  144. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
  145. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
  146. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
  147. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/DEPLOYMENT.md +0 -0
  148. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/DICOM.md +0 -0
  149. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/DUAL_LICENSING_PLAN.md +0 -0
  150. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/FEATURE-MAP.md +0 -0
  151. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/HL7-VALIDATION.md +0 -0
  152. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/LOAD-TESTING.md +0 -0
  153. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/MessageFoundry-Mental-Model.docx +0 -0
  154. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
  155. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/REMOTE-CONSOLE.md +0 -0
  156. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/SUPPORT-POLICY.md +0 -0
  157. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/TEE-RELAY.md +0 -0
  158. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/THROUGHPUT-IMPROVEMENTS.md +0 -0
  159. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/WORKTREES.md +0 -0
  160. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
  161. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
  162. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
  163. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0005-transform-accessible-state.md +0 -0
  164. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0006-external-data-lookups.md +0 -0
  165. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
  166. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0008-cluster-observability-api.md +0 -0
  167. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0009-run-scoped-context-providers.md +0 -0
  168. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
  169. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0011-timer-scheduled-source.md +0 -0
  170. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0012-x12-edi-codec.md +0 -0
  171. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0013-increment-2-reingress-design.md +0 -0
  172. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0013-query-response-orchestration.md +0 -0
  173. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0014-alerting-rules-engine.md +0 -0
  174. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
  175. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
  176. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0017-consumer-deployment-model.md +0 -0
  177. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
  178. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
  179. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
  180. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
  181. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
  182. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0026-off-box-egress-update-check.md +0 -0
  183. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
  184. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
  185. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
  186. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/0032-console-desktop-launch.md +0 -0
  187. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/README.md +0 -0
  188. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/adr/TEMPLATE.md +0 -0
  189. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/architecture-components.png +0 -0
  190. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/architecture-components.svg +0 -0
  191. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/architecture-config-graph.png +0 -0
  192. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/architecture-config-graph.svg +0 -0
  193. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/architecture-diagram.md +0 -0
  194. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/architecture-message-flow.png +0 -0
  195. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/architecture-message-flow.svg +0 -0
  196. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/architecture-topology.png +0 -0
  197. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/architecture-topology.svg +0 -0
  198. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/benchmarks/TUNING-BASELINE.md +0 -0
  199. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
  200. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
  201. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
  202. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
  203. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
  204. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
  205. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/benchmarks/step-b-write-amplification.md +0 -0
  206. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/hl7-message-ordering-reference.md +0 -0
  207. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/message-ordering-design.md +0 -0
  208. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
  209. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
  210. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
  211. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
  212. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
  213. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/releases/MULTISESSION-PLAN.md +0 -0
  214. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
  215. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
  216. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
  217. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/releases/v0.1-PLAN.md +0 -0
  218. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
  219. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/research/cloud-deployment-research-2026-06.md +0 -0
  220. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/research/config-ux-review.md +0 -0
  221. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/research/non-hl7-transform-components.md +0 -0
  222. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
  223. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
  224. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/ADVISORY-PROCESS.md +0 -0
  225. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
  226. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
  227. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
  228. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
  229. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
  230. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/ASVS-L3-STATUS.md +0 -0
  231. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
  232. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
  233. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/BEYOND-ASVS-L3.md +0 -0
  234. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
  235. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/DEPENDENCY-METRICS.md +0 -0
  236. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
  237. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/PHASE-8C-RBAC.md +0 -0
  238. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/PUBLISHING.md +0 -0
  239. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/RCA-TEMPLATE.md +0 -0
  240. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/RELEASE-GATE.md +0 -0
  241. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/REMEDIATION-PLAN.md +0 -0
  242. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/REVIEW-2026-06-07.md +0 -0
  243. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
  244. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
  245. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/SECURITY-POSTURE.md +0 -0
  246. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
  247. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
  248. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
  249. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/security/THREAT-MODEL.md +0 -0
  250. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
  251. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/environments/dev.toml +0 -0
  252. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/environments/prod.toml +0 -0
  253. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/README.md +0 -0
  254. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/__main__.py +0 -0
  255. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/acceptance/__init__.py +0 -0
  256. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/acceptance/__main__.py +0 -0
  257. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/acceptance/report.py +0 -0
  258. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/acceptance/runner.py +0 -0
  259. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/compose.py +0 -0
  260. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/config/coverage.py +0 -0
  261. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/config/load/_shape.py +0 -0
  262. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/config/load/graph.py +0 -0
  263. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/file_panel.py +0 -0
  264. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/file_transport.py +0 -0
  265. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/__init__.py +0 -0
  266. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/corpus.py +0 -0
  267. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/correlator.py +0 -0
  268. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/enginepoll.py +0 -0
  269. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/governor.py +0 -0
  270. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/ids.py +0 -0
  271. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/metrics.py +0 -0
  272. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/profile.py +0 -0
  273. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/profiles/closed-loop.toml +0 -0
  274. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/profiles/failover.toml +0 -0
  275. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/profiles/fanout-baseline.toml +0 -0
  276. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/profiles/reference.toml +0 -0
  277. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/profiles/smoke-sqlserver.toml +0 -0
  278. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/profiles/smoke.toml +0 -0
  279. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/profiles/soak.toml +0 -0
  280. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/report.py +0 -0
  281. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/runner.py +0 -0
  282. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/sender.py +0 -0
  283. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/load/sink.py +0 -0
  284. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/mllp.py +0 -0
  285. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/monitor.py +0 -0
  286. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/receive.py +0 -0
  287. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/reconcile/__init__.py +0 -0
  288. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/reconcile/__main__.py +0 -0
  289. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/reconcile/capture.py +0 -0
  290. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/reconcile/compare.py +0 -0
  291. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/reconcile/normalize.py +0 -0
  292. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/reconcile/report.py +0 -0
  293. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/scenarios.py +0 -0
  294. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/send.py +0 -0
  295. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/harness/window.py +0 -0
  296. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/.gitignore +0 -0
  297. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/.vscodeignore +0 -0
  298. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/README.md +0 -0
  299. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/esbuild.js +0 -0
  300. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/media/hl7schema.json +0 -0
  301. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/media/icon.png +0 -0
  302. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/media/icon.svg +0 -0
  303. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/package-lock.json +0 -0
  304. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/package.json +0 -0
  305. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/snippets/messagefoundry.code-snippets +0 -0
  306. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/aiPolicy.ts +0 -0
  307. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/alertEditor.ts +0 -0
  308. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/auth.ts +0 -0
  309. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/chat.ts +0 -0
  310. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/cli.ts +0 -0
  311. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/completion.ts +0 -0
  312. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/connectionEditor.ts +0 -0
  313. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/engineClient.ts +0 -0
  314. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/extension.ts +0 -0
  315. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/generate.ts +0 -0
  316. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/git.ts +0 -0
  317. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/graphTree.ts +0 -0
  318. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/home.ts +0 -0
  319. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/newRoute.ts +0 -0
  320. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/promote.ts +0 -0
  321. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/sourceControl.ts +0 -0
  322. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/test/runTest.ts +0 -0
  323. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/test/suite/chat.test.ts +0 -0
  324. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/test/suite/extension.test.ts +0 -0
  325. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/test/suite/index.ts +0 -0
  326. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/testBench.ts +0 -0
  327. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/src/validate.ts +0 -0
  328. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/tsconfig.json +0 -0
  329. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/ide/tsconfig.test.json +0 -0
  330. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/mefor.code-workspace +0 -0
  331. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/adr_analyze.py +0 -0
  332. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/anon/__init__.py +0 -0
  333. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/anon/_pools.py +0 -0
  334. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/anon/hl7.py +0 -0
  335. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/anon/keying.py +0 -0
  336. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/anon/leak.py +0 -0
  337. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/anon/rules.py +0 -0
  338. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/anon/surrogates.py +0 -0
  339. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/api/__init__.py +0 -0
  340. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/api/approvals.py +0 -0
  341. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/api/auth_models.py +0 -0
  342. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/api/auth_routes.py +0 -0
  343. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/api/field_authz.py +0 -0
  344. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/api/metrics.py +0 -0
  345. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/api/security.py +0 -0
  346. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/api/tls.py +0 -0
  347. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/__init__.py +0 -0
  348. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
  349. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/data/common_passwords.txt +0 -0
  350. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/identity.py +0 -0
  351. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/ldap.py +0 -0
  352. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/notifications.py +0 -0
  353. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/passwords.py +0 -0
  354. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/permissions.py +0 -0
  355. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/policy.py +0 -0
  356. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/ratelimit.py +0 -0
  357. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/service.py +0 -0
  358. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/tokens.py +0 -0
  359. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/auth/totp.py +0 -0
  360. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/checks.py +0 -0
  361. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/__init__.py +0 -0
  362. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/active_environment.py +0 -0
  363. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/ai_policy.py +0 -0
  364. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/alerts_edit.py +0 -0
  365. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/code_sets.py +0 -0
  366. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/connections_edit.py +0 -0
  367. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/connections_file.py +0 -0
  368. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/db_lookup.py +0 -0
  369. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/environments.py +0 -0
  370. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/ingest_time.py +0 -0
  371. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/models.py +0 -0
  372. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/reference.py +0 -0
  373. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/response.py +0 -0
  374. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/run_context.py +0 -0
  375. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/state.py +0 -0
  376. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/tls_policy.py +0 -0
  377. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/config/wiring.py +0 -0
  378. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/__init__.py +0 -0
  379. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/__main__.py +0 -0
  380. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/_async.py +0 -0
  381. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/alerts_page.py +0 -0
  382. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/change_password.py +0 -0
  383. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/client.py +0 -0
  384. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/connections.py +0 -0
  385. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/dead_letters_page.py +0 -0
  386. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/delegates.py +0 -0
  387. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/icons/alerts.svg +0 -0
  388. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/icons/connections.svg +0 -0
  389. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/icons/dead-letters.svg +0 -0
  390. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/icons/engine-status.svg +0 -0
  391. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/icons/log-search.svg +0 -0
  392. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/icons/logo-lockup.svg +0 -0
  393. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/icons/users.svg +0 -0
  394. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/login.py +0 -0
  395. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/mfa.py +0 -0
  396. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/reauth.py +0 -0
  397. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/resources/README.md +0 -0
  398. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/resources/app.ico +0 -0
  399. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/resources/app.svg +0 -0
  400. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/search.py +0 -0
  401. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/service_control.py +0 -0
  402. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/sessions.py +0 -0
  403. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/shell.py +0 -0
  404. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/status.py +0 -0
  405. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/theme.py +0 -0
  406. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/users_page.py +0 -0
  407. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/console/widgets.py +0 -0
  408. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/README.md +0 -0
  409. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/__init__.py +0 -0
  410. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/_core.py +0 -0
  411. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/_hl7data.py +0 -0
  412. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/adt.py +0 -0
  413. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/all_types.py +0 -0
  414. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/bar.py +0 -0
  415. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/dft.py +0 -0
  416. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/documents.py +0 -0
  417. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/mdm.py +0 -0
  418. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/mfn.py +0 -0
  419. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/oml.py +0 -0
  420. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/orl.py +0 -0
  421. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/orm.py +0 -0
  422. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/oru.py +0 -0
  423. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/ras.py +0 -0
  424. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/rde.py +0 -0
  425. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/siu.py +0 -0
  426. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/generators/vxu.py +0 -0
  427. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/hl7schema.py +0 -0
  428. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/last_resort.py +0 -0
  429. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/logging_setup.py +0 -0
  430. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/__init__.py +0 -0
  431. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/binary.py +0 -0
  432. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/consistency.py +0 -0
  433. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/__init__.py +0 -0
  434. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/_deps.py +0 -0
  435. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/_util.py +0 -0
  436. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/dataset.py +0 -0
  437. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/errors.py +0 -0
  438. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
  439. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/peek.py +0 -0
  440. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/fhir/__init__.py +0 -0
  441. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/fhir/_deps.py +0 -0
  442. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/fhir/errors.py +0 -0
  443. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/fhir/peek.py +0 -0
  444. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/fhir/resource.py +0 -0
  445. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/groups.py +0 -0
  446. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/message.py +0 -0
  447. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/peek.py +0 -0
  448. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/split.py +0 -0
  449. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/summary.py +0 -0
  450. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/tree.py +0 -0
  451. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/validate.py +0 -0
  452. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/__init__.py +0 -0
  453. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/delimiters.py +0 -0
  454. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/errors.py +0 -0
  455. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/interchange.py +0 -0
  456. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/message.py +0 -0
  457. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/peek.py +0 -0
  458. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/__init__.py +0 -0
  459. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/alert_sinks.py +0 -0
  460. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/alerts.py +0 -0
  461. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/cert_expiry.py +0 -0
  462. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/config_convergence.py +0 -0
  463. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/dryrun.py +0 -0
  464. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/leader_tasks.py +0 -0
  465. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/reference_sync.py +0 -0
  466. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/security_notify.py +0 -0
  467. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/pipeline/state_convergence.py +0 -0
  468. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/py.typed +0 -0
  469. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/redaction.py +0 -0
  470. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/store/__init__.py +0 -0
  471. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/store/audit_tee.py +0 -0
  472. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/store/keyprovider.py +0 -0
  473. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/timezone.py +0 -0
  474. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/__init__.py +0 -0
  475. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/base.py +0 -0
  476. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/database.py +0 -0
  477. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/dicom.py +0 -0
  478. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/dicomweb.py +0 -0
  479. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/fhir.py +0 -0
  480. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/file.py +0 -0
  481. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/framing.py +0 -0
  482. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/loopback.py +0 -0
  483. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/mllp.py +0 -0
  484. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/remotefile.py +0 -0
  485. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/rest.py +0 -0
  486. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/signing.py +0 -0
  487. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/smart.py +0 -0
  488. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/soap.py +0 -0
  489. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/tcp.py +0 -0
  490. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/timer.py +0 -0
  491. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/transports/x12.py +0 -0
  492. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/verify/__init__.py +0 -0
  493. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/verify/model.py +0 -0
  494. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/messagefoundry/verify/report.py +0 -0
  495. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/config/IB_ACME_ADT.py +0 -0
  496. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/config/IB_FHIR_INTAKE.py +0 -0
  497. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
  498. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/config/IB_PARTNER_X12.py +0 -0
  499. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/config/IB_RADIOLOGY_SR.py +0 -0
  500. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
  501. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/config/adt.py +0 -0
  502. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/config/codesets/event_labels.csv +0 -0
  503. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/config/codesets/facility_mnemonics.toml +0 -0
  504. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/config/connections.toml +0 -0
  505. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/consistency/validated_adt.py +0 -0
  506. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/dicom/generate_sr_sample.py +0 -0
  507. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/adt_a01.hl7 +0 -0
  508. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/adt_batch.hl7 +0 -0
  509. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
  510. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/README.md +0 -0
  511. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
  512. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
  513. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
  514. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
  515. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
  516. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
  517. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
  518. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/messages/x12_270_eligibility.edi +0 -0
  519. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/results_relay/README.md +0 -0
  520. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/results_relay/codesets/test_codes.csv +0 -0
  521. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
  522. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/results_relay/messages/oru_results.hl7 +0 -0
  523. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/results_relay/results_relay.py +0 -0
  524. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/samples/send_mllp.py +0 -0
  525. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/console/install-console-shortcut.ps1 +0 -0
  526. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/console/pack_ico.py +0 -0
  527. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
  528. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/dev/postgres.ps1 +0 -0
  529. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/dev/sqlserver-docker.ps1 +0 -0
  530. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/dev/sqlserver.ps1 +0 -0
  531. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
  532. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/publish/check_release_sync.py +0 -0
  533. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/publish/publish-denylist.txt +0 -0
  534. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/publish/publish.ps1 +0 -0
  535. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/security/crypto_inventory_check.py +0 -0
  536. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/security/vuln_metrics.py +0 -0
  537. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/service/install-service.ps1 +0 -0
  538. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/service/uninstall-service.ps1 +0 -0
  539. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/trace_icon.py +0 -0
  540. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/worktree/new.ps1 +0 -0
  541. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/worktree/remove.ps1 +0 -0
  542. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/worktree/session-context.ps1 +0 -0
  543. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/scripts/worktree/spawn.ps1 +0 -0
  544. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/__init__.py +0 -0
  545. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/__main__.py +0 -0
  546. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/anon/__init__.py +0 -0
  547. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/anon/_hl7data.py +0 -0
  548. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/anon/_pools.py +0 -0
  549. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/anon/hl7.py +0 -0
  550. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/anon/keying.py +0 -0
  551. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/anon/rules.py +0 -0
  552. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/anon/surrogates.py +0 -0
  553. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/compare.py +0 -0
  554. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/correlate.py +0 -0
  555. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/hl7_fields.py +0 -0
  556. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/mefor_api.py +0 -0
  557. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/mllp.py +0 -0
  558. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/relay.py +0 -0
  559. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/report.py +0 -0
  560. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tee/store.py +0 -0
  561. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/_dicom_sample.py +0 -0
  562. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/_failover_load_support.py +0 -0
  563. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/_fhir_fixtures.py +0 -0
  564. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_acceptance_framework.py +0 -0
  565. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_active_environment.py +0 -0
  566. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_ad_group_scope.py +0 -0
  567. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_admin_new_ip.py +0 -0
  568. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_adr_analyze.py +0 -0
  569. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_ai_policy.py +0 -0
  570. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_alert_rules.py +0 -0
  571. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_alert_sinks.py +0 -0
  572. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_alerts_edit.py +0 -0
  573. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_alerts_rules_api.py +0 -0
  574. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_anon_core.py +0 -0
  575. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_anon_integration.py +0 -0
  576. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_anon_parity.py +0 -0
  577. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_api.py +0 -0
  578. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_api_reload.py +0 -0
  579. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_api_tls.py +0 -0
  580. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_approvals.py +0 -0
  581. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_asvs_phase0.py +0 -0
  582. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_audit_integrity.py +0 -0
  583. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_audit_offbox_tee.py +0 -0
  584. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_auth_core.py +0 -0
  585. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_auth_entry_hardening.py +0 -0
  586. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_auth_hardening.py +0 -0
  587. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_auth_service.py +0 -0
  588. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_auth_session_lifecycle.py +0 -0
  589. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_auth_store.py +0 -0
  590. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_binary_carriage.py +0 -0
  591. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_cert_expiry.py +0 -0
  592. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_channel_rbac.py +0 -0
  593. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_checks.py +0 -0
  594. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_code_sets.py +0 -0
  595. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_connection_api.py +0 -0
  596. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_connection_resilience.py +0 -0
  597. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_connections_cli.py +0 -0
  598. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_connections_file.py +0 -0
  599. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_consistency.py +0 -0
  600. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_alerts.py +0 -0
  601. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_auth.py +0 -0
  602. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_client.py +0 -0
  603. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_dead_letters.py +0 -0
  604. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_hardening.py +0 -0
  605. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_password.py +0 -0
  606. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_sessions.py +0 -0
  607. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_step_up.py +0 -0
  608. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_theme.py +0 -0
  609. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_users.py +0 -0
  610. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_console_widgets.py +0 -0
  611. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_database_connector_integration.py +0 -0
  612. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_database_transport.py +0 -0
  613. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_db_lookup_live_runner.py +0 -0
  614. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_delivery_settings.py +0 -0
  615. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_dependency_boundaries.py +0 -0
  616. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_dicom_codec.py +0 -0
  617. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_dicom_scu.py +0 -0
  618. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_dicom_wiring.py +0 -0
  619. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_dicomweb.py +0 -0
  620. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_dryrun.py +0 -0
  621. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_ed_documents.py +0 -0
  622. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_ed_documents_e2e.py +0 -0
  623. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_egress_allowlist.py +0 -0
  624. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_environments.py +0 -0
  625. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_fhir_parsing.py +0 -0
  626. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_fhir_resource.py +0 -0
  627. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_fhir_transport.py +0 -0
  628. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_field_authz.py +0 -0
  629. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_generate_cli.py +0 -0
  630. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_generated_adt.py +0 -0
  631. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_generators_core.py +0 -0
  632. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_generators_types.py +0 -0
  633. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_groups.py +0 -0
  634. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_harness.py +0 -0
  635. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_harness_compose.py +0 -0
  636. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_harness_config.py +0 -0
  637. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_harness_faults.py +0 -0
  638. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_harness_file.py +0 -0
  639. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_harness_monitor.py +0 -0
  640. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_hl7_core_features.py +0 -0
  641. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_hl7schema.py +0 -0
  642. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_inbound_bind.py +0 -0
  643. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_ingest_time.py +0 -0
  644. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_keyprovider.py +0 -0
  645. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_last_resort.py +0 -0
  646. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_leader_tasks.py +0 -0
  647. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_load_corpus.py +0 -0
  648. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_load_metrics.py +0 -0
  649. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_load_profile.py +0 -0
  650. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_load_report.py +0 -0
  651. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_load_runner.py +0 -0
  652. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_load_sender.py +0 -0
  653. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_load_sink.py +0 -0
  654. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_message.py +0 -0
  655. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_message_split.py +0 -0
  656. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_metrics_exporter.py +0 -0
  657. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_mfa.py +0 -0
  658. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_mllp_encoding_override.py +0 -0
  659. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_mllp_tls.py +0 -0
  660. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_operability_config.py +0 -0
  661. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_outbound_signing.py +0 -0
  662. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_outbound_simulate.py +0 -0
  663. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_packaging.py +0 -0
  664. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_parse_tree.py +0 -0
  665. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_parsing.py +0 -0
  666. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_payload_agnostic_ingress.py +0 -0
  667. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_reconcile_capture.py +0 -0
  668. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_reconcile_compare.py +0 -0
  669. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_reconcile_harness.py +0 -0
  670. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_redaction.py +0 -0
  671. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_reference_sets.py +0 -0
  672. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_reingress.py +0 -0
  673. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_remotefile_transport.py +0 -0
  674. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_rest_transport.py +0 -0
  675. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_run_context.py +0 -0
  676. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_scaffold.py +0 -0
  677. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_secrets_dpapi.py +0 -0
  678. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_security_notify.py +0 -0
  679. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_security_static.py +0 -0
  680. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_service_control.py +0 -0
  681. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_settings.py +0 -0
  682. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_soap_transport.py +0 -0
  683. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_soap_wssecurity.py +0 -0
  684. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_sqlserver_coordinator.py +0 -0
  685. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_staged_pipeline.py +0 -0
  686. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_stats_reset.py +0 -0
  687. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_step_up.py +0 -0
  688. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_store_backend.py +0 -0
  689. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_store_file_hardening.py +0 -0
  690. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_store_read_pool.py +0 -0
  691. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_summary.py +0 -0
  692. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_task_resilience.py +0 -0
  693. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_tcp_transport.py +0 -0
  694. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_tee_cli.py +0 -0
  695. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_tee_compare.py +0 -0
  696. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_tee_correlate.py +0 -0
  697. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_tee_hl7_fields.py +0 -0
  698. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_tee_mefor_api.py +0 -0
  699. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_tee_mllp.py +0 -0
  700. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_tee_relay.py +0 -0
  701. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_tee_report.py +0 -0
  702. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_tee_store.py +0 -0
  703. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_timer_source.py +0 -0
  704. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_timezone.py +0 -0
  705. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_tls_policy.py +0 -0
  706. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_totp.py +0 -0
  707. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_transform_state.py +0 -0
  708. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_transports.py +0 -0
  709. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_version.py +0 -0
  710. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_win2025_acceptance.py +0 -0
  711. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_wiring.py +0 -0
  712. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_wiring_reload.py +0 -0
  713. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_wiring_serve.py +0 -0
  714. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_x12_parsing.py +0 -0
  715. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_x12_rte.py +0 -0
  716. {messagefoundry-0.2.1 → messagefoundry-0.2.2}/tests/test_x12_transport.py +0 -0
@@ -12,9 +12,14 @@ verify a report against current `main` before filing.
12
12
 
13
13
  **Do not open a public issue for a vulnerability.** Instead, report it privately:
14
14
 
15
- - Preferred: open a [GitHub private security advisory](https://github.com/wshallwshall/MessageFoundry/security/advisories/new)
16
- ("Report a vulnerability"), or
17
- - Email the maintainer at the address on the GitHub profile.
15
+ - **Preferred (always available, fully private):** open a [GitHub private security advisory](https://github.com/wshallwshall/MessageFoundry/security/advisories/new)
16
+ ("Report a vulnerability") — GitHub keeps it private to the maintainers until coordinated disclosure.
17
+ This is the recommended channel on both this repository and the public mirror.
18
+ - Alternatively, email the maintainer at the address on the GitHub profile.
19
+
20
+ If you cannot reach a maintainer privately within a few business days, you may request a contact via a
21
+ **non-detail** public issue (title only, e.g. "requesting a private security contact") — **never** put
22
+ vulnerability details, reproduction steps, or any message content in a public issue.
18
23
 
19
24
  Please include: affected component (e.g. MLLP/file transport, store, API/auth, console),
20
25
  a description and impact, and reproduction steps or a proof of concept. Do **not** include
@@ -31,7 +31,7 @@ jobs:
31
31
  - name: Set up Python
32
32
  uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
33
33
  with:
34
- python-version: "3.13"
34
+ python-version: "3.14"
35
35
  - name: Install project (dev)
36
36
  run: |
37
37
  python -m pip install --upgrade pip
@@ -92,7 +92,7 @@ jobs:
92
92
  - name: Set up Python
93
93
  uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
94
94
  with:
95
- python-version: "3.13"
95
+ python-version: "3.14"
96
96
  - name: Install project (dev + postgres)
97
97
  run: |
98
98
  python -m pip install --upgrade pip
@@ -159,7 +159,7 @@ jobs:
159
159
  - name: Set up Python
160
160
  uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
161
161
  with:
162
- python-version: "3.13"
162
+ python-version: "3.14"
163
163
  - name: Install Microsoft ODBC Driver 18 + sqlcmd
164
164
  run: |
165
165
  curl -fsSL https://packages.microsoft.com/keys/microsoft.asc \
@@ -11,37 +11,23 @@ concurrency:
11
11
  cancel-in-progress: true
12
12
 
13
13
  jobs:
14
- # Lint + type-check + unit tests. Linux carries the cheap breadththe 3.11
15
- # floor plus a fast early-fail leg on the newest 3.14 (1x minutes). Windows
16
- # Server 2022 + 2025 is the primary deployment target, so it covers BOTH the
17
- # current (3.13) and the new (3.14) deploy Python on each Server SKU, even
18
- # though Windows bills at 2x — testing the version we ship on the OS we ship it
19
- # on is worth the minutes.
14
+ # Lint + type-check + unit tests. The project supports a single Python — 3.14 — so every leg runs it.
15
+ # Linux carries the cheap breadth (1x minutes); Windows Server 2022 + 2025 is the primary deployment
16
+ # target, so 3.14 is also exercised on both Server SKUs even though Windows bills at 2x — testing the
17
+ # version we ship on the OS we ship it on is worth the minutes.
20
18
  test:
21
19
  name: test (${{ matrix.os }}, py${{ matrix.python-version }})
22
20
  runs-on: ${{ matrix.os }}
23
- # py3.11 is a REQUIRED gate again (BACKLOG #17 RESOLVED in PR #448). The intermittent py3.11-only hang
24
- # was root-caused — and reproduced on a Docker py3.11 box — as a CPython 3.11 asyncio cancellation race:
25
- # cancelling a task parked in asyncio.Queue.get() can intermittently never complete (fixed in CPython
26
- # 3.12, hence py3.13 was always clean and production — one long-lived loop — never hit it). TeeRelay.stop()
27
- # tripped it; fixed via a sentinel shutdown in tee/relay.py, validated at 0 hangs across 24 full-suite +
28
- # 40 isolated runs in the repro container and green on CI. So the advisory `continue-on-error` is removed
29
- # and a py3.11 failure reds the build again. (The dormant `MEFOR_PY311_QUARANTINE` conftest lever stays as
30
- # an off-by-default safety net; it is no longer needed.)
31
21
  # Wall-clock backstop: bound each leg so a hung test fails in minutes, not the 6h default. The
32
22
  # pytest-timeout watchdog (60s/test) should catch a culprit first; this is the belt-and-suspenders cap
33
- # if a whole process ever deadlocks below pytest (e.g. a future regression of BACKLOG #17).
23
+ # if a whole process ever deadlocks below pytest.
34
24
  timeout-minutes: 15
35
25
  strategy:
36
26
  fail-fast: false
37
27
  matrix:
38
28
  include:
39
- - { os: ubuntu-latest, python-version: "3.11" }
40
- - { os: ubuntu-latest, python-version: "3.13" }
41
29
  - { os: ubuntu-latest, python-version: "3.14" }
42
- - { os: windows-2022, python-version: "3.13" }
43
30
  - { os: windows-2022, python-version: "3.14" }
44
- - { os: windows-2025, python-version: "3.13" }
45
31
  - { os: windows-2025, python-version: "3.14" }
46
32
  defaults:
47
33
  run:
@@ -89,36 +75,6 @@ jobs:
89
75
  QT_QPA_PLATFORM: offscreen
90
76
  run: pytest -q
91
77
 
92
- # BACKLOG #17 production-bug check. The intermittent py3.11 asyncio<->aiosqlite lost-wakeup hang has
93
- # only ever surfaced under pytest (per-test event-loop churn + log-capture teardown are the suspected
94
- # triggers). This job runs the store the way the engine does in PRODUCTION — one asyncio.run() loop,
95
- # no pytest — and hammers aiosqlite with concurrent DB ops on py3.11. A clean pass is evidence the
96
- # hang is a test-lifecycle artifact, not a product defect; a hang here (caught by the per-run
97
- # `timeout`, exit 124) would be a real, pytest-free repro that flips it to a confirmed product bug.
98
- py311-store-soak:
99
- name: py3.11 store soak (BACKLOG #17)
100
- runs-on: ubuntu-latest
101
- timeout-minutes: 10
102
- steps:
103
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
104
- - name: Set up Python 3.11
105
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
106
- with:
107
- python-version: "3.11"
108
- cache: pip
109
- cache-dependency-path: pyproject.toml
110
- - name: Install project (base — no pytest, no console)
111
- run: |
112
- python -m pip install --upgrade pip
113
- pip install -e .
114
- - name: Soak the aiosqlite store on one long-lived loop (5x)
115
- run: |
116
- for run in $(seq 1 5); do
117
- echo "::group::soak run $run"
118
- timeout 150 python scripts/soak/store_soak.py 64 300
119
- echo "::endgroup::"
120
- done
121
-
122
78
  # Build + type-check the VS Code extension, and run its integration tests. The Python jobs never
123
79
  # touch ide/, so a dep bump or IDE code change that breaks the bundle or the types would otherwise
124
80
  # pass CI unbuilt (this job exists because an esbuild bump merged "green" without anything having
@@ -235,7 +191,7 @@ jobs:
235
191
  - name: Set up Python
236
192
  uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
237
193
  with:
238
- python-version: "3.13"
194
+ python-version: "3.14"
239
195
 
240
196
  - name: Install Microsoft ODBC Driver 18 + sqlcmd
241
197
  run: |
@@ -379,7 +335,7 @@ jobs:
379
335
  - name: Set up Python
380
336
  uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
381
337
  with:
382
- python-version: "3.13"
338
+ python-version: "3.14"
383
339
 
384
340
  - name: Install project (dev + postgres extras)
385
341
  run: |
@@ -437,7 +393,7 @@ jobs:
437
393
  - name: Set up Python
438
394
  uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
439
395
  with:
440
- python-version: "3.13"
396
+ python-version: "3.14"
441
397
 
442
398
  - name: Install project (dev — engine + httpx client; no Qt needed for the headless load path)
443
399
  run: |
@@ -509,7 +465,7 @@ jobs:
509
465
  - name: Set up Python
510
466
  uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
511
467
  with:
512
- python-version: "3.13"
468
+ python-version: "3.14"
513
469
 
514
470
  - name: Install Microsoft ODBC Driver 18 + sqlcmd
515
471
  run: |
@@ -590,12 +546,11 @@ jobs:
590
546
  strategy:
591
547
  fail-fast: false
592
548
  matrix:
593
- # Windows Server 2022 + 2025 on the current deploy Python (3.13); plus the new 3.14 deploy
594
- # target on 2025 (newest Server) so the real NSSM install->serve->MLLP path is validated on
595
- # the version we will ship. This job is push/dispatch-only, so the extra leg costs no PR time.
549
+ # Windows Server 2022 + 2025 on the supported deploy Python (3.14), so the real NSSM
550
+ # install->serve->MLLP path is validated on the version we ship, on each Server SKU. This job
551
+ # is push/dispatch-only, so the Windows minutes cost no PR time.
596
552
  include:
597
- - { os: windows-2022, python-version: "3.13" }
598
- - { os: windows-2025, python-version: "3.13" }
553
+ - { os: windows-2022, python-version: "3.14" }
599
554
  - { os: windows-2025, python-version: "3.14" }
600
555
  defaults:
601
556
  run:
@@ -802,9 +757,19 @@ jobs:
802
757
  # A fully graceful shutdown exits 0 (uvicorn handles SIGTERM, runs the lifespan, returns); 143
803
758
  # (128+SIGTERM) is acceptable too. 137 = SIGKILL after the grace expired = ungraceful.
804
759
  if [ "$code" = "137" ]; then echo "FAIL: ungraceful shutdown (SIGKILL after grace)"; exit 1; fi
805
- docker logs mefor 2>&1 | grep -q "Application shutdown complete" \
806
- || { echo "FAIL: no clean-shutdown marker (lifespan shutdown did not complete)"; exit 1; }
807
- echo "graceful shutdown verified"
760
+ # Poll for the marker: `docker stop` returns the instant the container exits, but the final
761
+ # buffered log line ("Application shutdown complete") can land in `docker logs` a beat later, so
762
+ # grepping once immediately is racy (a clean 143 shutdown then read as a missing marker). Retry
763
+ # for ~10s so a slow log flush is not misread as an incomplete lifespan shutdown.
764
+ for _ in $(seq 1 20); do
765
+ if docker logs mefor 2>&1 | grep -q "Application shutdown complete"; then
766
+ echo "graceful shutdown verified"; exit 0
767
+ fi
768
+ sleep 0.5
769
+ done
770
+ echo "FAIL: no clean-shutdown marker (lifespan shutdown did not complete)"
771
+ docker logs mefor 2>&1 | tail -20
772
+ exit 1
808
773
 
809
774
  - name: Engine log (always)
810
775
  if: always()
@@ -820,7 +785,7 @@ jobs:
820
785
  # `windows-service-smoke`) report `skipped` on every PR — never the required context a PR waits
821
786
  # on — so requiring them either no-ops or wedges; and
822
787
  # * the matrix legs report an UNEXPANDED name when skipped (`... ${{ matrix.label }}`) but
823
- # EXPANDED names when they run (`... 2022`/`2025`, `(windows-2022, py3.13)`), so no single
788
+ # EXPANDED names when they run (`... 2022`/`2025`, `(windows-2022, py3.14)`), so no single
824
789
  # context string matches both the skipped and the run state.
825
790
  # This gate ALWAYS runs (if: always()), so it reports ONE fixed context ("CI gate") regardless of
826
791
  # which legs ran, and fails iff a gated leg actually FAILED or was cancelled — a `skipped` leg
@@ -60,7 +60,7 @@ jobs:
60
60
  # code runs in this job (uv lock --check + uv export only).
61
61
 
62
62
  - name: Set up uv
63
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
63
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
64
64
 
65
65
  - name: Re-export the lock files (DEP-1 — byte-for-byte identical flags/paths)
66
66
  run: |
@@ -29,7 +29,7 @@ jobs:
29
29
  fetch-depth: 0 # need the vX.Y.Z tags (the private-tag side of the check)
30
30
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
31
31
  with:
32
- python-version: "3.13"
32
+ python-version: "3.14"
33
33
  - name: Check tag / PyPI / mirror are in sync
34
34
  run: |
35
35
  # The script lives under the deny-listed scripts/publish/, so it is ABSENT on the OSS mirror;
@@ -40,7 +40,7 @@ jobs:
40
40
  - name: Set up Python
41
41
  uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
42
42
  with:
43
- python-version: "3.13"
43
+ python-version: "3.14"
44
44
 
45
45
  - name: Build sdist + wheel
46
46
  run: |
@@ -32,7 +32,7 @@ jobs:
32
32
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
33
33
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
34
34
  with:
35
- python-version: "3.13"
35
+ python-version: "3.14"
36
36
  - name: Check the lockfile is in sync with pyproject (DEP-1)
37
37
  run: |
38
38
  python -m pip install --upgrade pip uv
@@ -94,11 +94,14 @@ jobs:
94
94
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
95
95
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
96
96
  with:
97
- python-version: "3.13"
97
+ python-version: "3.14"
98
98
  - name: Generate a CycloneDX SBOM from the lockfile
99
99
  run: |
100
- python -m pip install --upgrade pip "cyclonedx-bom~=4.6"
101
- cyclonedx-py requirements requirements.lock --output-format JSON --outfile sbom.cdx.json
100
+ # cyclonedx-bom~=7.3 (was ~=4.6): the 4.x line drags cyclonedx-python-lib 7.x → lxml<6, which
101
+ # has no cp314 wheel, so on the 3.14 runner pip source-builds lxml and fails. 7.3 → lxml 6.x
102
+ # (cp314 wheels). The 7.x `requirements` CLI renamed `--outfile` → `--output-file`.
103
+ python -m pip install --upgrade pip "cyclonedx-bom~=7.3"
104
+ cyclonedx-py requirements requirements.lock --output-format JSON --output-file sbom.cdx.json
102
105
  - name: Upload the SBOM artifact
103
106
  # SHA-pinned for supply-chain integrity, matching ci.yml's upload-artifact pin.
104
107
  uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
@@ -115,7 +118,7 @@ jobs:
115
118
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
116
119
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
117
120
  with:
118
- python-version: "3.13"
121
+ python-version: "3.14"
119
122
  - name: Scan source for insecure patterns
120
123
  run: |
121
124
  # Pin bandit: an unpinned upgrade once silently changed `# nosec` parsing (1.9.x requires
@@ -162,7 +165,7 @@ jobs:
162
165
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
163
166
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
164
167
  with:
165
- python-version: "3.13"
168
+ python-version: "3.14"
166
169
  - name: Run the MessageFoundry rules
167
170
  run: |
168
171
  python -m pip install --upgrade pip "semgrep~=1.90"
@@ -182,7 +185,7 @@ jobs:
182
185
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
183
186
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
184
187
  with:
185
- python-version: "3.13"
188
+ python-version: "3.14"
186
189
  - name: Diff crypto call sites against the inventory
187
190
  # Stdlib-only (no install). Exits non-zero — failing the build — on any drift.
188
191
  run: python scripts/security/crypto_inventory_check.py
@@ -200,7 +203,7 @@ jobs:
200
203
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
201
204
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
202
205
  with:
203
- python-version: "3.13"
206
+ python-version: "3.14"
204
207
  - name: Scan the publishable subset for forbidden content
205
208
  # Stdlib-only scanner (no install). Exits non-zero — failing the build — on any hit. The scanner
206
209
  # lives under the deny-listed scripts/publish/, so it is ABSENT on the OSS mirror — there's
@@ -25,7 +25,7 @@ jobs:
25
25
  - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
26
26
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
27
27
  with:
28
- python-version: "3.13"
28
+ python-version: "3.14"
29
29
  - name: Compute the metrics (real Dependabot PRs + CISA KEV + FIRST EPSS)
30
30
  env:
31
31
  GH_TOKEN: ${{ github.token }} # gh auth for the read-only Dependabot-PR query
@@ -6,6 +6,57 @@ All notable changes to MessageFoundry are documented here. The format follows
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.2.2] — 2026-06-24 — Early Access
10
+
11
+ A security-hardening release: PHI-at-rest encryption is closed across every backend, the active-passive
12
+ cluster gains a store-checked split-brain fence, outbound delivery is effectively-once, and the at-rest
13
+ cipher becomes crypto-agile — all additive, with the on-disk `mfenc:v1` format byte-identical.
14
+
15
+ ### Changed
16
+ - **BREAKING — Python 3.14 is now the only supported runtime.** `requires-python` is raised to `>=3.14`
17
+ (was `>=3.11`), and the ruff/mypy targets, CI matrix (Linux + Windows Server 2022/2025, all on 3.14),
18
+ Docker base image, lockfiles, and adopter scaffold move with it. **Adopters and engine hosts must be on
19
+ Python 3.14** — a 3.11/3.12/3.13 host will refuse to install the wheel. The 3.11/3.12/3.13-specific test
20
+ apparatus is retired with this change (the `MEFOR_PY311_QUARANTINE` conftest lever, the `py3.11 store
21
+ soak` CI job, and `scripts/soak/store_soak.py`; the underlying BACKLOG #17 asyncio↔aiosqlite concern is
22
+ still mitigated by the shared session loop in `pyproject.toml`).
23
+
24
+ ### Security
25
+ - **PHI-at-rest encryption closed across all three backends.** The patient `summary` (MRN + name) and
26
+ `metadata` columns are now encrypted at rest (previously cleartext even with encryption enabled), and the
27
+ SQL Server `error` / `last_error` / `message_events.detail` columns are brought to parity with SQLite and
28
+ Postgres — every cipher column is now AES-256-GCM at rest. Coverage is surfaced by a new authenticated,
29
+ audited `GET /security/posture` route (reports the active-key fingerprint + per-backend column coverage;
30
+ never key bytes).
31
+ - **Fail-closed for PHI without a key.** An instance declared `data_class = phi` now **refuses to start**
32
+ without an encryption key (previously it started in cleartext with a warning), unless explicitly overridden
33
+ by the new, audited `[store].allow_unencrypted_phi`.
34
+ - **Crypto-agility marker (additive).** The at-rest cipher marker is now version/algorithm-aware
35
+ (`mfenc:v2:<alg>:…`) so a future algorithm can be introduced without a data migration. The `mfenc:v1`
36
+ format is byte-identical and AES-256-GCM remains the only algorithm; decryption fails closed on an unknown
37
+ marker version or algorithm.
38
+ - **Database-TLS hardening.** A new `[store].ssl_root_cert` pins a private database CA (Postgres), with
39
+ machine-store CA-import and certificate-rotation operator runbooks. The DPAPI key file's ACL now grants the
40
+ service account read access without broadening exposure.
41
+
42
+ ### Added
43
+ - **Active-passive split-brain fence.** A monotonic leader-epoch fencing token on the leadership lease,
44
+ validated inside the FIFO claim transaction, so a superseded or paused ex-leader that resumes is fenced out
45
+ (it claims nothing) — backed by continuous "at most one leader" SLO checks and a real-handover failover
46
+ test. SQLite (single-node) behavior is unchanged.
47
+ - **Effectively-once outbound delivery.** A same-transaction idempotency ledger skips re-delivery of an
48
+ already-delivered message after a failover or crash-recovery re-claim, without re-ordering a lane; an
49
+ operator-initiated replay still re-sends.
50
+ - **Pre-side-effect leadership re-checks** so a node that loses leadership between claiming and sending
51
+ re-queues the work rather than emitting it as a stale leader.
52
+ - `messagefoundry verify --check-disposition` for post-deploy disposition validation.
53
+
54
+ ### Fixed
55
+ - CycloneDX SBOM generation on Python 3.14.
56
+ - PyPI long-description rendering (version pins, links).
57
+ - De-flaked several intermittent CI tests (failover-load timeouts, a harness server port-bind race, the
58
+ startup fault-isolation recovery assertion, and the docker-smoke shutdown-marker check).
59
+
9
60
  ## [0.2.1] — 2026-06-23 — Early Access
10
61
 
11
62
  ### Fixed
@@ -242,7 +242,7 @@ diverge enough to warrant it; keep this root file general.
242
242
 
243
243
  ## 6. Python Code Standards
244
244
 
245
- - Target **Python 3.11+**. Type-hint all public functions/attributes — **mypy runs in strict
245
+ - Target **Python 3.14+** (the project requires `>=3.14`). Type-hint all public functions/attributes — **mypy runs in strict
246
246
  mode**.
247
247
  - **asyncio core:** never block the event loop; use `aiosqlite` and async connectors. Long
248
248
  loops/workers must be **cooperatively cancellable** (respond to the connection's stop signal)
@@ -41,7 +41,7 @@ maintainer.)
41
41
  to `main` are blocked. Keep commits coherent (one logical layer per commit) with clear messages.
42
42
  2. **Set up the environment** (Windows/PowerShell shown; adapt for your OS):
43
43
  ```powershell
44
- py -3.11 -m venv .venv
44
+ py -3.14 -m venv .venv
45
45
  .\.venv\Scripts\Activate.ps1
46
46
  pip install -e ".[dev,console]"
47
47
  ```
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: messagefoundry
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Open-source healthcare integration engine — route, transform, and validate messages across many formats and connection types
5
5
  License-Expression: AGPL-3.0-or-later
6
6
  License-File: LICENSE
7
7
  License-File: NOTICE
8
- Requires-Python: >=3.11
8
+ Requires-Python: >=3.14
9
9
  Requires-Dist: aiosqlite>=0.20
10
10
  Requires-Dist: argon2-cffi>=23.1
11
11
  Requires-Dist: cryptography>=48.0.1
@@ -55,14 +55,15 @@ Description-Content-Type: text/markdown
55
55
 
56
56
  [![CI](https://github.com/wshallwshall/MessageFoundry/actions/workflows/ci.yml/badge.svg)](https://github.com/wshallwshall/MessageFoundry/actions/workflows/ci.yml)
57
57
  [![Security](https://github.com/wshallwshall/MessageFoundry/actions/workflows/security.yml/badge.svg)](https://github.com/wshallwshall/MessageFoundry/actions/workflows/security.yml)
58
- [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE)
59
- [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg)](pyproject.toml)
58
+ [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://github.com/wshallwshall/MessageFoundry/blob/main/LICENSE)
59
+ [![Python 3.14+](https://img.shields.io/badge/python-3.14%2B-blue.svg)](https://github.com/wshallwshall/MessageFoundry/blob/main/pyproject.toml)
60
60
 
61
- MessageFoundry is an **open-source integration engine for healthcare**. It connects clinical and
62
- business systems routing, transforming, and validating messages across many formats (HL7 v2, JSON,
63
- XML/SOAP, X12, database records) and connection types (MLLP, TCP, HTTP/REST, SOAP, database, files,
64
- SFTP/FTP). Configure it with guided tooling or extend it in Python; it runs on SQLite or PostgreSQL
65
- with authentication, RBAC, audit, and encryption-at-rest built in.
61
+ MessageFoundry is an **open-source healthcare integration engine** a modern, Python-native HL7
62
+ interface engine. It connects clinical and business systems by routing, transforming, and validating
63
+ messages across many formats (HL7 v2, JSON, XML/SOAP, X12, database records) and connection types
64
+ (MLLP, MLLP-over-TLS, TCP, HTTP/REST, SOAP, FHIR, DICOM, database, files, SFTP/FTP). Configure it with
65
+ guided tooling or extend it in Python; it runs on SQLite, PostgreSQL, or SQL Server with
66
+ authentication, RBAC, audit logging, and encryption-at-rest built in.
66
67
 
67
68
  > Python import package: `messagefoundry`. Built with **hl7apy** + **python-hl7** (HL7 parsing/
68
69
  > validation), **FastAPI** (engine API), and **PySide6** (admin console).
@@ -82,10 +83,10 @@ The PySide6 console talks to it over a localhost HTTP + WebSocket API — the sa
82
83
  whether the engine runs in-process, as a local daemon, or (later) on a remote host.
83
84
  No hand-rolled IPC; the deployment split is a config choice, not an architectural fork.
84
85
 
85
- See **[docs/architecture-diagram.md](docs/architecture-diagram.md)** for the rendered diagrams —
86
+ See **[docs/architecture-diagram.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/architecture-diagram.md)** for the rendered diagrams —
86
87
  system topology, runtime message flow through the staged queue, and the config wiring graph (Mermaid,
87
88
  renders on GitHub and in the VS Code preview). The prose source of truth is
88
- [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
89
+ [docs/ARCHITECTURE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/ARCHITECTURE.md).
89
90
 
90
91
  ### Key decisions
91
92
  - **Reliable by default.** A durable, transactional pipeline gives at-least-once delivery,
@@ -97,9 +98,9 @@ renders on GitHub and in the VS Code preview). The prose source of truth is
97
98
  Python (`inbound`/`outbound`/`@router`/`@handler`) for full control — always version-controlled.
98
99
  The database holds runtime state and messages only, never configuration.
99
100
  - **PHI is first-class.** Authentication, RBAC, a user-attributed audit log of message
100
- views/replays, and **encryption-at-rest** for message bodies (AES-256-GCM) are **built**; log
101
- redaction and MLLPS/TLS are on the roadmap. See [docs/PHI.md](docs/PHI.md) for the built-vs-planned
102
- data-protection map.
101
+ views/replays, **encryption-at-rest** for message bodies (AES-256-GCM), **global PHI log redaction**,
102
+ and **transport TLS** (HTTPS/WSS for the API plus MLLP-over-TLS) are **built**; MFA and off-box log
103
+ shipping remain on the roadmap. See [docs/PHI.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/PHI.md) for the full data-protection map.
103
104
 
104
105
  ## Roadmap
105
106
 
@@ -132,26 +133,26 @@ renders on GitHub and in the VS Code preview). The prose source of truth is
132
133
  failover-load test harness (kill-the-primary-under-load), on **both** PostgreSQL and SQL Server
133
134
  - [x] **Native transport TLS** — in-process API TLS (HTTPS/WSS) and MLLP-over-TLS, with an off-loopback
134
135
  bind guard and a certificate-expiry monitor
135
- - [x] Published throughput + active-passive failover **baseline** ([docs/benchmarks/TUNING-BASELINE.md](docs/benchmarks/TUNING-BASELINE.md))
136
+ - [x] Published throughput + active-passive failover **baseline** ([docs/benchmarks/TUNING-BASELINE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/benchmarks/TUNING-BASELINE.md))
136
137
  - [x] **SMART Backend Services token provider** — OAuth2 `client_credentials` + signed-JWT
137
138
  `client_assertion` (RS384/ES384) authenticating the FHIR/REST outbound against real SMART-secured
138
139
  servers (Epic, Oracle Health); a `with_smart_backend()` composer over `FHIR()`/`Rest()` that mints,
139
140
  caches, and re-mints (on 401) a short-lived bearer, token endpoint gated by `[egress].allowed_http`
140
- ([ADR 0024](docs/adr/0024-smart-backend-services-token-provider.md))
141
+ ([ADR 0024](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0024-smart-backend-services-token-provider.md))
141
142
  - [x] **base64 binary-carriage codec** — an `mfb64:v1:` marker carries arbitrary NUL-safe **bytes** over
142
143
  the str/TEXT ingress + store (`RawMessage.from_bytes()`/`.raw_bytes`/`.binary()`/`.is_binary`), plus
143
- HL7 OBX-5 ED (Encapsulated Data) embedding helpers ([ADR 0028](docs/adr/0028-base64-binary-carriage-codec.md))
144
+ HL7 OBX-5 ED (Encapsulated Data) embedding helpers ([ADR 0028](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0028-base64-binary-carriage-codec.md))
144
145
  - [x] **DICOM codec + C-STORE SCP** (Phase 1) — a pure codec (routing peek, headers/Structured Report,
145
146
  code-first SR→HL7 mapping helpers; **headers + SR only, no pixel data**) on `content_type=dicom`
146
- payload-agnostic ingress, plus an inbound C-STORE SCP listener (`DICOM()`) ([ADR 0025](docs/adr/0025-dicom-codec-store-connectors.md))
147
+ payload-agnostic ingress, plus an inbound C-STORE SCP listener (`DICOM()`) ([ADR 0025](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0025-dicom-codec-store-connectors.md))
147
148
  - [x] **Anonymizer / de-identification** — builds PHI-free test datasets from real traffic with
148
149
  deterministic secret-per-dataset pseudonymization, field-anchored site-code scrub, and fail-closed
149
150
  emission (never an un-scrubbed body), via a `tee anonymize-captures` subcommand and test-harness
150
- hooks ([ADR 0030](docs/adr/0030-anonymization-test-harness-tee.md))
151
+ hooks ([ADR 0030](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0030-anonymization-test-harness-tee.md))
151
152
 
152
153
  **Later** — higher-throughput delivery (a pooled/persistent MLLP connector); a read-only **component
153
154
  SDK** (fork-to-customize); DICOM Phase 2 (C-STORE SCU + C-ECHO + DICOMweb STOW-RS, designed); MFA and
154
- off-box log shipping. See [docs/EARLY-ADOPTER-GUIDE.md](docs/EARLY-ADOPTER-GUIDE.md) §2 for the current
155
+ off-box log shipping. See [docs/EARLY-ADOPTER-GUIDE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/EARLY-ADOPTER-GUIDE.md) §2 for the current
155
156
  built-vs-experimental map.
156
157
 
157
158
  Horizontal **active-active** scale-out (the multi-node cluster path) was **dropped on 2026-06-18 and
@@ -163,24 +164,24 @@ supported HA model.
163
164
  **The recommended way to deploy MessageFoundry is to install the published package from
164
165
  [PyPI](https://pypi.org/project/messagefoundry/)** — a signed, version-pinned wheel is the
165
166
  supported production artifact, with no source checkout required. Install it as a **pinned
166
- dependency**, then scaffold your own config repo ([ADR 0017](docs/adr/0017-consumer-deployment-model.md)):
167
+ dependency**, then scaffold your own config repo ([ADR 0017](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0017-consumer-deployment-model.md)):
167
168
 
168
169
  ```bash
169
- pip install "messagefoundry==0.2.0" # pin the exact engine version (core runtime, SQLite store)
170
+ pip install "messagefoundry==0.2.1" # pin the exact engine version (core runtime, SQLite store)
170
171
  messagefoundry init ./my-config-repo # scaffold a standalone config repo
171
172
  cd ./my-config-repo
172
173
  messagefoundry serve --config config --env dev
173
174
  ```
174
175
 
175
- `0.2.0` is the current **Early Access** release on PyPI. Always **pin the exact version** so
176
+ `0.2.1` is the current **Early Access** release on PyPI. Always **pin the exact version** so
176
177
  upgrades stay deliberate. Add the extras your deployment needs (each is opt-in and lazy-imported):
177
178
 
178
179
  ```bash
179
- pip install "messagefoundry[postgres]==0.2.0" # PostgreSQL store backend (production server DB)
180
- pip install "messagefoundry[sqlserver]==0.2.0" # SQL Server store backend (+ OS-level ODBC Driver 18)
181
- pip install "messagefoundry[console]==0.2.0" # PySide6 admin console
182
- pip install "messagefoundry[sftp]==0.2.0" # SFTP transport for the REMOTEFILE connector
183
- pip install "messagefoundry[dicom]==0.2.0" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
180
+ pip install "messagefoundry[postgres]==0.2.1" # PostgreSQL store backend (production server DB)
181
+ pip install "messagefoundry[sqlserver]==0.2.1" # SQL Server store backend (+ OS-level ODBC Driver 18)
182
+ pip install "messagefoundry[console]==0.2.1" # PySide6 admin console
183
+ pip install "messagefoundry[sftp]==0.2.1" # SFTP transport for the REMOTEFILE connector
184
+ pip install "messagefoundry[dicom]==0.2.1" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
184
185
  ```
185
186
 
186
187
  > **Verify before you install (supply chain).** Every release is built by a GitHub Actions workflow,
@@ -192,7 +193,7 @@ pip install "messagefoundry[dicom]==0.2.0" # DICOM codec + C-STORE SCP (py
192
193
  >
193
194
  > *(Engine developers install from a checkout instead — see [Development](#development).)*
194
195
 
195
- Piloting MessageFoundry? The **[Early-Adopter Installation & Rollout Guide](docs/EARLY-ADOPTER-GUIDE.md)**
196
+ Piloting MessageFoundry? The **[Early-Adopter Installation & Rollout Guide](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/EARLY-ADOPTER-GUIDE.md)**
196
197
  takes you from first install through a staged, go/no-go-gated path to full production
197
198
  (Lab → Shadow/Parallel → Limited → Full). It leads with an honest built-vs-experimental
198
199
  maturity map and covers prerequisites, install, security/PHI hardening, reliability
@@ -224,24 +225,24 @@ python -m messagefoundry.console --url http://127.0.0.1:8765
224
225
 
225
226
  ### VS Code extension & test harness
226
227
 
227
- - **VS Code extension** ([`ide/`](ide/)) — author and test interfaces in your editor: a New Route
228
+ - **VS Code extension** ([`ide/`](https://github.com/wshallwshall/MessageFoundry/tree/main/ide/)) — author and test interfaces in your editor: a New Route
228
229
  Wizard, validate-on-save, a Test Bench (dry-run `.hl7` files with before/after diffs), Stage →
229
230
  Promote to a running engine, and an HL7-aware `@messagefoundry` chat participant. Open the `ide/`
230
- folder in VS Code and press **F5**, or see [ide/README.md](ide/README.md).
231
+ folder in VS Code and press **F5**, or see [ide/README.md](https://github.com/wshallwshall/MessageFoundry/blob/main/ide/README.md).
231
232
  - **Test harness** — a standalone PySide6 send/receive MLLP tool for exercising the engine with
232
233
  synthetic, PHI-free traffic: `python -m harness`.
233
234
 
234
235
  ## License
235
236
 
236
237
  MessageFoundry is licensed under the **GNU Affero General Public License v3.0 or later**
237
- (`AGPL-3.0-or-later`) — see [LICENSE](LICENSE). Running a modified version as a network service
238
+ (`AGPL-3.0-or-later`) — see [LICENSE](https://github.com/wshallwshall/MessageFoundry/blob/main/LICENSE). Running a modified version as a network service
238
239
  triggers the AGPL's §13 source-offer obligation. A separately-licensed commercial edition is planned
239
240
  by **MessageFoundry Organization** under the standard open-core model — see
240
- [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md) (terms pending legal review). See [NOTICE](NOTICE)
241
+ [COMMERCIAL-LICENSE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/COMMERCIAL-LICENSE.md) (terms pending legal review). See [NOTICE](https://github.com/wshallwshall/MessageFoundry/blob/main/NOTICE)
241
242
  for copyright and attribution.
242
243
 
243
244
  ## Contributing
244
245
 
245
- Contributions are welcome — see [CONTRIBUTING.md](CONTRIBUTING.md), our
246
- [Code of Conduct](CODE_OF_CONDUCT.md), and how the project is governed in [GOVERNANCE.md](GOVERNANCE.md).
247
- A signed [Contributor License Agreement](CLA.md) is required before a pull request can be merged.
246
+ Contributions are welcome — see [CONTRIBUTING.md](https://github.com/wshallwshall/MessageFoundry/blob/main/CONTRIBUTING.md), our
247
+ [Code of Conduct](https://github.com/wshallwshall/MessageFoundry/blob/main/CODE_OF_CONDUCT.md), and how the project is governed in [GOVERNANCE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/GOVERNANCE.md).
248
+ A signed [Contributor License Agreement](https://github.com/wshallwshall/MessageFoundry/blob/main/CLA.md) is required before a pull request can be merged.