messagefoundry 0.2.2__tar.gz → 0.2.4__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 (732) hide show
  1. messagefoundry-0.2.4/.github/workflows/codeql.yml +67 -0
  2. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/workflows/release.yml +69 -0
  3. messagefoundry-0.2.4/.github/workflows/scorecard.yml +59 -0
  4. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/workflows/security.yml +63 -0
  5. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.gitignore +6 -0
  6. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/CHANGELOG.md +49 -1
  7. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/PKG-INFO +71 -71
  8. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/README.md +57 -70
  9. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/BACKLOG.md +83 -0
  10. messagefoundry-0.2.4/docs/CODESETS.md +109 -0
  11. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/CONFIGURATION.md +28 -0
  12. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/CONNECTIONS.md +10 -0
  13. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/USER-GUIDE.md +45 -2
  14. messagefoundry-0.2.4/docs/adr/0033-gui-manageable-code-sets.md +212 -0
  15. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/README.md +1 -0
  16. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/package.json +68 -0
  17. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/cli.ts +50 -0
  18. messagefoundry-0.2.4/ide/src/codeSetEditor.ts +459 -0
  19. messagefoundry-0.2.4/ide/src/codesetsTree.ts +109 -0
  20. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/extension.ts +82 -0
  21. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/test/suite/extension.test.ts +16 -0
  22. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/__init__.py +1 -1
  23. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/__main__.py +101 -1
  24. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/api/app.py +55 -1
  25. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/api/models.py +16 -0
  26. messagefoundry-0.2.4/messagefoundry/config/codeset_edit.py +488 -0
  27. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/connections_file.py +16 -0
  28. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/settings.py +39 -5
  29. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/wiring.py +222 -14
  30. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/client.py +13 -0
  31. messagefoundry-0.2.4/messagefoundry/console/event_log_page.py +143 -0
  32. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/shell.py +5 -1
  33. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/alert_sinks.py +5 -0
  34. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/alerts.py +11 -0
  35. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/engine.py +31 -1
  36. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/retention.py +20 -0
  37. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/wiring_runner.py +330 -14
  38. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/store/base.py +78 -1
  39. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/store/postgres.py +171 -1
  40. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/store/sqlserver.py +255 -95
  41. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/store/store.py +211 -5
  42. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/base.py +15 -0
  43. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/mllp.py +47 -2
  44. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/tcp.py +36 -2
  45. messagefoundry-0.2.4/packaging/messagefoundry-harness/README.md +30 -0
  46. messagefoundry-0.2.4/packaging/messagefoundry-harness/pyproject.toml +54 -0
  47. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/pyproject.toml +15 -0
  48. messagefoundry-0.2.4/tests/test_ack_capture_runner.py +101 -0
  49. messagefoundry-0.2.4/tests/test_ack_sent_store.py +150 -0
  50. messagefoundry-0.2.4/tests/test_codeset_edit.py +641 -0
  51. messagefoundry-0.2.4/tests/test_connection_event_api.py +83 -0
  52. messagefoundry-0.2.4/tests/test_connection_event_emit.py +212 -0
  53. messagefoundry-0.2.4/tests/test_connection_event_outbound.py +100 -0
  54. messagefoundry-0.2.4/tests/test_connection_event_store.py +208 -0
  55. messagefoundry-0.2.4/tests/test_console_event_log.py +141 -0
  56. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_widgets.py +4 -2
  57. messagefoundry-0.2.4/tests/test_sqlserver_cursor_close.py +158 -0
  58. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_startup_fault_isolation.py +60 -0
  59. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_wiring.py +143 -1
  60. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_wiring_engine.py +4 -0
  61. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.claude/settings.json +0 -0
  62. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.dockerignore +0 -0
  63. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.gitattributes +0 -0
  64. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/CODEOWNERS +0 -0
  65. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  66. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  67. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  68. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  69. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/SECURITY.md +0 -0
  70. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/dependabot.yml +0 -0
  71. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/workflows/benchmark.yml +0 -0
  72. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/workflows/ci.yml +0 -0
  73. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/workflows/cla.yml +0 -0
  74. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/workflows/dependabot-auto-merge.yml +0 -0
  75. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/workflows/dependabot-lock-resync.yml +0 -0
  76. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/workflows/release-sync-check.yml +0 -0
  77. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.github/workflows/vuln-metrics.yml +0 -0
  78. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.gitleaks.toml +0 -0
  79. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.pre-commit-config.yaml +0 -0
  80. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/.semgrep/messagefoundry.yml +0 -0
  81. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/CLA.md +0 -0
  82. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/CLAUDE.md +0 -0
  83. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/CODE_OF_CONDUCT.md +0 -0
  84. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/COMMERCIAL-LICENSE.md +0 -0
  85. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/CONTRIBUTING.md +0 -0
  86. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/GOVERNANCE.md +0 -0
  87. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/LICENSE +0 -0
  88. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/MAINTAINERS.md +0 -0
  89. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/NOTICE +0 -0
  90. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docker/Dockerfile +0 -0
  91. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docker/README.md +0 -0
  92. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docker/compose.yaml +0 -0
  93. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docker/k8s/secret.example.yaml +0 -0
  94. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docker/k8s/statefulset.yaml +0 -0
  95. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docker/locks/requirements-core.lock +0 -0
  96. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docker/locks/requirements-sqlserver.lock +0 -0
  97. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docker/secrets.env.example +0 -0
  98. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docker/smoke/Dockerfile +0 -0
  99. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docker/smoke/config/IB_Test_ADT.py +0 -0
  100. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docker/smoke/send_adt.py +0 -0
  101. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/ADOPTER-CI.md +0 -0
  102. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/AI.md +0 -0
  103. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/ARCHITECTURE.md +0 -0
  104. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/CI-QUALITY.md +0 -0
  105. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/CLUSTERING.md +0 -0
  106. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/CONTAINER-EXPOSURE-EVALUATION.md +0 -0
  107. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
  108. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
  109. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
  110. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/DEPLOY-SERVER-DB.md +0 -0
  111. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/DEPLOYMENT.md +0 -0
  112. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/DICOM.md +0 -0
  113. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/DUAL_LICENSING_PLAN.md +0 -0
  114. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
  115. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/FEATURE-MAP.md +0 -0
  116. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/HL7-VALIDATION.md +0 -0
  117. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/INSTALL-GUIDE.md +0 -0
  118. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/LOAD-TESTING.md +0 -0
  119. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/MENTAL-MODEL.md +0 -0
  120. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/MessageFoundry-Mental-Model.docx +0 -0
  121. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/PHI.md +0 -0
  122. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
  123. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/REMOTE-CONSOLE.md +0 -0
  124. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/SECURITY.md +0 -0
  125. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/SERVICE.md +0 -0
  126. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/SUPPORT-POLICY.md +0 -0
  127. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/SYSTEM-REQUIREMENTS.md +0 -0
  128. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/Secure_AI_Development_Standards.md +0 -0
  129. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/Secure_Development_Standards.md +0 -0
  130. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/TEE-RELAY.md +0 -0
  131. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/THROUGHPUT-IMPROVEMENTS.md +0 -0
  132. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/WORKTREES.md +0 -0
  133. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0001-staged-pipeline-architecture.md +0 -0
  134. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
  135. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
  136. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
  137. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0005-transform-accessible-state.md +0 -0
  138. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0006-external-data-lookups.md +0 -0
  139. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
  140. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0008-cluster-observability-api.md +0 -0
  141. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0009-run-scoped-context-providers.md +0 -0
  142. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
  143. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0011-timer-scheduled-source.md +0 -0
  144. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0012-x12-edi-codec.md +0 -0
  145. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0013-increment-2-reingress-design.md +0 -0
  146. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0013-query-response-orchestration.md +0 -0
  147. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0014-alerting-rules-engine.md +0 -0
  148. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
  149. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
  150. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0017-consumer-deployment-model.md +0 -0
  151. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
  152. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
  153. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
  154. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
  155. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
  156. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
  157. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
  158. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0026-off-box-egress-update-check.md +0 -0
  159. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
  160. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
  161. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
  162. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/0032-console-desktop-launch.md +0 -0
  163. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/adr/TEMPLATE.md +0 -0
  164. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/architecture-components.png +0 -0
  165. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/architecture-components.svg +0 -0
  166. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/architecture-config-graph.png +0 -0
  167. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/architecture-config-graph.svg +0 -0
  168. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/architecture-diagram.md +0 -0
  169. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/architecture-message-flow.png +0 -0
  170. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/architecture-message-flow.svg +0 -0
  171. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/architecture-topology.png +0 -0
  172. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/architecture-topology.svg +0 -0
  173. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/benchmarks/TUNING-BASELINE.md +0 -0
  174. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
  175. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
  176. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
  177. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
  178. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
  179. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
  180. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/benchmarks/step-b-write-amplification.md +0 -0
  181. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/hl7-message-ordering-reference.md +0 -0
  182. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/message-ordering-design.md +0 -0
  183. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
  184. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
  185. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
  186. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
  187. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
  188. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/releases/MULTISESSION-PLAN.md +0 -0
  189. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
  190. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
  191. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
  192. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/releases/v0.1-PLAN.md +0 -0
  193. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
  194. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/research/cloud-deployment-research-2026-06.md +0 -0
  195. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/research/config-ux-review.md +0 -0
  196. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/research/non-hl7-transform-components.md +0 -0
  197. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
  198. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
  199. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/ADVISORY-PROCESS.md +0 -0
  200. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
  201. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
  202. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
  203. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
  204. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
  205. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/ASVS-L3-STATUS.md +0 -0
  206. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
  207. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
  208. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
  209. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/BEYOND-ASVS-L3.md +0 -0
  210. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
  211. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/DEPENDENCY-METRICS.md +0 -0
  212. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
  213. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/PHASE-8C-RBAC.md +0 -0
  214. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/PUBLISHING.md +0 -0
  215. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/RCA-TEMPLATE.md +0 -0
  216. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/RELEASE-GATE.md +0 -0
  217. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/REMEDIATION-PLAN.md +0 -0
  218. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/REVIEW-2026-06-07.md +0 -0
  219. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
  220. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
  221. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/SECURITY-POSTURE.md +0 -0
  222. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
  223. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
  224. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
  225. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/security/THREAT-MODEL.md +0 -0
  226. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/testing/VERIFY.md +0 -0
  227. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
  228. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
  229. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
  230. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/environments/dev.toml +0 -0
  231. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/environments/prod.toml +0 -0
  232. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/README.md +0 -0
  233. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/__main__.py +0 -0
  234. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/acceptance/__init__.py +0 -0
  235. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/acceptance/__main__.py +0 -0
  236. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/acceptance/matrix.py +0 -0
  237. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/acceptance/probes.py +0 -0
  238. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/acceptance/report.py +0 -0
  239. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/acceptance/runner.py +0 -0
  240. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/compose.py +0 -0
  241. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/config/coverage.py +0 -0
  242. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/config/load/_shape.py +0 -0
  243. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/config/load/graph.py +0 -0
  244. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/file_panel.py +0 -0
  245. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/file_transport.py +0 -0
  246. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/__init__.py +0 -0
  247. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/corpus.py +0 -0
  248. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/correlator.py +0 -0
  249. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/enginepoll.py +0 -0
  250. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/failover.py +0 -0
  251. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/failover_track.py +0 -0
  252. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/governor.py +0 -0
  253. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/ids.py +0 -0
  254. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/metrics.py +0 -0
  255. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profile.py +0 -0
  256. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/README.md +0 -0
  257. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/closed-loop.toml +0 -0
  258. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/failover.toml +0 -0
  259. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/fanout-baseline.toml +0 -0
  260. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/malformed-load.toml +0 -0
  261. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/reference.toml +0 -0
  262. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/smoke-sqlserver.toml +0 -0
  263. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/smoke.toml +0 -0
  264. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/soak.toml +0 -0
  265. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/spike-burst.toml +0 -0
  266. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/sustained-overload.toml +0 -0
  267. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/profiles/writeamp.toml +0 -0
  268. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/report.py +0 -0
  269. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/runner.py +0 -0
  270. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/sender.py +0 -0
  271. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/load/sink.py +0 -0
  272. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/mllp.py +0 -0
  273. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/monitor.py +0 -0
  274. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/receive.py +0 -0
  275. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/reconcile/__init__.py +0 -0
  276. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/reconcile/__main__.py +0 -0
  277. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/reconcile/capture.py +0 -0
  278. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/reconcile/compare.py +0 -0
  279. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/reconcile/normalize.py +0 -0
  280. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/reconcile/report.py +0 -0
  281. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/scenarios.py +0 -0
  282. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/send.py +0 -0
  283. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/harness/window.py +0 -0
  284. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/.gitignore +0 -0
  285. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/.vscodeignore +0 -0
  286. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/README.md +0 -0
  287. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/esbuild.js +0 -0
  288. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/media/hl7schema.json +0 -0
  289. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/media/icon.png +0 -0
  290. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/media/icon.svg +0 -0
  291. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/package-lock.json +0 -0
  292. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/snippets/messagefoundry.code-snippets +0 -0
  293. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/aiPolicy.ts +0 -0
  294. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/alertEditor.ts +0 -0
  295. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/auth.ts +0 -0
  296. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/chat.ts +0 -0
  297. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/completion.ts +0 -0
  298. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/connectionEditor.ts +0 -0
  299. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/engineClient.ts +0 -0
  300. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/generate.ts +0 -0
  301. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/git.ts +0 -0
  302. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/graphTree.ts +0 -0
  303. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/home.ts +0 -0
  304. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/newRoute.ts +0 -0
  305. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/promote.ts +0 -0
  306. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/sourceControl.ts +0 -0
  307. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/test/runTest.ts +0 -0
  308. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/test/suite/chat.test.ts +0 -0
  309. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/test/suite/index.ts +0 -0
  310. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/testBench.ts +0 -0
  311. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/src/validate.ts +0 -0
  312. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/tsconfig.json +0 -0
  313. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/ide/tsconfig.test.json +0 -0
  314. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/mefor.code-workspace +0 -0
  315. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/adr_analyze.py +0 -0
  316. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/anon/__init__.py +0 -0
  317. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/anon/_pools.py +0 -0
  318. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/anon/hl7.py +0 -0
  319. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/anon/keying.py +0 -0
  320. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/anon/leak.py +0 -0
  321. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/anon/rules.py +0 -0
  322. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/anon/surrogates.py +0 -0
  323. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/api/__init__.py +0 -0
  324. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/api/approvals.py +0 -0
  325. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/api/auth_models.py +0 -0
  326. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/api/auth_routes.py +0 -0
  327. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/api/field_authz.py +0 -0
  328. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/api/metrics.py +0 -0
  329. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/api/security.py +0 -0
  330. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/api/tls.py +0 -0
  331. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/__init__.py +0 -0
  332. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
  333. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/data/common_passwords.txt +0 -0
  334. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/identity.py +0 -0
  335. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/ldap.py +0 -0
  336. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/notifications.py +0 -0
  337. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/passwords.py +0 -0
  338. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/permissions.py +0 -0
  339. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/policy.py +0 -0
  340. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/ratelimit.py +0 -0
  341. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/service.py +0 -0
  342. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/tokens.py +0 -0
  343. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/auth/totp.py +0 -0
  344. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/checks.py +0 -0
  345. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/__init__.py +0 -0
  346. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/active_environment.py +0 -0
  347. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/ai_policy.py +0 -0
  348. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/alerts_edit.py +0 -0
  349. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/code_sets.py +0 -0
  350. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/connections_edit.py +0 -0
  351. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/db_lookup.py +0 -0
  352. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/environments.py +0 -0
  353. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/ingest_time.py +0 -0
  354. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/models.py +0 -0
  355. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/reference.py +0 -0
  356. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/response.py +0 -0
  357. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/run_context.py +0 -0
  358. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/state.py +0 -0
  359. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/config/tls_policy.py +0 -0
  360. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/__init__.py +0 -0
  361. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/__main__.py +0 -0
  362. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/_async.py +0 -0
  363. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/alerts_page.py +0 -0
  364. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/change_password.py +0 -0
  365. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/connections.py +0 -0
  366. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/dead_letters_page.py +0 -0
  367. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/delegates.py +0 -0
  368. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/icons/alerts.svg +0 -0
  369. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/icons/connections.svg +0 -0
  370. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/icons/dead-letters.svg +0 -0
  371. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/icons/engine-status.svg +0 -0
  372. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/icons/log-search.svg +0 -0
  373. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/icons/logo-lockup.svg +0 -0
  374. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/icons/users.svg +0 -0
  375. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/login.py +0 -0
  376. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/mfa.py +0 -0
  377. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/reauth.py +0 -0
  378. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/resources/README.md +0 -0
  379. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/resources/app.ico +0 -0
  380. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/resources/app.svg +0 -0
  381. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/search.py +0 -0
  382. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/service_control.py +0 -0
  383. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/sessions.py +0 -0
  384. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/status.py +0 -0
  385. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/theme.py +0 -0
  386. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/users_page.py +0 -0
  387. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/console/widgets.py +0 -0
  388. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/README.md +0 -0
  389. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/__init__.py +0 -0
  390. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/_core.py +0 -0
  391. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/_hl7data.py +0 -0
  392. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/adt.py +0 -0
  393. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/all_types.py +0 -0
  394. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/bar.py +0 -0
  395. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/dft.py +0 -0
  396. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/documents.py +0 -0
  397. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/mdm.py +0 -0
  398. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/mfn.py +0 -0
  399. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/oml.py +0 -0
  400. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/orl.py +0 -0
  401. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/orm.py +0 -0
  402. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/oru.py +0 -0
  403. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/ras.py +0 -0
  404. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/rde.py +0 -0
  405. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/siu.py +0 -0
  406. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/generators/vxu.py +0 -0
  407. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/hl7schema.py +0 -0
  408. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/last_resort.py +0 -0
  409. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/logging_setup.py +0 -0
  410. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/__init__.py +0 -0
  411. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/binary.py +0 -0
  412. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/consistency.py +0 -0
  413. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/dicom/__init__.py +0 -0
  414. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/dicom/_deps.py +0 -0
  415. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/dicom/_util.py +0 -0
  416. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/dicom/dataset.py +0 -0
  417. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/dicom/errors.py +0 -0
  418. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
  419. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/dicom/peek.py +0 -0
  420. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/fhir/__init__.py +0 -0
  421. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/fhir/_deps.py +0 -0
  422. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/fhir/errors.py +0 -0
  423. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/fhir/peek.py +0 -0
  424. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/fhir/resource.py +0 -0
  425. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/groups.py +0 -0
  426. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/message.py +0 -0
  427. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/peek.py +0 -0
  428. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/split.py +0 -0
  429. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/summary.py +0 -0
  430. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/tree.py +0 -0
  431. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/validate.py +0 -0
  432. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/x12/__init__.py +0 -0
  433. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/x12/delimiters.py +0 -0
  434. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/x12/errors.py +0 -0
  435. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/x12/interchange.py +0 -0
  436. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/x12/message.py +0 -0
  437. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/parsing/x12/peek.py +0 -0
  438. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/__init__.py +0 -0
  439. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/cert_expiry.py +0 -0
  440. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/cluster.py +0 -0
  441. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
  442. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/config_convergence.py +0 -0
  443. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/dryrun.py +0 -0
  444. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/leader_tasks.py +0 -0
  445. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/reference_sync.py +0 -0
  446. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/security_notify.py +0 -0
  447. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/pipeline/state_convergence.py +0 -0
  448. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/py.typed +0 -0
  449. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/redaction.py +0 -0
  450. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/scaffold.py +0 -0
  451. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/secrets_dpapi.py +0 -0
  452. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/store/__init__.py +0 -0
  453. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/store/audit_tee.py +0 -0
  454. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/store/crypto.py +0 -0
  455. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/store/keyprovider.py +0 -0
  456. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/timezone.py +0 -0
  457. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/__init__.py +0 -0
  458. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/database.py +0 -0
  459. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/dicom.py +0 -0
  460. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/dicomweb.py +0 -0
  461. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/fhir.py +0 -0
  462. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/file.py +0 -0
  463. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/framing.py +0 -0
  464. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/loopback.py +0 -0
  465. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/remotefile.py +0 -0
  466. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/rest.py +0 -0
  467. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/signing.py +0 -0
  468. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/smart.py +0 -0
  469. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/soap.py +0 -0
  470. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/timer.py +0 -0
  471. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/transports/x12.py +0 -0
  472. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/verify/__init__.py +0 -0
  473. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/verify/checks.py +0 -0
  474. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/verify/model.py +0 -0
  475. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/verify/report.py +0 -0
  476. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/verify/runner.py +0 -0
  477. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/messagefoundry/verify/smoke.py +0 -0
  478. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/requirements.lock +0 -0
  479. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/config/IB_ACME_ADT.py +0 -0
  480. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/config/IB_FHIR_INTAKE.py +0 -0
  481. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
  482. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/config/IB_PARTNER_X12.py +0 -0
  483. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/config/IB_RADIOLOGY_SR.py +0 -0
  484. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
  485. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/config/adt.py +0 -0
  486. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/config/codesets/event_labels.csv +0 -0
  487. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/config/codesets/facility_mnemonics.toml +0 -0
  488. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/config/connections.toml +0 -0
  489. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/consistency/validated_adt.py +0 -0
  490. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/dicom/generate_sr_sample.py +0 -0
  491. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/adt_a01.hl7 +0 -0
  492. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/adt_batch.hl7 +0 -0
  493. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
  494. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/hapi-hl7v2/README.md +0 -0
  495. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
  496. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
  497. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
  498. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
  499. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
  500. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
  501. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
  502. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/messages/x12_270_eligibility.edi +0 -0
  503. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/results_relay/README.md +0 -0
  504. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/results_relay/codesets/test_codes.csv +0 -0
  505. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
  506. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/results_relay/messages/oru_results.hl7 +0 -0
  507. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/results_relay/results_relay.py +0 -0
  508. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/samples/send_mllp.py +0 -0
  509. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/console/install-console-shortcut.ps1 +0 -0
  510. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/console/pack_ico.py +0 -0
  511. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
  512. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/dev/postgres.ps1 +0 -0
  513. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/dev/sqlserver-docker.ps1 +0 -0
  514. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/dev/sqlserver.ps1 +0 -0
  515. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
  516. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/publish/check_release_sync.py +0 -0
  517. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/publish/publish-denylist.txt +0 -0
  518. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/publish/publish.ps1 +0 -0
  519. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/publish/scan_forbidden.py +0 -0
  520. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/security/crypto_inventory_check.py +0 -0
  521. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/security/vuln_metrics.py +0 -0
  522. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/service/import-db-ca.ps1 +0 -0
  523. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/service/install-service.ps1 +0 -0
  524. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/service/uninstall-service.ps1 +0 -0
  525. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/trace_icon.py +0 -0
  526. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/worktree/new.ps1 +0 -0
  527. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/worktree/remove.ps1 +0 -0
  528. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/worktree/session-context.ps1 +0 -0
  529. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/scripts/worktree/spawn.ps1 +0 -0
  530. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/__init__.py +0 -0
  531. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/__main__.py +0 -0
  532. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/anon/__init__.py +0 -0
  533. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/anon/_hl7data.py +0 -0
  534. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/anon/_pools.py +0 -0
  535. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/anon/hl7.py +0 -0
  536. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/anon/keying.py +0 -0
  537. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/anon/leak.py +0 -0
  538. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/anon/rules.py +0 -0
  539. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/anon/surrogates.py +0 -0
  540. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/compare.py +0 -0
  541. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/correlate.py +0 -0
  542. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/hl7_fields.py +0 -0
  543. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/mefor_api.py +0 -0
  544. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/mllp.py +0 -0
  545. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/relay.py +0 -0
  546. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/report.py +0 -0
  547. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tee/store.py +0 -0
  548. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/_dicom_sample.py +0 -0
  549. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/_failover_load_support.py +0 -0
  550. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/_fhir_fixtures.py +0 -0
  551. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/conftest.py +0 -0
  552. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_acceptance_framework.py +0 -0
  553. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_active_environment.py +0 -0
  554. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_ad_group_scope.py +0 -0
  555. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_admin_new_ip.py +0 -0
  556. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_adr_analyze.py +0 -0
  557. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_ai_policy.py +0 -0
  558. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_alert_rules.py +0 -0
  559. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_alert_sinks.py +0 -0
  560. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_alerts_edit.py +0 -0
  561. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_alerts_rules_api.py +0 -0
  562. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_anon_core.py +0 -0
  563. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_anon_integration.py +0 -0
  564. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_anon_parity.py +0 -0
  565. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_api.py +0 -0
  566. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_api_auth.py +0 -0
  567. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_api_reload.py +0 -0
  568. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_api_tls.py +0 -0
  569. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_approvals.py +0 -0
  570. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_asvs_phase0.py +0 -0
  571. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_audit_integrity.py +0 -0
  572. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_audit_offbox_tee.py +0 -0
  573. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_auth_core.py +0 -0
  574. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_auth_entry_hardening.py +0 -0
  575. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_auth_hardening.py +0 -0
  576. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_auth_service.py +0 -0
  577. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_auth_session_lifecycle.py +0 -0
  578. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_auth_store.py +0 -0
  579. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_binary_carriage.py +0 -0
  580. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_cert_expiry.py +0 -0
  581. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_channel_rbac.py +0 -0
  582. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_checks.py +0 -0
  583. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_cli.py +0 -0
  584. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_cluster.py +0 -0
  585. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_cluster_failover_postgres.py +0 -0
  586. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_cluster_failover_sqlserver.py +0 -0
  587. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_cluster_graph_gating.py +0 -0
  588. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_cluster_lease.py +0 -0
  589. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_code_sets.py +0 -0
  590. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_connection_api.py +0 -0
  591. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_connection_resilience.py +0 -0
  592. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_connections_cli.py +0 -0
  593. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_connections_file.py +0 -0
  594. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_consistency.py +0 -0
  595. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_alerts.py +0 -0
  596. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_auth.py +0 -0
  597. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_client.py +0 -0
  598. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_dead_letters.py +0 -0
  599. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_hardening.py +0 -0
  600. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_icon.py +0 -0
  601. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_password.py +0 -0
  602. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_sessions.py +0 -0
  603. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_status.py +0 -0
  604. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_step_up.py +0 -0
  605. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_theme.py +0 -0
  606. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_console_users.py +0 -0
  607. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_database_connector_integration.py +0 -0
  608. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_database_transport.py +0 -0
  609. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_db_lookup.py +0 -0
  610. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_db_lookup_live_runner.py +0 -0
  611. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_delivery_settings.py +0 -0
  612. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_dependency_boundaries.py +0 -0
  613. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_dicom_codec.py +0 -0
  614. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_dicom_scp.py +0 -0
  615. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_dicom_scu.py +0 -0
  616. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_dicom_wiring.py +0 -0
  617. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_dicomweb.py +0 -0
  618. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_docs_runbooks.py +0 -0
  619. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_dryrun.py +0 -0
  620. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_ed_documents.py +0 -0
  621. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_ed_documents_e2e.py +0 -0
  622. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_egress_allowlist.py +0 -0
  623. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_environments.py +0 -0
  624. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_fhir_parsing.py +0 -0
  625. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_fhir_resource.py +0 -0
  626. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_fhir_transport.py +0 -0
  627. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_field_authz.py +0 -0
  628. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_fifo_ordering.py +0 -0
  629. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_generate_cli.py +0 -0
  630. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_generated_adt.py +0 -0
  631. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_generators_core.py +0 -0
  632. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_generators_types.py +0 -0
  633. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_groups.py +0 -0
  634. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_harness.py +0 -0
  635. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_harness_compose.py +0 -0
  636. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_harness_config.py +0 -0
  637. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_harness_faults.py +0 -0
  638. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_harness_file.py +0 -0
  639. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_harness_monitor.py +0 -0
  640. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_harness_scenarios.py +0 -0
  641. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_hl7_core_features.py +0 -0
  642. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_hl7schema.py +0 -0
  643. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_inbound_bind.py +0 -0
  644. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_ingest_time.py +0 -0
  645. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_keyprovider.py +0 -0
  646. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_last_resort.py +0 -0
  647. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_leader_tasks.py +0 -0
  648. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_load_config.py +0 -0
  649. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_load_corpus.py +0 -0
  650. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_load_failover_postgres.py +0 -0
  651. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_load_failover_sqlserver.py +0 -0
  652. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_load_failover_unit.py +0 -0
  653. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_load_metrics.py +0 -0
  654. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_load_profile.py +0 -0
  655. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_load_report.py +0 -0
  656. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_load_runner.py +0 -0
  657. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_load_sender.py +0 -0
  658. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_load_sink.py +0 -0
  659. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_logging.py +0 -0
  660. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_message.py +0 -0
  661. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_message_split.py +0 -0
  662. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_metrics_exporter.py +0 -0
  663. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_mfa.py +0 -0
  664. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_mllp_encoding_override.py +0 -0
  665. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_mllp_tls.py +0 -0
  666. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_operability_config.py +0 -0
  667. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_outbound_signing.py +0 -0
  668. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_outbound_simulate.py +0 -0
  669. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_packaging.py +0 -0
  670. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_parse_tree.py +0 -0
  671. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_parsing.py +0 -0
  672. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_payload_agnostic_ingress.py +0 -0
  673. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_postgres_store.py +0 -0
  674. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_reconcile_capture.py +0 -0
  675. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_reconcile_compare.py +0 -0
  676. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_reconcile_harness.py +0 -0
  677. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_redaction.py +0 -0
  678. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_reference_sets.py +0 -0
  679. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_reingress.py +0 -0
  680. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_remotefile_transport.py +0 -0
  681. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_response_capture.py +0 -0
  682. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_rest_transport.py +0 -0
  683. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_retention.py +0 -0
  684. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_run_context.py +0 -0
  685. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_scaffold.py +0 -0
  686. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_scan_forbidden.py +0 -0
  687. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_secrets_dpapi.py +0 -0
  688. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_security_notify.py +0 -0
  689. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_security_static.py +0 -0
  690. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_service_control.py +0 -0
  691. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_settings.py +0 -0
  692. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_smart_backend.py +0 -0
  693. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_soap_transport.py +0 -0
  694. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_soap_wssecurity.py +0 -0
  695. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_sqlserver_coordinator.py +0 -0
  696. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_sqlserver_store.py +0 -0
  697. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_staged_pipeline.py +0 -0
  698. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_stats_reset.py +0 -0
  699. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_step_up.py +0 -0
  700. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_store.py +0 -0
  701. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_store_backend.py +0 -0
  702. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_store_encryption.py +0 -0
  703. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_store_file_hardening.py +0 -0
  704. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_store_read_pool.py +0 -0
  705. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_store_ssl.py +0 -0
  706. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_summary.py +0 -0
  707. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_task_resilience.py +0 -0
  708. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_tcp_transport.py +0 -0
  709. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_tee_cli.py +0 -0
  710. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_tee_compare.py +0 -0
  711. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_tee_correlate.py +0 -0
  712. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_tee_hl7_fields.py +0 -0
  713. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_tee_mefor_api.py +0 -0
  714. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_tee_mllp.py +0 -0
  715. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_tee_relay.py +0 -0
  716. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_tee_report.py +0 -0
  717. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_tee_store.py +0 -0
  718. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_timer_source.py +0 -0
  719. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_timezone.py +0 -0
  720. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_tls_policy.py +0 -0
  721. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_totp.py +0 -0
  722. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_transform_state.py +0 -0
  723. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_transports.py +0 -0
  724. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_verify.py +0 -0
  725. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_version.py +0 -0
  726. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_win2025_acceptance.py +0 -0
  727. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_wiring_reload.py +0 -0
  728. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_wiring_serve.py +0 -0
  729. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_x12_parsing.py +0 -0
  730. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_x12_rte.py +0 -0
  731. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/tests/test_x12_transport.py +0 -0
  732. {messagefoundry-0.2.2 → messagefoundry-0.2.4}/uv.lock +0 -0
