messagefoundry 0.2.3__tar.gz → 0.2.5__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 (734) hide show
  1. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/workflows/ci.yml +10 -1
  2. messagefoundry-0.2.5/.github/workflows/codeql.yml +67 -0
  3. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/workflows/dependabot-lock-resync.yml +5 -1
  4. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/workflows/release.yml +82 -4
  5. messagefoundry-0.2.5/.github/workflows/scorecard.yml +59 -0
  6. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/workflows/security.yml +63 -0
  7. messagefoundry-0.2.5/.github/zizmor.yml +31 -0
  8. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/CHANGELOG.md +35 -1
  9. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/PKG-INFO +32 -6
  10. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/README.md +18 -5
  11. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/BACKLOG.md +1 -0
  12. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/__init__.py +1 -1
  13. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/settings.py +3 -3
  14. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/store/sqlserver.py +104 -104
  15. messagefoundry-0.2.5/packaging/messagefoundry-harness/README.md +30 -0
  16. messagefoundry-0.2.5/packaging/messagefoundry-harness/pyproject.toml +54 -0
  17. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/pyproject.toml +15 -0
  18. messagefoundry-0.2.5/tests/test_sqlserver_cursor_close.py +158 -0
  19. messagefoundry-0.2.5/tests/test_sqlserver_schema_init.py +96 -0
  20. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.claude/settings.json +0 -0
  21. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.dockerignore +0 -0
  22. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.gitattributes +0 -0
  23. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/CODEOWNERS +0 -0
  24. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  26. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  27. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  28. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/SECURITY.md +0 -0
  29. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/dependabot.yml +0 -0
  30. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/workflows/benchmark.yml +0 -0
  31. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/workflows/cla.yml +0 -0
  32. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/workflows/dependabot-auto-merge.yml +0 -0
  33. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/workflows/release-sync-check.yml +0 -0
  34. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.github/workflows/vuln-metrics.yml +0 -0
  35. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.gitignore +0 -0
  36. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.gitleaks.toml +0 -0
  37. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.pre-commit-config.yaml +0 -0
  38. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/.semgrep/messagefoundry.yml +0 -0
  39. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/CLA.md +0 -0
  40. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/CLAUDE.md +0 -0
  41. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/CODE_OF_CONDUCT.md +0 -0
  42. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/COMMERCIAL-LICENSE.md +0 -0
  43. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/CONTRIBUTING.md +0 -0
  44. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/GOVERNANCE.md +0 -0
  45. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/LICENSE +0 -0
  46. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/MAINTAINERS.md +0 -0
  47. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/NOTICE +0 -0
  48. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docker/Dockerfile +0 -0
  49. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docker/README.md +0 -0
  50. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docker/compose.yaml +0 -0
  51. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docker/k8s/secret.example.yaml +0 -0
  52. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docker/k8s/statefulset.yaml +0 -0
  53. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docker/locks/requirements-core.lock +0 -0
  54. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docker/locks/requirements-sqlserver.lock +0 -0
  55. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docker/secrets.env.example +0 -0
  56. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docker/smoke/Dockerfile +0 -0
  57. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docker/smoke/config/IB_Test_ADT.py +0 -0
  58. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docker/smoke/send_adt.py +0 -0
  59. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/ADOPTER-CI.md +0 -0
  60. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/AI.md +0 -0
  61. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/ARCHITECTURE.md +0 -0
  62. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/CI-QUALITY.md +0 -0
  63. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/CLUSTERING.md +0 -0
  64. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/CODESETS.md +0 -0
  65. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/CONFIGURATION.md +0 -0
  66. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/CONNECTIONS.md +0 -0
  67. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/CONTAINER-EXPOSURE-EVALUATION.md +0 -0
  68. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
  69. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
  70. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
  71. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/DEPLOY-SERVER-DB.md +0 -0
  72. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/DEPLOYMENT.md +0 -0
  73. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/DICOM.md +0 -0
  74. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/DUAL_LICENSING_PLAN.md +0 -0
  75. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
  76. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/FEATURE-MAP.md +0 -0
  77. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/HL7-VALIDATION.md +0 -0
  78. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/INSTALL-GUIDE.md +0 -0
  79. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/LOAD-TESTING.md +0 -0
  80. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/MENTAL-MODEL.md +0 -0
  81. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/MessageFoundry-Mental-Model.docx +0 -0
  82. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/PHI.md +0 -0
  83. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
  84. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/REMOTE-CONSOLE.md +0 -0
  85. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/SECURITY.md +0 -0
  86. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/SERVICE.md +0 -0
  87. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/SUPPORT-POLICY.md +0 -0
  88. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/SYSTEM-REQUIREMENTS.md +0 -0
  89. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/Secure_AI_Development_Standards.md +0 -0
  90. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/Secure_Development_Standards.md +0 -0
  91. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/TEE-RELAY.md +0 -0
  92. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/THROUGHPUT-IMPROVEMENTS.md +0 -0
  93. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/USER-GUIDE.md +0 -0
  94. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/WORKTREES.md +0 -0
  95. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0001-staged-pipeline-architecture.md +0 -0
  96. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
  97. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
  98. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
  99. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0005-transform-accessible-state.md +0 -0
  100. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0006-external-data-lookups.md +0 -0
  101. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
  102. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0008-cluster-observability-api.md +0 -0
  103. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0009-run-scoped-context-providers.md +0 -0
  104. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
  105. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0011-timer-scheduled-source.md +0 -0
  106. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0012-x12-edi-codec.md +0 -0
  107. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0013-increment-2-reingress-design.md +0 -0
  108. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0013-query-response-orchestration.md +0 -0
  109. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0014-alerting-rules-engine.md +0 -0
  110. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
  111. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
  112. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0017-consumer-deployment-model.md +0 -0
  113. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
  114. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
  115. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
  116. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
  117. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
  118. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
  119. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
  120. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0026-off-box-egress-update-check.md +0 -0
  121. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
  122. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
  123. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
  124. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0032-console-desktop-launch.md +0 -0
  125. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/0033-gui-manageable-code-sets.md +0 -0
  126. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/README.md +0 -0
  127. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/adr/TEMPLATE.md +0 -0
  128. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/architecture-components.png +0 -0
  129. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/architecture-components.svg +0 -0
  130. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/architecture-config-graph.png +0 -0
  131. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/architecture-config-graph.svg +0 -0
  132. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/architecture-diagram.md +0 -0
  133. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/architecture-message-flow.png +0 -0
  134. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/architecture-message-flow.svg +0 -0
  135. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/architecture-topology.png +0 -0
  136. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/architecture-topology.svg +0 -0
  137. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/benchmarks/TUNING-BASELINE.md +0 -0
  138. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
  139. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
  140. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
  141. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
  142. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
  143. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
  144. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/benchmarks/step-b-write-amplification.md +0 -0
  145. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/hl7-message-ordering-reference.md +0 -0
  146. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/message-ordering-design.md +0 -0
  147. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
  148. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
  149. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
  150. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
  151. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
  152. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/releases/MULTISESSION-PLAN.md +0 -0
  153. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
  154. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
  155. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
  156. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/releases/v0.1-PLAN.md +0 -0
  157. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
  158. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/research/cloud-deployment-research-2026-06.md +0 -0
  159. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/research/config-ux-review.md +0 -0
  160. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/research/non-hl7-transform-components.md +0 -0
  161. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
  162. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
  163. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/ADVISORY-PROCESS.md +0 -0
  164. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
  165. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
  166. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
  167. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
  168. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
  169. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/ASVS-L3-STATUS.md +0 -0
  170. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
  171. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
  172. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
  173. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/BEYOND-ASVS-L3.md +0 -0
  174. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
  175. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/DEPENDENCY-METRICS.md +0 -0
  176. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
  177. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/PHASE-8C-RBAC.md +0 -0
  178. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/PUBLISHING.md +0 -0
  179. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/RCA-TEMPLATE.md +0 -0
  180. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/RELEASE-GATE.md +0 -0
  181. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/REMEDIATION-PLAN.md +0 -0
  182. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/REVIEW-2026-06-07.md +0 -0
  183. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
  184. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
  185. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/SECURITY-POSTURE.md +0 -0
  186. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
  187. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
  188. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
  189. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/security/THREAT-MODEL.md +0 -0
  190. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/testing/VERIFY.md +0 -0
  191. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
  192. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
  193. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
  194. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/environments/dev.toml +0 -0
  195. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/environments/prod.toml +0 -0
  196. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/README.md +0 -0
  197. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/__main__.py +0 -0
  198. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/acceptance/__init__.py +0 -0
  199. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/acceptance/__main__.py +0 -0
  200. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/acceptance/matrix.py +0 -0
  201. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/acceptance/probes.py +0 -0
  202. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/acceptance/report.py +0 -0
  203. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/acceptance/runner.py +0 -0
  204. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/compose.py +0 -0
  205. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/config/coverage.py +0 -0
  206. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/config/load/_shape.py +0 -0
  207. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/config/load/graph.py +0 -0
  208. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/file_panel.py +0 -0
  209. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/file_transport.py +0 -0
  210. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/__init__.py +0 -0
  211. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/corpus.py +0 -0
  212. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/correlator.py +0 -0
  213. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/enginepoll.py +0 -0
  214. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/failover.py +0 -0
  215. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/failover_track.py +0 -0
  216. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/governor.py +0 -0
  217. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/ids.py +0 -0
  218. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/metrics.py +0 -0
  219. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profile.py +0 -0
  220. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/README.md +0 -0
  221. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/closed-loop.toml +0 -0
  222. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/failover.toml +0 -0
  223. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/fanout-baseline.toml +0 -0
  224. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/malformed-load.toml +0 -0
  225. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/reference.toml +0 -0
  226. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/smoke-sqlserver.toml +0 -0
  227. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/smoke.toml +0 -0
  228. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/soak.toml +0 -0
  229. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/spike-burst.toml +0 -0
  230. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/sustained-overload.toml +0 -0
  231. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/profiles/writeamp.toml +0 -0
  232. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/report.py +0 -0
  233. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/runner.py +0 -0
  234. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/sender.py +0 -0
  235. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/load/sink.py +0 -0
  236. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/mllp.py +0 -0
  237. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/monitor.py +0 -0
  238. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/receive.py +0 -0
  239. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/reconcile/__init__.py +0 -0
  240. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/reconcile/__main__.py +0 -0
  241. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/reconcile/capture.py +0 -0
  242. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/reconcile/compare.py +0 -0
  243. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/reconcile/normalize.py +0 -0
  244. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/reconcile/report.py +0 -0
  245. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/scenarios.py +0 -0
  246. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/send.py +0 -0
  247. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/harness/window.py +0 -0
  248. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/.gitignore +0 -0
  249. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/.vscodeignore +0 -0
  250. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/README.md +0 -0
  251. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/esbuild.js +0 -0
  252. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/media/hl7schema.json +0 -0
  253. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/media/icon.png +0 -0
  254. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/media/icon.svg +0 -0
  255. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/package-lock.json +0 -0
  256. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/package.json +0 -0
  257. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/snippets/messagefoundry.code-snippets +0 -0
  258. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/aiPolicy.ts +0 -0
  259. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/alertEditor.ts +0 -0
  260. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/auth.ts +0 -0
  261. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/chat.ts +0 -0
  262. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/cli.ts +0 -0
  263. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/codeSetEditor.ts +0 -0
  264. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/codesetsTree.ts +0 -0
  265. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/completion.ts +0 -0
  266. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/connectionEditor.ts +0 -0
  267. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/engineClient.ts +0 -0
  268. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/extension.ts +0 -0
  269. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/generate.ts +0 -0
  270. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/git.ts +0 -0
  271. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/graphTree.ts +0 -0
  272. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/home.ts +0 -0
  273. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/newRoute.ts +0 -0
  274. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/promote.ts +0 -0
  275. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/sourceControl.ts +0 -0
  276. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/test/runTest.ts +0 -0
  277. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/test/suite/chat.test.ts +0 -0
  278. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/test/suite/extension.test.ts +0 -0
  279. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/test/suite/index.ts +0 -0
  280. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/testBench.ts +0 -0
  281. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/src/validate.ts +0 -0
  282. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/tsconfig.json +0 -0
  283. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/ide/tsconfig.test.json +0 -0
  284. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/mefor.code-workspace +0 -0
  285. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/__main__.py +0 -0
  286. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/adr_analyze.py +0 -0
  287. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/anon/__init__.py +0 -0
  288. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/anon/_pools.py +0 -0
  289. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/anon/hl7.py +0 -0
  290. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/anon/keying.py +0 -0
  291. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/anon/leak.py +0 -0
  292. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/anon/rules.py +0 -0
  293. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/anon/surrogates.py +0 -0
  294. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/api/__init__.py +0 -0
  295. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/api/app.py +0 -0
  296. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/api/approvals.py +0 -0
  297. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/api/auth_models.py +0 -0
  298. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/api/auth_routes.py +0 -0
  299. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/api/field_authz.py +0 -0
  300. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/api/metrics.py +0 -0
  301. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/api/models.py +0 -0
  302. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/api/security.py +0 -0
  303. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/api/tls.py +0 -0
  304. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/__init__.py +0 -0
  305. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
  306. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/data/common_passwords.txt +0 -0
  307. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/identity.py +0 -0
  308. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/ldap.py +0 -0
  309. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/notifications.py +0 -0
  310. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/passwords.py +0 -0
  311. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/permissions.py +0 -0
  312. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/policy.py +0 -0
  313. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/ratelimit.py +0 -0
  314. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/service.py +0 -0
  315. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/tokens.py +0 -0
  316. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/auth/totp.py +0 -0
  317. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/checks.py +0 -0
  318. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/__init__.py +0 -0
  319. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/active_environment.py +0 -0
  320. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/ai_policy.py +0 -0
  321. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/alerts_edit.py +0 -0
  322. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/code_sets.py +0 -0
  323. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/codeset_edit.py +0 -0
  324. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/connections_edit.py +0 -0
  325. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/connections_file.py +0 -0
  326. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/db_lookup.py +0 -0
  327. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/environments.py +0 -0
  328. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/ingest_time.py +0 -0
  329. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/models.py +0 -0
  330. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/reference.py +0 -0
  331. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/response.py +0 -0
  332. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/run_context.py +0 -0
  333. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/state.py +0 -0
  334. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/tls_policy.py +0 -0
  335. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/config/wiring.py +0 -0
  336. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/__init__.py +0 -0
  337. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/__main__.py +0 -0
  338. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/_async.py +0 -0
  339. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/alerts_page.py +0 -0
  340. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/change_password.py +0 -0
  341. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/client.py +0 -0
  342. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/connections.py +0 -0
  343. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/dead_letters_page.py +0 -0
  344. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/delegates.py +0 -0
  345. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/event_log_page.py +0 -0
  346. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/icons/alerts.svg +0 -0
  347. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/icons/connections.svg +0 -0
  348. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/icons/dead-letters.svg +0 -0
  349. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/icons/engine-status.svg +0 -0
  350. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/icons/log-search.svg +0 -0
  351. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/icons/logo-lockup.svg +0 -0
  352. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/icons/users.svg +0 -0
  353. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/login.py +0 -0
  354. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/mfa.py +0 -0
  355. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/reauth.py +0 -0
  356. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/resources/README.md +0 -0
  357. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/resources/app.ico +0 -0
  358. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/resources/app.svg +0 -0
  359. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/search.py +0 -0
  360. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/service_control.py +0 -0
  361. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/sessions.py +0 -0
  362. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/shell.py +0 -0
  363. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/status.py +0 -0
  364. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/theme.py +0 -0
  365. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/users_page.py +0 -0
  366. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/console/widgets.py +0 -0
  367. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/README.md +0 -0
  368. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/__init__.py +0 -0
  369. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/_core.py +0 -0
  370. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/_hl7data.py +0 -0
  371. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/adt.py +0 -0
  372. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/all_types.py +0 -0
  373. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/bar.py +0 -0
  374. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/dft.py +0 -0
  375. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/documents.py +0 -0
  376. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/mdm.py +0 -0
  377. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/mfn.py +0 -0
  378. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/oml.py +0 -0
  379. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/orl.py +0 -0
  380. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/orm.py +0 -0
  381. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/oru.py +0 -0
  382. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/ras.py +0 -0
  383. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/rde.py +0 -0
  384. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/siu.py +0 -0
  385. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/generators/vxu.py +0 -0
  386. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/hl7schema.py +0 -0
  387. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/last_resort.py +0 -0
  388. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/logging_setup.py +0 -0
  389. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/__init__.py +0 -0
  390. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/binary.py +0 -0
  391. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/consistency.py +0 -0
  392. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/dicom/__init__.py +0 -0
  393. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/dicom/_deps.py +0 -0
  394. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/dicom/_util.py +0 -0
  395. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/dicom/dataset.py +0 -0
  396. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/dicom/errors.py +0 -0
  397. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
  398. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/dicom/peek.py +0 -0
  399. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/fhir/__init__.py +0 -0
  400. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/fhir/_deps.py +0 -0
  401. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/fhir/errors.py +0 -0
  402. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/fhir/peek.py +0 -0
  403. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/fhir/resource.py +0 -0
  404. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/groups.py +0 -0
  405. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/message.py +0 -0
  406. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/peek.py +0 -0
  407. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/split.py +0 -0
  408. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/summary.py +0 -0
  409. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/tree.py +0 -0
  410. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/validate.py +0 -0
  411. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/x12/__init__.py +0 -0
  412. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/x12/delimiters.py +0 -0
  413. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/x12/errors.py +0 -0
  414. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/x12/interchange.py +0 -0
  415. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/x12/message.py +0 -0
  416. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/parsing/x12/peek.py +0 -0
  417. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/__init__.py +0 -0
  418. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/alert_sinks.py +0 -0
  419. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/alerts.py +0 -0
  420. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/cert_expiry.py +0 -0
  421. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/cluster.py +0 -0
  422. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
  423. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/config_convergence.py +0 -0
  424. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/dryrun.py +0 -0
  425. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/engine.py +0 -0
  426. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/leader_tasks.py +0 -0
  427. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/reference_sync.py +0 -0
  428. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/retention.py +0 -0
  429. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/security_notify.py +0 -0
  430. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/state_convergence.py +0 -0
  431. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/pipeline/wiring_runner.py +0 -0
  432. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/py.typed +0 -0
  433. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/redaction.py +0 -0
  434. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/scaffold.py +0 -0
  435. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/secrets_dpapi.py +0 -0
  436. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/store/__init__.py +0 -0
  437. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/store/audit_tee.py +0 -0
  438. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/store/base.py +0 -0
  439. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/store/crypto.py +0 -0
  440. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/store/keyprovider.py +0 -0
  441. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/store/postgres.py +0 -0
  442. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/store/store.py +0 -0
  443. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/timezone.py +0 -0
  444. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/__init__.py +0 -0
  445. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/base.py +0 -0
  446. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/database.py +0 -0
  447. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/dicom.py +0 -0
  448. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/dicomweb.py +0 -0
  449. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/fhir.py +0 -0
  450. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/file.py +0 -0
  451. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/framing.py +0 -0
  452. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/loopback.py +0 -0
  453. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/mllp.py +0 -0
  454. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/remotefile.py +0 -0
  455. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/rest.py +0 -0
  456. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/signing.py +0 -0
  457. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/smart.py +0 -0
  458. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/soap.py +0 -0
  459. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/tcp.py +0 -0
  460. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/timer.py +0 -0
  461. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/transports/x12.py +0 -0
  462. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/verify/__init__.py +0 -0
  463. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/verify/checks.py +0 -0
  464. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/verify/model.py +0 -0
  465. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/verify/report.py +0 -0
  466. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/verify/runner.py +0 -0
  467. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/messagefoundry/verify/smoke.py +0 -0
  468. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/requirements.lock +0 -0
  469. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/config/IB_ACME_ADT.py +0 -0
  470. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/config/IB_FHIR_INTAKE.py +0 -0
  471. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
  472. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/config/IB_PARTNER_X12.py +0 -0
  473. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/config/IB_RADIOLOGY_SR.py +0 -0
  474. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
  475. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/config/adt.py +0 -0
  476. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/config/codesets/event_labels.csv +0 -0
  477. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/config/codesets/facility_mnemonics.toml +0 -0
  478. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/config/connections.toml +0 -0
  479. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/consistency/validated_adt.py +0 -0
  480. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/dicom/generate_sr_sample.py +0 -0
  481. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/adt_a01.hl7 +0 -0
  482. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/adt_batch.hl7 +0 -0
  483. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
  484. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/hapi-hl7v2/README.md +0 -0
  485. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
  486. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
  487. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
  488. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
  489. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
  490. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
  491. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
  492. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/messages/x12_270_eligibility.edi +0 -0
  493. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/results_relay/README.md +0 -0
  494. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/results_relay/codesets/test_codes.csv +0 -0
  495. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
  496. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/results_relay/messages/oru_results.hl7 +0 -0
  497. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/results_relay/results_relay.py +0 -0
  498. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/samples/send_mllp.py +0 -0
  499. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/console/install-console-shortcut.ps1 +0 -0
  500. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/console/pack_ico.py +0 -0
  501. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
  502. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/dev/postgres.ps1 +0 -0
  503. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/dev/sqlserver-docker.ps1 +0 -0
  504. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/dev/sqlserver.ps1 +0 -0
  505. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
  506. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/publish/check_release_sync.py +0 -0
  507. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/publish/publish-denylist.txt +0 -0
  508. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/publish/publish.ps1 +0 -0
  509. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/publish/scan_forbidden.py +0 -0
  510. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/security/crypto_inventory_check.py +0 -0
  511. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/security/vuln_metrics.py +0 -0
  512. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/service/import-db-ca.ps1 +0 -0
  513. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/service/install-service.ps1 +0 -0
  514. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/service/uninstall-service.ps1 +0 -0
  515. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/trace_icon.py +0 -0
  516. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/worktree/new.ps1 +0 -0
  517. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/worktree/remove.ps1 +0 -0
  518. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/worktree/session-context.ps1 +0 -0
  519. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/scripts/worktree/spawn.ps1 +0 -0
  520. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/__init__.py +0 -0
  521. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/__main__.py +0 -0
  522. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/anon/__init__.py +0 -0
  523. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/anon/_hl7data.py +0 -0
  524. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/anon/_pools.py +0 -0
  525. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/anon/hl7.py +0 -0
  526. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/anon/keying.py +0 -0
  527. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/anon/leak.py +0 -0
  528. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/anon/rules.py +0 -0
  529. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/anon/surrogates.py +0 -0
  530. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/compare.py +0 -0
  531. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/correlate.py +0 -0
  532. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/hl7_fields.py +0 -0
  533. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/mefor_api.py +0 -0
  534. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/mllp.py +0 -0
  535. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/relay.py +0 -0
  536. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/report.py +0 -0
  537. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tee/store.py +0 -0
  538. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/_dicom_sample.py +0 -0
  539. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/_failover_load_support.py +0 -0
  540. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/_fhir_fixtures.py +0 -0
  541. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/conftest.py +0 -0
  542. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_acceptance_framework.py +0 -0
  543. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_ack_capture_runner.py +0 -0
  544. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_ack_sent_store.py +0 -0
  545. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_active_environment.py +0 -0
  546. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_ad_group_scope.py +0 -0
  547. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_admin_new_ip.py +0 -0
  548. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_adr_analyze.py +0 -0
  549. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_ai_policy.py +0 -0
  550. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_alert_rules.py +0 -0
  551. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_alert_sinks.py +0 -0
  552. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_alerts_edit.py +0 -0
  553. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_alerts_rules_api.py +0 -0
  554. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_anon_core.py +0 -0
  555. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_anon_integration.py +0 -0
  556. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_anon_parity.py +0 -0
  557. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_api.py +0 -0
  558. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_api_auth.py +0 -0
  559. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_api_reload.py +0 -0
  560. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_api_tls.py +0 -0
  561. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_approvals.py +0 -0
  562. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_asvs_phase0.py +0 -0
  563. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_audit_integrity.py +0 -0
  564. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_audit_offbox_tee.py +0 -0
  565. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_auth_core.py +0 -0
  566. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_auth_entry_hardening.py +0 -0
  567. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_auth_hardening.py +0 -0
  568. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_auth_service.py +0 -0
  569. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_auth_session_lifecycle.py +0 -0
  570. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_auth_store.py +0 -0
  571. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_binary_carriage.py +0 -0
  572. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_cert_expiry.py +0 -0
  573. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_channel_rbac.py +0 -0
  574. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_checks.py +0 -0
  575. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_cli.py +0 -0
  576. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_cluster.py +0 -0
  577. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_cluster_failover_postgres.py +0 -0
  578. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_cluster_failover_sqlserver.py +0 -0
  579. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_cluster_graph_gating.py +0 -0
  580. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_cluster_lease.py +0 -0
  581. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_code_sets.py +0 -0
  582. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_codeset_edit.py +0 -0
  583. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_connection_api.py +0 -0
  584. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_connection_event_api.py +0 -0
  585. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_connection_event_emit.py +0 -0
  586. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_connection_event_outbound.py +0 -0
  587. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_connection_event_store.py +0 -0
  588. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_connection_resilience.py +0 -0
  589. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_connections_cli.py +0 -0
  590. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_connections_file.py +0 -0
  591. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_consistency.py +0 -0
  592. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_alerts.py +0 -0
  593. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_auth.py +0 -0
  594. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_client.py +0 -0
  595. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_dead_letters.py +0 -0
  596. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_event_log.py +0 -0
  597. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_hardening.py +0 -0
  598. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_icon.py +0 -0
  599. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_password.py +0 -0
  600. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_sessions.py +0 -0
  601. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_status.py +0 -0
  602. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_step_up.py +0 -0
  603. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_theme.py +0 -0
  604. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_users.py +0 -0
  605. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_console_widgets.py +0 -0
  606. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_database_connector_integration.py +0 -0
  607. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_database_transport.py +0 -0
  608. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_db_lookup.py +0 -0
  609. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_db_lookup_live_runner.py +0 -0
  610. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_delivery_settings.py +0 -0
  611. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_dependency_boundaries.py +0 -0
  612. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_dicom_codec.py +0 -0
  613. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_dicom_scp.py +0 -0
  614. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_dicom_scu.py +0 -0
  615. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_dicom_wiring.py +0 -0
  616. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_dicomweb.py +0 -0
  617. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_docs_runbooks.py +0 -0
  618. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_dryrun.py +0 -0
  619. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_ed_documents.py +0 -0
  620. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_ed_documents_e2e.py +0 -0
  621. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_egress_allowlist.py +0 -0
  622. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_environments.py +0 -0
  623. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_fhir_parsing.py +0 -0
  624. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_fhir_resource.py +0 -0
  625. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_fhir_transport.py +0 -0
  626. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_field_authz.py +0 -0
  627. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_fifo_ordering.py +0 -0
  628. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_generate_cli.py +0 -0
  629. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_generated_adt.py +0 -0
  630. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_generators_core.py +0 -0
  631. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_generators_types.py +0 -0
  632. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_groups.py +0 -0
  633. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_harness.py +0 -0
  634. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_harness_compose.py +0 -0
  635. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_harness_config.py +0 -0
  636. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_harness_faults.py +0 -0
  637. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_harness_file.py +0 -0
  638. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_harness_monitor.py +0 -0
  639. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_harness_scenarios.py +0 -0
  640. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_hl7_core_features.py +0 -0
  641. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_hl7schema.py +0 -0
  642. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_inbound_bind.py +0 -0
  643. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_ingest_time.py +0 -0
  644. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_keyprovider.py +0 -0
  645. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_last_resort.py +0 -0
  646. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_leader_tasks.py +0 -0
  647. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_load_config.py +0 -0
  648. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_load_corpus.py +0 -0
  649. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_load_failover_postgres.py +0 -0
  650. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_load_failover_sqlserver.py +0 -0
  651. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_load_failover_unit.py +0 -0
  652. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_load_metrics.py +0 -0
  653. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_load_profile.py +0 -0
  654. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_load_report.py +0 -0
  655. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_load_runner.py +0 -0
  656. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_load_sender.py +0 -0
  657. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_load_sink.py +0 -0
  658. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_logging.py +0 -0
  659. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_message.py +0 -0
  660. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_message_split.py +0 -0
  661. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_metrics_exporter.py +0 -0
  662. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_mfa.py +0 -0
  663. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_mllp_encoding_override.py +0 -0
  664. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_mllp_tls.py +0 -0
  665. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_operability_config.py +0 -0
  666. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_outbound_signing.py +0 -0
  667. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_outbound_simulate.py +0 -0
  668. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_packaging.py +0 -0
  669. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_parse_tree.py +0 -0
  670. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_parsing.py +0 -0
  671. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_payload_agnostic_ingress.py +0 -0
  672. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_postgres_store.py +0 -0
  673. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_reconcile_capture.py +0 -0
  674. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_reconcile_compare.py +0 -0
  675. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_reconcile_harness.py +0 -0
  676. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_redaction.py +0 -0
  677. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_reference_sets.py +0 -0
  678. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_reingress.py +0 -0
  679. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_remotefile_transport.py +0 -0
  680. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_response_capture.py +0 -0
  681. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_rest_transport.py +0 -0
  682. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_retention.py +0 -0
  683. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_run_context.py +0 -0
  684. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_scaffold.py +0 -0
  685. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_scan_forbidden.py +0 -0
  686. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_secrets_dpapi.py +0 -0
  687. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_security_notify.py +0 -0
  688. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_security_static.py +0 -0
  689. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_service_control.py +0 -0
  690. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_settings.py +0 -0
  691. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_smart_backend.py +0 -0
  692. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_soap_transport.py +0 -0
  693. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_soap_wssecurity.py +0 -0
  694. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_sqlserver_coordinator.py +0 -0
  695. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_sqlserver_store.py +0 -0
  696. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_staged_pipeline.py +0 -0
  697. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_startup_fault_isolation.py +0 -0
  698. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_stats_reset.py +0 -0
  699. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_step_up.py +0 -0
  700. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_store.py +0 -0
  701. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_store_backend.py +0 -0
  702. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_store_encryption.py +0 -0
  703. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_store_file_hardening.py +0 -0
  704. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_store_read_pool.py +0 -0
  705. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_store_ssl.py +0 -0
  706. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_summary.py +0 -0
  707. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_task_resilience.py +0 -0
  708. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_tcp_transport.py +0 -0
  709. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_tee_cli.py +0 -0
  710. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_tee_compare.py +0 -0
  711. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_tee_correlate.py +0 -0
  712. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_tee_hl7_fields.py +0 -0
  713. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_tee_mefor_api.py +0 -0
  714. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_tee_mllp.py +0 -0
  715. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_tee_relay.py +0 -0
  716. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_tee_report.py +0 -0
  717. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_tee_store.py +0 -0
  718. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_timer_source.py +0 -0
  719. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_timezone.py +0 -0
  720. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_tls_policy.py +0 -0
  721. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_totp.py +0 -0
  722. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_transform_state.py +0 -0
  723. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_transports.py +0 -0
  724. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_verify.py +0 -0
  725. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_version.py +0 -0
  726. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_win2025_acceptance.py +0 -0
  727. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_wiring.py +0 -0
  728. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_wiring_engine.py +0 -0
  729. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_wiring_reload.py +0 -0
  730. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_wiring_serve.py +0 -0
  731. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_x12_parsing.py +0 -0
  732. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_x12_rte.py +0 -0
  733. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/tests/test_x12_transport.py +0 -0
  734. {messagefoundry-0.2.3 → messagefoundry-0.2.5}/uv.lock +0 -0
@@ -10,6 +10,11 @@ concurrency:
10
10
  group: ci-${{ github.ref }}
11
11
  cancel-in-progress: true
12
12
 
13
+ # Least privilege: every job here only reads the repo and runs tests/builds (no gh writes, no git push,
14
+ # no secrets), so a read-only default token is sufficient. A job needing more declares its own block.
15
+ permissions:
16
+ contents: read
17
+
13
18
  jobs:
14
19
  # Lint + type-check + unit tests. The project supports a single Python — 3.14 — so every leg runs it.
15
20
  # Linux carries the cheap breadth (1x minutes); Windows Server 2022 + 2025 is the primary deployment
@@ -809,9 +814,13 @@ jobs:
809
814
  if: >-
810
815
  contains(needs.*.result, 'failure') ||
811
816
  contains(needs.*.result, 'cancelled')
817
+ env:
818
+ # Pass the needs context via env, not inline ${{ }} in the run block (defense-in-depth against
819
+ # template injection — a job output could in theory carry a quote that breaks out of echo).
820
+ NEEDS_JSON: ${{ toJSON(needs) }}
812
821
  run: |
813
822
  echo "::error::A gated CI leg failed or was cancelled."
814
- echo '${{ toJSON(needs) }}'
823
+ echo "$NEEDS_JSON"
815
824
  exit 1