@@ -0,0 +1,67 @@
1
+ name: CodeQL
2
+
3
+ # Deep semantic SAST (taint / data-flow analysis) that complements bandit and the curated semgrep
4
+ # rules in security.yml — it finds vulnerable flows those pattern matchers can't, e.g. untrusted
5
+ # HL7/config data reaching a sink across function boundaries.
6
+ #
7
+ # WHY THIS IS GUARDED TO THE MIRROR: CodeQL uploads results to GitHub code scanning, which on a
8
+ # PRIVATE repo requires paid GitHub Advanced Security (see security.yml's header note). This repo's
9
+ # source of truth is private, but the OSS mirror MEFORORG/MessageFoundry is PUBLIC, where CodeQL +
10
+ # code scanning are FREE. So the analyze job is gated on the repo slug: it is SKIPPED (a no-op) on the
11
+ # private source repo and runs only once publish.ps1 mirrors this file to MEFORORG/MessageFoundry.
12
+ # Nothing to pay, nothing to fail on the private side.
13
+ #
14
+ # PINNING CAVEAT: this repo SHA-pins every Action for supply-chain integrity. actions/checkout below
15
+ # reuses the repo's existing v7.0.0 pin; the github/codeql-action steps are on the v3 tag for now
16
+ # because the live commit SHA must be looked up at authoring — SHA-pin them before treating this as a
17
+ # hardened gate (OSSF Scorecard / zizmor would flag the unpinned tags).
18
+ #
19
+ # ALTERNATIVE (no file): on the public mirror you can instead enable CodeQL "default setup" from
20
+ # Settings -> Security -> Code scanning (one toggle, auto-pinned, auto-updated). Default setup and this
21
+ # advanced workflow are mutually exclusive — if you turn default setup ON, delete this file.
22
+ on:
23
+ push:
24
+ branches: [main]
25
+ pull_request:
26
+ branches: [main]
27
+ schedule:
28
+ # Weekly, so newly-shipped CodeQL queries run against unchanged code (same rationale as the daily
29
+ # pip-audit cron: a fresh finding against a quiet codebase shouldn't wait for the next push).
30
+ - cron: "0 7 * * 1"
31
+ workflow_dispatch:
32
+
33
+ permissions:
34
+ contents: read
35
+
36
+ jobs:
37
+ analyze:
38
+ name: CodeQL (${{ matrix.language }})
39
+ # ONLY on the public mirror — code scanning is free there; on the private source repo it would need
40
+ # paid GHAS, so this is a skipped no-op there. (GitHub Actions string == is case-insensitive.)
41
+ if: github.repository == 'MEFORORG/MessageFoundry'
42
+ runs-on: ubuntu-latest
43
+ permissions:
44
+ contents: read
45
+ security-events: write # upload the SARIF results to code scanning
46
+ actions: read
47
+ strategy:
48
+ fail-fast: false
49
+ matrix:
50
+ # python = the engine; javascript-typescript = the ide/ VS Code extension (both ship to the
51
+ # mirror). Both are interpreted — CodeQL needs no build step. Drop a language to narrow scope.
52
+ language: [python, javascript-typescript]
53
+ steps:
54
+ - name: Checkout
55
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
56
+ with:
57
+ persist-credentials: false # CodeQL uploads via the job token, not a persisted git credential
58
+ - name: Initialize CodeQL
59
+ uses: github/codeql-action/init@v3 # TODO: SHA-pin (repo convention)
60
+ with:
61
+ languages: ${{ matrix.language }}
62
+ # security-extended adds higher-recall security queries on top of the default suite.
63
+ queries: security-extended
64
+ - name: Analyze
65
+ uses: github/codeql-action/analyze@v3 # TODO: SHA-pin (repo convention)
66
+ with:
67
+ category: "/language:${{ matrix.language }}"
@@ -15,6 +15,14 @@
15
15
  # `-*` tags publish to PRODUCTION PyPI (a TestPyPI route would need its own Trusted Publisher). Cut the tag