816
825
 
817
826
  - name: Gated legs OK
@@ -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@dd903d2e4f5405488e5ef1422510ee31c8b32357 # v3.36.2
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@dd903d2e4f5405488e5ef1422510ee31c8b32357 # v3.36.2
66
+ with:
67
+ category: "/language:${{ matrix.language }}"
@@ -75,6 +75,10 @@ jobs:
75
75
  uv export --no-emit-project --no-dev --extra sqlserver --format requirements.txt -o docker/locks/requirements-sqlserver.lock
76
76
 
77
77
  - name: Commit and push the resynced locks
78
+ env:
79
+ # Pass the PR head ref through the environment, NOT inline ${{ }} in the run block, so a branch
80
+ # name containing shell metacharacters can never be evaluated as code (template injection).
81
+ HEAD_REF: ${{ github.event.pull_request.head.ref }}
78
82
  run: |
79
83
  set -euo pipefail
80
84
  git config user.name 'dependabot[bot]'
@@ -88,4 +92,4 @@ jobs:
88
92
  # Push with the persisted App-token credential (NOT GITHUB_TOKEN). An App-token push emits a
89
93
  # synchronize event so the required checks (DEP-1, ci.yml) re-run on the new commit; a
90
94
  # GITHUB_TOKEN push would leave them pending and the PR unmergeable.
91
- git push origin "HEAD:${{ github.event.pull_request.head.ref }}"
95
+ git push origin "HEAD:${HEAD_REF}"
@@ -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
@@ -26,16 +34,20 @@ on:
26
34
  - "v[0-9]+.[0-9]+.[0-9]+-*" # pre-releases: v0.1.0-rc1, …
27
35
  workflow_dispatch:
28
36
 
29
- permissions:
30
- contents: write # create the release + upload its assets
31
- id-token: write # Sigstore signing, PyPI Trusted Publishing, + provenance — all via the GitHub OIDC identity
32
- attestations: write # write the SLSA build-provenance attestation (actions/attest-build-provenance)
37
+ # Deny-all at the workflow level; each job below requests only the scopes it uses (least privilege).
38
+ permissions: {}
33
39
 
34
40
  jobs:
35
41
  release:
36
42
  runs-on: ubuntu-latest
43
+ permissions:
44
+ contents: write # create the release + upload its assets
45
+ id-token: write # Sigstore signing, PyPI Trusted Publishing, + provenance — all via the GitHub OIDC identity
46
+ attestations: write # write the SLSA build-provenance attestation (actions/attest-build-provenance)
37
47
  steps:
38
48
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
49
+ with:
50
+ persist-credentials: false # release uses GH_TOKEN env / OIDC, never the persisted git credential
39
51
 