16
16
  # only AFTER the py.typed marker (WS-3) is on main — the wheel smoke step enforces this on a tag.
17
17
  #
18
+ # SECOND distribution — `messagefoundry-harness` (the synthetic test/load/failover harness,
19
+ # packaging/messagefoundry-harness/) — is built + published in lockstep by the `release-harness` job
20
+ # below (same version, same tag). Its PyPI publish is GATED on the `PUBLISH_HARNESS` repo variable so it
21
+ # stays a no-op until the OWNER (one-time): (1) configures a `messagefoundry-harness` PyPI Trusted
22
+ # Publisher — a PENDING publisher for repo wshallwshall/MessageFoundry + workflow `release.yml` (blank
23
+ # environment, matching the engine) — then (2) sets repo variable PUBLISH_HARNESS=true. Until then the
24
+ # job still BUILDS + version-checks the harness wheel each release and attaches it to the GitHub release.
25
+ #
18
26
  # The version is single-sourced from messagefoundry/__init__.py (hatchling dynamic version), so the built
19
27
  # artifact's version must match the tag.
20
28
  name: release
@@ -151,3 +159,64 @@ jobs:
151
159
  packages-dir: dist-pub/
152
160
  skip-existing: true
153
161
  attestations: true
162
+
163
+ release-harness:
164
+ # Build + publish the SEPARATE `messagefoundry-harness` distribution (the synthetic test/load/failover
165
+ # harness, packaging/messagefoundry-harness/) in lockstep with the engine — same version, same tag.
166
+ # Isolated from the `release` job so a harness-side issue can never jeopardize the engine release;
167
+ # `needs: release` so the engine ships (and its GitHub release exists) first. Inherits the workflow's
168
+ # contents:write + id-token:write. The PyPI publish is GATED on the `PUBLISH_HARNESS` repo variable:
169
+ # until the owner sets up the harness Trusted Publisher AND PUBLISH_HARNESS=true (see the header note),
170
+ # this job still BUILDS + version-checks the wheel and attaches it to the GitHub release, but does not
171
+ # publish — so a missing harness PyPI project can never red a release.
172
+ needs: release
173
+ runs-on: ubuntu-latest
174
+ steps:
175
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
176
+
177
+ - name: Set up Python
178
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
179
+ with:
180
+ python-version: "3.14"
181
+
182
+ - name: Build the harness wheel (wheel-only — harness/ is force-included from the repo root)
183
+ run: |
184
+ python -m pip install --upgrade pip build
185
+ # Wheel-only on purpose: the harness source (harness/) lives OUTSIDE this project dir (it is
186
+ # force-included from ../../harness), so an sdist would not be self-contained. Pure-Python, so a
187
+ # wheel suffices. Version is read from messagefoundry/__init__.py (lockstep with the engine).
188
+ python -m build --wheel ./packaging/messagefoundry-harness --outdir harness-dist
189
+ ls -l harness-dist/
190
+
191
+ - name: Smoke-check the harness wheel (version == engine == tag)
192
+ run: |
193
+ built=$(python -c "import glob,re; print(re.search(r'messagefoundry_harness-([^-]+)-', glob.glob('harness-dist/*.whl')[0]).group(1))")
194
+ echo "harness wheel version: $built"
195
+ if [ "${GITHUB_REF_TYPE:-}" = "tag" ]; then
196
+ want="${GITHUB_REF_NAME#v}"
197
+ [ "$built" = "$want" ] || { echo "::error::harness wheel version $built != tag $want"; exit 1; }
198
+ fi
199
+
200
+ - name: Attach the harness wheel to the GitHub release
201
+ if: startsWith(github.ref, 'refs/tags/')
202
+ env:
203
+ GH_TOKEN: ${{ github.token }}
204
+ run: gh release upload "${GITHUB_REF_NAME}" harness-dist/*.whl --clobber
205
+
206
+ - name: Upload harness artifact (dry-run / always)
207
+ if: always()
208
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
209
+ with:
210
+ name: harness-artifacts
211
+ path: harness-dist/
212
+ if-no-files-found: ignore
213
+
214
+ # GATED: no-op until the owner configures the messagefoundry-harness PyPI Trusted Publisher AND sets
215
+ # repo variable PUBLISH_HARNESS=true. The build + version-check above still run every release.
216
+ - name: Publish messagefoundry-harness to PyPI (Trusted Publishing / OIDC)
217
+ if: ${{ startsWith(github.ref, 'refs/tags/') && vars.PUBLISH_HARNESS == 'true' }}
218
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
219
+ with:
220
+ packages-dir: harness-dist/
221
+ skip-existing: true
222
+ attestations: true
@@ -0,0 +1,59 @@
1
+ name: Scorecard
2
+
3
+ # OpenSSF Scorecard — a holistic supply-chain hygiene score (Pinned-Dependencies, Dangerous-Workflow,
4
+ # Token-Permissions, Branch-Protection, Maintained, SAST-present, ...). It validates the hardening this
5
+ # repo already does (SHA-pinned Actions, least-privilege tokens) and catches regressions, and yields a
6
+ # public OpenSSF badge.
7
+ #
8
+ # WHY GUARDED TO THE MIRROR: like CodeQL, Scorecard uploads SARIF to GitHub code scanning (paid GHAS on
9
+ # a private repo) and `publish_results: true` requires a PUBLIC repo. So this is gated to the public
10
+ # mirror MEFORORG/MessageFoundry — a skipped no-op on the private source repo, free on the mirror after
11
+ # publish.ps1 mirrors this file. NOTE: the Branch-Protection check then reflects the MIRROR's settings,
12
+ # not the private repo's; the workflow-hardening checks (Pinned-Dependencies / Dangerous-Workflow /
13
+ # Token-Permissions) assess the shared source and are the signal that transfers.
14
+ #
15
+ # PINNING CAVEAT: actions/checkout + actions/upload-artifact reuse this repo's existing SHA pins; the
16
+ # ossf/scorecard-action and github/codeql-action/upload-sarif steps are on version tags pending a
17
+ # SHA-pin lookup (zizmor / Scorecard itself will flag them).
18
+ on:
19
+ branch_protection_rule:
20
+ schedule:
21
+ - cron: "0 8 * * 1" # weekly (Mon 08:00 UTC)
22
+ push:
23
+ branches: [main]
24
+ workflow_dispatch:
25
+
26
+ permissions: read-all
27
+
28
+ jobs:
29
+ analysis:
30
+ name: Scorecard analysis
31
+ # ONLY on the public mirror (free code scanning + public badge); skipped no-op on the private repo.
32
+ if: github.repository == 'MEFORORG/MessageFoundry'
33
+ runs-on: ubuntu-latest
34
+ permissions:
35
+ security-events: write # upload the SARIF results to code scanning
36
+ id-token: write # publish results to the public OpenSSF Scorecard API (the badge)
37
+ contents: read
38
+ actions: read
39
+ steps:
40
+ - name: Checkout
41
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
42
+ with:
43
+ persist-credentials: false
44
+ - name: Run Scorecard
45
+ uses: ossf/scorecard-action@v2 # TODO: SHA-pin (repo convention)
46
+ with:
47
+ results_file: results.sarif
48
+ results_format: sarif
49
+ publish_results: true
50
+ - name: Upload the SARIF artifact
51
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
52
+ with:
53
+ name: scorecard-sarif
54
+ path: results.sarif
55
+ retention-days: 5
56
+ - name: Upload to code scanning
57
+ uses: github/codeql-action/upload-sarif@v3 # TODO: SHA-pin (repo convention)
58
+ with:
59
+ sarif_file: results.sarif
@@ -109,6 +109,43 @@ jobs:
109
109
  name: sbom-cyclonedx
110
110
  path: sbom.cdx.json
111
111
 
112
+ trivy:
113
+ name: trivy (container image vulnerabilities)
114
+ runs-on: ubuntu-latest
115
+ # ADVISORY for its first cycle (continue-on-error): scan the built engine image for OS-package and
116
+ # Python CVEs — the supply-chain layer pip-audit (lockfile only) and bandit/semgrep (source only)
117
+ # never see: the Debian base, system libs, and (on the -sqlserver variant) the msodbcsql18/unixODBC
118
+ # apt layer. Once a baseline run confirms it's clean, DELETE `continue-on-error` to make it BLOCKING
119
+ # like the other gates here. There's now a real docker/Dockerfile, so the image is a live surface.
120
+ continue-on-error: true
121
+ steps:
122
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
123
+ - name: Build the slim engine image
124
+ # The slim default the docker-smoke leg (ci.yml) and the Dockerfile's `docker build` docs produce.
125
+ run: docker build -f docker/Dockerfile -t messagefoundry:scan .
126
+ - name: Install Trivy (pinned)
127
+ run: |
128
+ # Pin the release; bump deliberately (same posture as the gitleaks job). Verify the tag exists
129
+ # at https://github.com/aquasecurity/trivy/releases if this step 404s.
130
+ VER=0.71.2
131
+ curl -sSfL "https://github.com/aquasecurity/trivy/releases/download/v${VER}/trivy_${VER}_Linux-64bit.tar.gz" \
132
+ | tar -xz -C /tmp trivy
133
+ sudo install -m 0755 /tmp/trivy /usr/local/bin/trivy
134
+ trivy --version
135
+ - name: Scan the image (fixable HIGH/CRITICAL fail the build)
136
+ # --ignore-unfixed keeps the gate ACTIONABLE: a Debian CVE with no upstream fix can't be
137
+ # remediated by us and shouldn't redden CI; only patchable HIGH/CRITICAL fail. --scanners vuln
138
+ # keeps this to CVEs (secrets stay gitleaks' job). Extend to `--target runtime-sqlserver` (more
139
+ # OS surface) once this is green. Trivy auto-pulls its vuln DB from ghcr.io on first run.
140
+ run: |
141
+ trivy image --no-progress --scanners vuln \
142
+ --severity HIGH,CRITICAL --ignore-unfixed --exit-code 1 \
143
+ messagefoundry:scan
144
+ - name: Lint the Dockerfile for misconfig (informational)
145
+ # IaC checks (non-root USER, pinned base, secrets in layers). Informational only — never fails.
146
+ if: always()
147
+ run: trivy config --no-progress --severity HIGH,CRITICAL docker/Dockerfile || true
148
+
112
149
  bandit:
113
150
  name: bandit (Python SAST)
114
151
  runs-on: ubuntu-latest
@@ -174,6 +211,32 @@ jobs:
174
211
  # dangerous-sink rules as the engine.
175
212
  semgrep --config .semgrep --error --metrics off messagefoundry tee
176
213
 
214
+ zizmor:
215
+ name: zizmor (GitHub Actions static analysis)
216
+ runs-on: ubuntu-latest
217
+ # ADVISORY for its first cycle (continue-on-error): static analysis of the workflow files THEMSELVES
218
+ # (Trail of Bits) — template injection, over-broad GITHUB_TOKEN permissions, unpinned `uses:`,
219
+ # artifact poisoning. Complements (and enforces) the by-hand SHA-pinning across these workflows.
220
+ # Once a baseline run is reviewed/clean, DELETE `continue-on-error` to make it blocking. (It will
221
+ # flag the `@v3` codeql-action tags in codeql.yml — that's the intended forcing function to pin them.)
222
+ continue-on-error: true
223
+ permissions:
224
+ contents: read
225
+ steps:
226
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
227
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
228
+ with:
229
+ python-version: "3.14"
230
+ - name: Install zizmor (pinned)
231
+ run: |
232
+ # Pin deliberately; verify the tag at https://github.com/zizmorcore/zizmor/releases if it 404s.
233
+ python -m pip install --upgrade pip "zizmor==1.5.2"
234
+ - name: Analyze the workflows
235
+ env:
236
+ # Lets zizmor run its online audits (e.g. unpinned / known-problematic action refs).
237
+ GH_TOKEN: ${{ github.token }}
238
+ run: zizmor .github/workflows
239
+
177
240
  crypto-inventory:
178
241
  name: crypto-inventory (ASVS 11.1.3 discovery gate)
179
242
  runs-on: ubuntu-latest
@@ -74,3 +74,9 @@ TRANSCRIPTS.md
74
74
  /docs/security/DEPENDENCY-RESPONSE-A4-HANDOFF.md
75
75
  # vuln_metrics.py local CSV output (the CI run uploads it as an artifact; not committed)
76
76
  /docs/security/metrics/
77
+
78
+ # Operator-local load/throughput profiles — tuned to a specific deployment's volume; kept OUT of the
79
+ # OSS repo + public mirror (the plan itself lives on the operator share, WIN2025-LOAD-THROUGHPUT-MATRIX.md).
80
+ # Still usable by name (they sit in PROFILES_DIR) and copy-on to the test box.
81
+ /harness/load/profiles/hospital-baseline.toml
82
+ /harness/load/profiles/soak-12h.toml
@@ -6,6 +6,51 @@ All notable changes to MessageFoundry are documented here. The format follows
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.2.4] — 2026-06-26 — Early Access
10
+
11
+ A bug-fix release that completes the EF-6 SQL Server fix shipped in 0.2.3.
12
+
13
+ ### Fixed
14
+ - **SQL Server: EF-6 "Connection is busy with results for another command" fully resolved (0.2.3's fix
15
+ was incomplete).** v0.2.3 (#543) switched the FIFO claim read to `fetchall`, but draining the
16
+ `UPDATE...OUTPUT` *rows* does not free the *statement handle* — without MARS the pooled connection was
17
+ still returned to the aioodbc pool busy, so the error reproduced at every cold start. All pooled cursor
18
+ sites now close the cursor (`SQLFreeStmt`/`SQLCloseCursor`) via a new `_cursor` context manager before
19
+ the connection is released, on both the success and exception paths; `claim_ready` (another
20
+ `UPDATE...OUTPUT`) and the `DELETE...OUTPUT` handoffs had the same latent gap and are covered too. A
21
+ driver-free unit test now asserts the close-before-release invariant so the regression can't recur.
22
+ SQLite and PostgreSQL were unaffected. (#550)
23
+
24
+ ## [0.2.3] — 2026-06-26 — Early Access
25
+
26
+ A bug-fix + feature release: the SQL Server store no longer raises "connection busy" errors under
27
+ concurrent load, plus connection/transport event logging, GUI-managed translation tables, and inbound
28
+ listener port-conflict detection.
29
+
30
+ ### Fixed
31
+ - **SQL Server: "Connection is busy with results for another command" under concurrent load (EF-6).**
32
+ `claim_next_fifo` — and three sibling sites (`_maybe_finalize`, `consume_recovery_code_hash`,
33
+ `consume_totp_step`) — read a result-set-returning statement with a lone `fetchone()` and could return
34
+ the pooled connection to the pool with the result set still pending, so the next borrower's first
35
+ command raced an `HY000` busy error (ODBC Driver 18, no MARS). All affected sites now fully drain the
36
+ result set (`fetchall`) before commit/release. SQLite and PostgreSQL were unaffected (asyncpg
37
+ materializes rows; SQLite has no shared pooled-connection single-result-set constraint). (#543)
38
+
39
+ ### Added
40
+ - **Connection/transport event log + "Response Sent" ACK capture** (ADR 0020 / ADR 0021). A new id-keyed,
41
+ metadata-only `connection_event` table records inbound connection lifecycle, pre-ingress failures, and
42
+ outbound lane transitions, with a `[diagnostics]` config block (per-connection overrides + retention),
43
+ a `GET /events` read API, and a console **Event Log** page. Event reasons are scrubbed and encrypted at
44
+ rest. (#541)
45
+ - **GUI-managed translation tables (code sets)** (ADR 0033). A code-set CLI + writer and a VS Code
46
+ extension grid editor / **Translation Tables** view for maintaining code-set mappings. (#540)
47
+ - **Inbound listener port-conflict detection** — static + runtime checks that flag two inbound
48
+ connections bound to the same host:port before they collide at startup. (#538)
49
+
50
+ ### Changed
51
+ - Docs: README install instructions are now version-agnostic and link the website docs; the roadmap
52
+ section is replaced with a features summary. (#542, #544)
53
+
9
54
  ## [0.2.2] — 2026-06-24 — Early Access
10
55
 
11
56
  A security-hardening release: PHI-at-rest encryption is closed across every backend, the active-passive
@@ -141,7 +186,10 @@ tests, but the external code review + penetration test (the bar for a security-c
141
186
  - Releases are built, SBOM'd (CycloneDX), and signed with [Sigstore](https://www.sigstore.dev/) — see the
142
187
  `release` workflow.
143
188
 
144
- [Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.1...HEAD
189
+ [Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.4...HEAD
190
+ [0.2.4]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.3...v0.2.4
191
+ [0.2.3]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.2...v0.2.3
192
+ [0.2.2]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.1...v0.2.2
145
193
  [0.2.1]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.0...v0.2.1
146
194
  [0.2.0]: https://github.com/wshallwshall/MessageFoundry/compare/v0.1.0...v0.2.0
147
195
  [0.1.0]: https://github.com/wshallwshall/MessageFoundry/releases/tag/v0.1.0
@@ -1,10 +1,23 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: messagefoundry
3
- Version: 0.2.2
3
+ Version: 0.2.4
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
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: Environment :: Console
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Intended Audience :: Healthcare Industry
12
+ Classifier: Intended Audience :: System Administrators
13
+ Classifier: Operating System :: Microsoft :: Windows
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Classifier: Topic :: Communications
18
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
19
+ Classifier: Topic :: System :: Networking
20
+ Classifier: Typing :: Typed
8
21
  Requires-Python: >=3.14
9
22
  Requires-Dist: aiosqlite>=0.20
10
23
  Requires-Dist: argon2-cffi>=23.1
@@ -102,62 +115,34 @@ renders on GitHub and in the VS Code preview). The prose source of truth is
102
115
  and **transport TLS** (HTTPS/WSS for the API plus MLLP-over-TLS) are **built**; MFA and off-box log
103
116
  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.
104
117
 
105
- ## Roadmap
106
-
107
- **Phase 1 minimum reliable engine**
108
- - [x] Connection/Router/Handler model + config-module loader
109
- - [x] Durable message store / queue (SQLite WAL, outbox pattern)
110
- - [x] Parse / validate (tolerant peek + opt-in strict validation)
111
- - [x] MLLP source + destination (correct `0x0B 0x1C 0x0D` framing, ACK/NACK)
112
- - [x] File source + destination
113
- - [x] Pipeline: source parse/validate/filter/transform outbox per-dest workers,
114
- with retry/backoff, dead-letter, and replay
115
- - [x] localhost API (connections start/stop, message track/search/detail, replay, stats,
116
- live WebSocket feed) + `python -m messagefoundry serve`
117
- - [x] PySide6 console: connection dashboard, message browser, HL7 parse-tree viewer,
118
- delivery/audit trail, replay (`python -m messagefoundry.console`)
119
-
120
- **Phase 1 complete.**
121
-
122
- **Since Phase 1 now built**
123
- - [x] Staged pipeline (ingressroutedoutbound): at-least-once handoff, dead-letter, replay
124
- - [x] Authentication, RBAC, user-attributed audit log, at-rest body encryption (AES-256-GCM)
125
- - [x] **PostgreSQL** store backend (production, single-node)
126
- - [x] **Microsoft SQL Server** store backend (production, single-node)
127
- - [x] REST, SOAP, and Database destinations
128
- - [x] Database poll source
129
- - [x] Reference / lookup tables (`code_set`) for enrichment
130
- - [x] Alerting — logging sink + webhook/email notifier
131
- - [x] Connections-as-data (`connections.toml`) editable by hand or a VS Code GUI
132
- - [x] **Active-passive high availability** — self-fencing leadership lease, leader-gated graph, and a
133
- failover-load test harness (kill-the-primary-under-load), on **both** PostgreSQL and SQL Server
134
- - [x] **Native transport TLS** — in-process API TLS (HTTPS/WSS) and MLLP-over-TLS, with an off-loopback
135
- bind guard and a certificate-expiry monitor
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))
137
- - [x] **SMART Backend Services token provider** — OAuth2 `client_credentials` + signed-JWT
138
- `client_assertion` (RS384/ES384) authenticating the FHIR/REST outbound against real SMART-secured
139
- servers (Epic, Oracle Health); a `with_smart_backend()` composer over `FHIR()`/`Rest()` that mints,
140
- caches, and re-mints (on 401) a short-lived bearer, token endpoint gated by `[egress].allowed_http`
141
- ([ADR 0024](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0024-smart-backend-services-token-provider.md))
142
- - [x] **base64 binary-carriage codec** — an `mfb64:v1:` marker carries arbitrary NUL-safe **bytes** over
143
- the str/TEXT ingress + store (`RawMessage.from_bytes()`/`.raw_bytes`/`.binary()`/`.is_binary`), plus
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))
145
- - [x] **DICOM codec + C-STORE SCP** (Phase 1) — a pure codec (routing peek, headers/Structured Report,
146
- code-first SR→HL7 mapping helpers; **headers + SR only, no pixel data**) on `content_type=dicom`
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))
148
- - [x] **Anonymizer / de-identification** — builds PHI-free test datasets from real traffic with
149
- deterministic secret-per-dataset pseudonymization, field-anchored site-code scrub, and fail-closed
150
- emission (never an un-scrubbed body), via a `tee anonymize-captures` subcommand and test-harness
151
- hooks ([ADR 0030](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0030-anonymization-test-harness-tee.md))
152
-
153
- **Later** — higher-throughput delivery (a pooled/persistent MLLP connector); a read-only **component
154
- SDK** (fork-to-customize); DICOM Phase 2 (C-STORE SCU + C-ECHO + DICOMweb STOW-RS, designed); MFA and
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
156
- built-vs-experimental map.
157
-
158
- Horizontal **active-active** scale-out (the multi-node cluster path) was **dropped on 2026-06-18 and
159
- its code removed** — it is not a planned milestone; single-leader **active-passive** HA (above) is the
160
- supported HA model.
118
+ ## Features
119
+
120
+ MessageFoundry ships a reliable, PHI-aware engine today: the Connection/Router/Handler graph
121
+ over a durable staged pipeline (at-least-once delivery, retries, dead-letter, replay), backed by
122
+ SQLite, PostgreSQL, or SQL Server. It speaks MLLP (plain and over TLS), file/SFTP, REST, SOAP,
123
+ FHIR, database, and DICOM (C-STORE SCP), parses HL7 v2 tolerantly (with opt-in strict validation)
124
+ and carries other formats payload-agnostically (JSON, XML/SOAP, X12, binary). Security is
125
+ first-class authentication, RBAC, a user-attributed audit log, at-rest body encryption, and
126
+ transport TLS and it runs single-node or in active-passive high availability.
127
+
128
+ **See the full, up-to-date feature breakdown built vs. planned at
129
+ [messagefoundry.org/features-table.html](https://messagefoundry.org/features-table.html).**
130
+
131
+ ## Documentation
132
+
133
+ Full documentation lives on **[messagefoundry.org](https://messagefoundry.org/)**:
134
+
135
+ - **[Mental map](https://messagefoundry.org/assets/docs/MessageFoundry-Mental-Model.pdf)**a one-page
136
+ picture of how the pieces fit: Connections RouterHandlers Connections, with the headless
137
+ engine and the console/IDE that drive it.
138
+ - **[Install Guide](https://messagefoundry.org/assets/docs/MessageFoundry-Install-Guide.pdf)** install,
139
+ configure, secure, and roll out to production.
140
+ - **[User Guide](https://messagefoundry.org/assets/docs/MessageFoundry-User-Guide.pdf)** author and
141
+ operate interfaces day to day.
142
+
143
+ **Get started:** [Quickstart](https://messagefoundry.org/getting-started.html) ·
144
+ [Guides](https://messagefoundry.org/guides/) ·
145
+ [Documents](https://messagefoundry.org/documents.html)
161
146
 
162
147
  ## Installing & rolling out
163
148
 
@@ -167,23 +152,32 @@ supported production artifact, with no source checkout required. Install it as a
167
152
  dependency**, then scaffold your own config repo ([ADR 0017](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0017-consumer-deployment-model.md)):
168
153
 
169
154
  ```bash
170
- pip install "messagefoundry==0.2.1" # pin the exact engine version (core runtime, SQLite store)
171
- messagefoundry init ./my-config-repo # scaffold a standalone config repo
155
+ pip install "messagefoundry==<version>" # pin the exact engine version (core runtime, SQLite store)
156
+ messagefoundry init ./my-config-repo # scaffold a standalone config repo
172
157
  cd ./my-config-repo
173
158
  messagefoundry serve --config config --env dev
174
159
  ```
175
160
 
176
- `0.2.1` is the current **Early Access** release on PyPI. Always **pin the exact version** so
177
- upgrades stay deliberate. Add the extras your deployment needs (each is opt-in and lazy-imported):
161
+ MessageFoundry is in **Early Access**. Always **pin the exact version** so upgrades stay
162
+ deliberate replace `<version>` with the current release shown at the top of the
163
+ [PyPI project page](https://pypi.org/project/messagefoundry/). Add the extras your deployment
164
+ needs (each is opt-in and lazy-imported):
178
165
 
179
166
  ```bash
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)
167
+ pip install "messagefoundry[console]==<version>" # admin console (PySide6 GUI) — the operator UI; most operators want this
168
+ pip install "messagefoundry[postgres]==<version>" # PostgreSQL store backend (production server DB)
169
+ pip install "messagefoundry[sqlserver]==<version>" # SQL Server store backend (+ OS-level ODBC Driver 18)
170
+ pip install "messagefoundry[sftp]==<version>" # SFTP transport for the REMOTEFILE connector
171
+ pip install "messagefoundry[dicom]==<version>" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
185
172
  ```
186
173
 
174
+ **What's in the `messagefoundry` package — and what isn't.** It is the **engine plus the admin
175
+ console**: the console ships in the same wheel, with its PySide6/GUI dependencies as the opt-in
176
+ `[console]` extra, so a headless server, container, or adopter install stays lean — the console is one
177
+ flag away (`messagefoundry[console]`) when you want the operator UI. The **VS Code extension is a
178
+ separate product, not on PyPI** (a VS Code extension is a different ecosystem); see *VS Code extension &
179
+ test harness* below for where to get it.
180
+
187
181
  > **Verify before you install (supply chain).** Every release is built by a GitHub Actions workflow,
188
182
  > Sigstore-signed, and carries SLSA build-provenance + PEP 740 attestations. Verify a downloaded
189
183
  > wheel against its source commit with
@@ -193,7 +187,7 @@ pip install "messagefoundry[dicom]==0.2.1" # DICOM codec + C-STORE SCP (py
193
187
  >
194
188
  > *(Engine developers install from a checkout instead — see [Development](#development).)*
195
189
 
196
- Piloting MessageFoundry? The **[Early-Adopter Installation & Rollout Guide](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/EARLY-ADOPTER-GUIDE.md)**
190
+ Piloting MessageFoundry? The **[Install Guide](https://messagefoundry.org/assets/docs/MessageFoundry-Install-Guide.pdf)**
197
191
  takes you from first install through a staged, go/no-go-gated path to full production
198
192
  (Lab → Shadow/Parallel → Limited → Full). It leads with an honest built-vs-experimental
199
193
  maturity map and covers prerequisites, install, security/PHI hardening, reliability
@@ -227,10 +221,16 @@ python -m messagefoundry.console --url http://127.0.0.1:8765
227
221
 
228
222
  - **VS Code extension** ([`ide/`](https://github.com/wshallwshall/MessageFoundry/tree/main/ide/)) — author and test interfaces in your editor: a New Route
229
223
  Wizard, validate-on-save, a Test Bench (dry-run `.hl7` files with before/after diffs), Stage →
230
- Promote to a running engine, and an HL7-aware `@messagefoundry` chat participant. Open the `ide/`
231
- folder in VS Code and press **F5**, or see [ide/README.md](https://github.com/wshallwshall/MessageFoundry/blob/main/ide/README.md).
232
- - **Test harness** a standalone PySide6 send/receive MLLP tool for exercising the engine with
233
- synthetic, PHI-free traffic: `python -m harness`.
224
+ Promote to a running engine, and an HL7-aware `@messagefoundry` chat participant. **It is not on PyPI**
225
+ (a VS Code extension is a different ecosystem) **and not yet on the VS Code Marketplace** Marketplace
226
+ + Open VSX publishing is **planned** (see [the backlog](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/BACKLOG.md)). Until then, get it from
227
+ this repo: open the `ide/` folder in VS Code and press **F5** (Extension Development Host), or build the
228
+ VSIX (`cd ide && npm install && npx @vscode/vsce package`) and install the `.vsix`. See
229
+ [ide/README.md](https://github.com/wshallwshall/MessageFoundry/blob/main/ide/README.md).
230
+ - **Test harness** — synthetic-only send/receive (MLLP), load, and failover tooling for exercising a
231
+ running engine. It ships as a **separate distribution, `messagefoundry-harness`**, released in lockstep
232
+ with the engine (it is *not* in the engine wheel): `pip install messagefoundry-harness`, then
233
+ `python -m harness`. From a checkout, run `python -m harness` directly. Synthetic, PHI-free traffic only.
234
234
 
235
235
  ## License
236
236