40
52
  - name: Set up Python
41
53
  uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
@@ -151,3 +163,69 @@ jobs:
151
163
  packages-dir: dist-pub/
152
164
  skip-existing: true
153
165
  attestations: true
166
+
167
+ release-harness:
168
+ # Build + publish the SEPARATE `messagefoundry-harness` distribution (the synthetic test/load/failover
169
+ # harness, packaging/messagefoundry-harness/) in lockstep with the engine — same version, same tag.
170
+ # Isolated from the `release` job so a harness-side issue can never jeopardize the engine release;
171
+ # `needs: release` so the engine ships (and its GitHub release exists) first. Inherits the workflow's
172
+ # contents:write + id-token:write. The PyPI publish is GATED on the `PUBLISH_HARNESS` repo variable:
173
+ # until the owner sets up the harness Trusted Publisher AND PUBLISH_HARNESS=true (see the header note),
174
+ # this job still BUILDS + version-checks the wheel and attaches it to the GitHub release, but does not
175
+ # publish — so a missing harness PyPI project can never red a release.
176
+ needs: release
177
+ runs-on: ubuntu-latest
178
+ permissions:
179
+ contents: write # gh release upload (attach the harness wheel)
180
+ id-token: write # PyPI Trusted Publishing (OIDC) for the harness wheel
181
+ steps:
182
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
183
+ with:
184
+ persist-credentials: false # gh upload uses GH_TOKEN env / OIDC, never the persisted git credential
185
+
186
+ - name: Set up Python
187
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
188
+ with:
189
+ python-version: "3.14"
190
+
191
+ - name: Build the harness wheel (wheel-only — harness/ is force-included from the repo root)
192
+ run: |
193
+ python -m pip install --upgrade pip build
194
+ # Wheel-only on purpose: the harness source (harness/) lives OUTSIDE this project dir (it is
195
+ # force-included from ../../harness), so an sdist would not be self-contained. Pure-Python, so a
196
+ # wheel suffices. Version is read from messagefoundry/__init__.py (lockstep with the engine).
197
+ python -m build --wheel ./packaging/messagefoundry-harness --outdir harness-dist
198
+ ls -l harness-dist/
199
+
200
+ - name: Smoke-check the harness wheel (version == engine == tag)
201
+ run: |
202
+ built=$(python -c "import glob,re; print(re.search(r'messagefoundry_harness-([^-]+)-', glob.glob('harness-dist/*.whl')[0]).group(1))")
203
+ echo "harness wheel version: $built"
204
+ if [ "${GITHUB_REF_TYPE:-}" = "tag" ]; then
205
+ want="${GITHUB_REF_NAME#v}"
206
+ [ "$built" = "$want" ] || { echo "::error::harness wheel version $built != tag $want"; exit 1; }
207
+ fi
208
+
209
+ - name: Attach the harness wheel to the GitHub release
210
+ if: startsWith(github.ref, 'refs/tags/')
211
+ env:
212
+ GH_TOKEN: ${{ github.token }}
213
+ run: gh release upload "${GITHUB_REF_NAME}" harness-dist/*.whl --clobber
214
+
215
+ - name: Upload harness artifact (dry-run / always)
216
+ if: always()
217
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
218
+ with:
219
+ name: harness-artifacts
220
+ path: harness-dist/
221
+ if-no-files-found: ignore
222
+
223
+ # GATED: no-op until the owner configures the messagefoundry-harness PyPI Trusted Publisher AND sets
224
+ # repo variable PUBLISH_HARNESS=true. The build + version-check above still run every release.
225
+ - name: Publish messagefoundry-harness to PyPI (Trusted Publishing / OIDC)
226
+ if: ${{ startsWith(github.ref, 'refs/tags/') && vars.PUBLISH_HARNESS == 'true' }}
227
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
228
+ with:
229
+ packages-dir: harness-dist/
230
+ skip-existing: true
231
+ 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@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
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@dd903d2e4f5405488e5ef1422510ee31c8b32357 # v3.36.2
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
+ # BLOCKING: static analysis of the workflow files THEMSELVES (Trail of Bits) — template injection,
218
+ # over-broad GITHUB_TOKEN permissions, dangerous triggers, artifact-credential persistence. The
219
+ # baseline is clean — high-confidence findings are fixed in-tree (least-privilege per-job permissions,
220
+ # env-passed refs, persist-credentials: false) and the few safe-by-design ones are recorded with a
221
+ # justification in .github/zizmor.yml — so a NEW workflow-security regression now fails the build.
222
+ # Tune suppressions in .github/zizmor.yml (with a reason), not by relaxing this gate.
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
@@ -0,0 +1,31 @@
1
+ # zizmor configuration — https://docs.zizmor.sh/configuration/
2
+ #
3
+ # Each entry below is a REVIEWED, justified non-finding for this repo. Real fixes live in the workflow
4
+ # files themselves (least-privilege permissions, env-passed refs, persist-credentials: false); this file
5
+ # is only for findings that are safe-by-design here. Keep it small and commented — a suppression without
6
+ # a reason is a latent vulnerability.
7
+ rules:
8
+ dangerous-triggers:
9
+ ignore:
10
+ # A CLA assistant REQUIRES pull_request_target to record signatures + comment on fork PRs. This
11
+ # workflow never checks out untrusted PR code, pins the third-party action by SHA, and gates on the
12
+ # immutable comment body / event name — so the usual pull_request_target risk (running attacker
13
+ # code with a write token) does not apply. See the SECURITY note in cla.yml.
14
+ - cla.yml
15
+
16
+ artipacked:
17
+ ignore:
18
+ # artipacked flags a checkout that persists the token's git credential — a risk only if that
19
+ # credential can leak into an uploaded artifact. The jobs below do not push and never upload the
20
+ # repo/.git tree, so the persisted credential is inert noise here.
21
+ #
22
+ # NOT suppressed (fixed at the source instead): release.yml sets persist-credentials: false on both
23
+ # checkouts because it DOES upload build artifacts. dependabot-lock-resync.yml persists a
24
+ # narrowly-scoped App token ON PURPOSE to push the resynced locks (documented inline) and is listed
25
+ # here for that reason.
26
+ - benchmark.yml
27
+ - ci.yml
28
+ - dependabot-lock-resync.yml
29
+ - release-sync-check.yml
30
+ - security.yml
31
+ - vuln-metrics.yml
@@ -6,6 +6,38 @@ All notable changes to MessageFoundry are documented here. The format follows
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.2.5] — 2026-06-26 — Early Access
10
+
11
+ A bug-fix release hardening SQL Server cluster cold-start.
12
+
13
+ ### Fixed
14
+ - **SQL Server: concurrent schema-init race on a virgin DB (HA cold start).** Two cluster nodes starting
15
+ simultaneously against an empty database both ran the `IF OBJECT_ID(...) IS NULL CREATE TABLE` guards
16
+ with no cross-node lock, so both issued `CREATE` and the loser died at startup on a `2714` ("There is
17
+ already an object named ..."). `_ensure_schema` now takes an exclusive `sp_getapplock`
18
+ (`mefor:schema_init`) around the DDL — the T-SQL analog of the PostgreSQL store's existing schema
19
+ advisory lock — so the second node serializes and runs the now-no-op guarded CREATEs cleanly. Single-node
20
+ and pre-created schema are unaffected; SQLite and PostgreSQL were already race-safe. (#553)
21
+
22
+ ### Changed
23
+ - Docs: the `[cluster]` settings docstring and the pool-size validation error now name both `postgres` and
24
+ `sqlserver` (the cross-section validator already admitted both). (#553)
25
+
26
+ ## [0.2.4] — 2026-06-26 — Early Access
27
+
28
+ A bug-fix release that completes the EF-6 SQL Server fix shipped in 0.2.3.
29
+
30
+ ### Fixed
31
+ - **SQL Server: EF-6 "Connection is busy with results for another command" fully resolved (0.2.3's fix
32
+ was incomplete).** v0.2.3 (#543) switched the FIFO claim read to `fetchall`, but draining the
33
+ `UPDATE...OUTPUT` *rows* does not free the *statement handle* — without MARS the pooled connection was
34
+ still returned to the aioodbc pool busy, so the error reproduced at every cold start. All pooled cursor
35
+ sites now close the cursor (`SQLFreeStmt`/`SQLCloseCursor`) via a new `_cursor` context manager before
36
+ the connection is released, on both the success and exception paths; `claim_ready` (another
37
+ `UPDATE...OUTPUT`) and the `DELETE...OUTPUT` handoffs had the same latent gap and are covered too. A
38
+ driver-free unit test now asserts the close-before-release invariant so the regression can't recur.
39
+ SQLite and PostgreSQL were unaffected. (#550)
40
+
9
41
  ## [0.2.3] — 2026-06-26 — Early Access
10
42
 
11
43
  A bug-fix + feature release: the SQL Server store no longer raises "connection busy" errors under
@@ -171,7 +203,9 @@ tests, but the external code review + penetration test (the bar for a security-c
171
203
  - Releases are built, SBOM'd (CycloneDX), and signed with [Sigstore](https://www.sigstore.dev/) — see the
172
204
  `release` workflow.
173
205
 
174
- [Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.3...HEAD
206
+ [Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.5...HEAD
207
+ [0.2.5]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.4...v0.2.5
208
+ [0.2.4]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.3...v0.2.4
175
209
  [0.2.3]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.2...v0.2.3
176
210
  [0.2.2]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.1...v0.2.2
177
211
  [0.2.1]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.0...v0.2.1
@@ -1,10 +1,23 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: messagefoundry
3
- Version: 0.2.3
3
+ Version: 0.2.5
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
@@ -151,13 +164,20 @@ deliberate — replace `<version>` with the current release shown at the top of
151
164
  needs (each is opt-in and lazy-imported):
152
165
 
153
166
  ```bash
167
+ pip install "messagefoundry[console]==<version>" # admin console (PySide6 GUI) — the operator UI; most operators want this
154
168
  pip install "messagefoundry[postgres]==<version>" # PostgreSQL store backend (production server DB)
155
169
  pip install "messagefoundry[sqlserver]==<version>" # SQL Server store backend (+ OS-level ODBC Driver 18)
156
- pip install "messagefoundry[console]==<version>" # PySide6 admin console
157
170
  pip install "messagefoundry[sftp]==<version>" # SFTP transport for the REMOTEFILE connector
158
171
  pip install "messagefoundry[dicom]==<version>" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
159
172
  ```
160
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
+
161
181
  > **Verify before you install (supply chain).** Every release is built by a GitHub Actions workflow,
162
182
  > Sigstore-signed, and carries SLSA build-provenance + PEP 740 attestations. Verify a downloaded
163
183
  > wheel against its source commit with
@@ -201,10 +221,16 @@ python -m messagefoundry.console --url http://127.0.0.1:8765
201
221
 
202
222
  - **VS Code extension** ([`ide/`](https://github.com/wshallwshall/MessageFoundry/tree/main/ide/)) — author and test interfaces in your editor: a New Route
203
223
  Wizard, validate-on-save, a Test Bench (dry-run `.hl7` files with before/after diffs), Stage →
204
- Promote to a running engine, and an HL7-aware `@messagefoundry` chat participant. Open the `ide/`
205
- folder in VS Code and press **F5**, or see [ide/README.md](https://github.com/wshallwshall/MessageFoundry/blob/main/ide/README.md).
206
- - **Test harness** a standalone PySide6 send/receive MLLP tool for exercising the engine with
207
- 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.
208
234
 
209
235
  ## License
210
236
 
@@ -98,13 +98,20 @@ deliberate — replace `<version>` with the current release shown at the top of
98
98
  needs (each is opt-in and lazy-imported):
99
99
 
100
100
  ```bash
101
+ pip install "messagefoundry[console]==<version>" # admin console (PySide6 GUI) — the operator UI; most operators want this
101
102
  pip install "messagefoundry[postgres]==<version>" # PostgreSQL store backend (production server DB)
102
103
  pip install "messagefoundry[sqlserver]==<version>" # SQL Server store backend (+ OS-level ODBC Driver 18)
103
- pip install "messagefoundry[console]==<version>" # PySide6 admin console
104
104
  pip install "messagefoundry[sftp]==<version>" # SFTP transport for the REMOTEFILE connector
105
105
  pip install "messagefoundry[dicom]==<version>" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
106
106
  ```
107
107
 
108
+ **What's in the `messagefoundry` package — and what isn't.** It is the **engine plus the admin
109
+ console**: the console ships in the same wheel, with its PySide6/GUI dependencies as the opt-in
110
+ `[console]` extra, so a headless server, container, or adopter install stays lean — the console is one
111
+ flag away (`messagefoundry[console]`) when you want the operator UI. The **VS Code extension is a
112
+ separate product, not on PyPI** (a VS Code extension is a different ecosystem); see *VS Code extension &
113
+ test harness* below for where to get it.
114
+
108
115
  > **Verify before you install (supply chain).** Every release is built by a GitHub Actions workflow,
109
116
  > Sigstore-signed, and carries SLSA build-provenance + PEP 740 attestations. Verify a downloaded
110
117
  > wheel against its source commit with
@@ -148,10 +155,16 @@ python -m messagefoundry.console --url http://127.0.0.1:8765
148
155
 
149
156
  - **VS Code extension** ([`ide/`](https://github.com/wshallwshall/MessageFoundry/tree/main/ide/)) — author and test interfaces in your editor: a New Route
150
157
  Wizard, validate-on-save, a Test Bench (dry-run `.hl7` files with before/after diffs), Stage →
151
- Promote to a running engine, and an HL7-aware `@messagefoundry` chat participant. Open the `ide/`
152
- folder in VS Code and press **F5**, or see [ide/README.md](https://github.com/wshallwshall/MessageFoundry/blob/main/ide/README.md).
153
- - **Test harness** a standalone PySide6 send/receive MLLP tool for exercising the engine with
154
- synthetic, PHI-free traffic: `python -m harness`.
158
+ Promote to a running engine, and an HL7-aware `@messagefoundry` chat participant. **It is not on PyPI**
159
+ (a VS Code extension is a different ecosystem) **and not yet on the VS Code Marketplace** Marketplace
160
+ + Open VSX publishing is **planned** (see [the backlog](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/BACKLOG.md)). Until then, get it from
161
+ this repo: open the `ide/` folder in VS Code and press **F5** (Extension Development Host), or build the
162
+ VSIX (`cd ide && npm install && npx @vscode/vsce package`) and install the `.vsix`. See
163
+ [ide/README.md](https://github.com/wshallwshall/MessageFoundry/blob/main/ide/README.md).
164
+ - **Test harness** — synthetic-only send/receive (MLLP), load, and failover tooling for exercising a
165
+ running engine. It ships as a **separate distribution, `messagefoundry-harness`**, released in lockstep
166
+ with the engine (it is *not* in the engine wheel): `pip install messagefoundry-harness`, then
167
+ `python -m harness`. From a checkout, run `python -m harness` directly. Synthetic, PHI-free traffic only.
155
168
 
156
169
  ## License
157
170
 
@@ -104,6 +104,7 @@ separate owner exercise** — this is the candidate set, not a committed plan.
104
104
  | **#27 Serial / ASTM** | Low | **confirm-decline** | S | Out-of-scope niche, no demand (recorded #411). Revisit only on a concrete lab-analyzer requirement. |
105
105
  | **ASVS 13.3.3 HSM/KMS/Vault KeyProvider** | Med | **done** | — | #377 merged (`d35dbde`). Prune the stale `asvs-1333-keyprovider` worktree — don't fund twice. |
106
106
  | **ASVS 4.1.5 per-message signing** | Med | **done** | — | #378 merged (`9c00b88`). Prune the stale `asvs-415-msg-signing` worktree. |
107
+ | **Publish the VS Code extension (Marketplace + Open VSX)** | Med | do-next | M | Publish the `ide/` extension to the **VS Code Marketplace** + **Open VSX** (`.vsix` via `vsce`/`ovsx`) so users install it instead of F5-from-source; add a CI publish leg + publisher accounts. **Owner: do soon, AFTER the planned IDE-focused improvements land** (not now — recorded 2026-06-26). Not a PyPI artifact (different ecosystem). |
107
108
 
108
109
  **Top strategic calls:**
109
110
  1. **Lock v0.2 now** on fresh #28/#29 evidence + a #22b ship-or-slip — the single highest-leverage release-close move.
@@ -60,7 +60,7 @@ from messagefoundry.parsing.message import Message, RawMessage
60
60
  from messagefoundry.parsing.split import split_by_obr
61
61
  from messagefoundry.timezone import convert_hl7_timestamp, to_zone
62
62
 
63
- __version__ = "0.2.3"
63
+ __version__ = "0.2.5"
64
64
 
65
65
  __all__ = [
66
66
  "Message",
@@ -1116,8 +1116,8 @@ class ClusterSettings(_Section):
1116
1116
  ``heartbeat_seconds`` to ``DB_now + leader_lease_ttl_seconds``, a standby acquires only once that
1117
1117
  lease has expired, and a leader that cannot renew within ``leader_fence_timeout_seconds`` self-fences
1118
1118
  before the lease can expire (the split-brain guard). The cross-section validator below requires
1119
- ``[store].backend = postgres`` and ``[store].pool_size >= 2`` when this is enabled (a clustered node
1120
- drives concurrent background work against the pool)."""
1119
+ ``[store].backend`` in ``{postgres, sqlserver}`` and ``[store].pool_size >= 2`` when this is enabled
1120
+ (a clustered node drives concurrent background work against the pool)."""
1121
1121
 
1122
1122
  enabled: bool = False
1123
1123
  # Override the auto-generated node id (host:pid:hex). Pin it for a stable identity across restarts
@@ -1306,7 +1306,7 @@ class ServiceSettings(BaseModel):
1306
1306
  f"(got {self.store.pool_size}); a clustered node drives concurrent background work "
1307
1307
  "(the membership/lease maintenance loop + the leader reclaim sweep + the per-stage "
1308
1308
  "workers) against the pool, so a pool of 1 would serialize everything — prefer "
1309
- "pool_size >= 3 for clustered Postgres"
1309
+ "pool_size >= 3 for a clustered node (Postgres or SQL Server)"
1310
1310
  )
1311
1311
  return self
1312
1312