messagefoundry 0.2.2__tar.gz → 0.2.3__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 (727) hide show
  1. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.gitignore +6 -0
  2. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/CHANGELOG.md +33 -1
  3. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/PKG-INFO +41 -67
  4. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/README.md +40 -66
  5. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/BACKLOG.md +82 -0
  6. messagefoundry-0.2.3/docs/CODESETS.md +109 -0
  7. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CONFIGURATION.md +28 -0
  8. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CONNECTIONS.md +10 -0
  9. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/USER-GUIDE.md +45 -2
  10. messagefoundry-0.2.3/docs/adr/0033-gui-manageable-code-sets.md +212 -0
  11. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/README.md +1 -0
  12. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/package.json +68 -0
  13. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/cli.ts +50 -0
  14. messagefoundry-0.2.3/ide/src/codeSetEditor.ts +459 -0
  15. messagefoundry-0.2.3/ide/src/codesetsTree.ts +109 -0
  16. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/extension.ts +82 -0
  17. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/test/suite/extension.test.ts +16 -0
  18. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/__init__.py +1 -1
  19. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/__main__.py +101 -1
  20. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/app.py +55 -1
  21. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/models.py +16 -0
  22. messagefoundry-0.2.3/messagefoundry/config/codeset_edit.py +488 -0
  23. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/connections_file.py +16 -0
  24. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/settings.py +39 -5
  25. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/wiring.py +222 -14
  26. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/client.py +13 -0
  27. messagefoundry-0.2.3/messagefoundry/console/event_log_page.py +143 -0
  28. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/shell.py +5 -1
  29. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/alert_sinks.py +5 -0
  30. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/alerts.py +11 -0
  31. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/engine.py +31 -1
  32. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/retention.py +20 -0
  33. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/wiring_runner.py +330 -14
  34. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/base.py +78 -1
  35. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/postgres.py +171 -1
  36. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/sqlserver.py +183 -9
  37. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/store.py +211 -5
  38. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/base.py +15 -0
  39. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/mllp.py +47 -2
  40. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/tcp.py +36 -2
  41. messagefoundry-0.2.3/tests/test_ack_capture_runner.py +101 -0
  42. messagefoundry-0.2.3/tests/test_ack_sent_store.py +150 -0
  43. messagefoundry-0.2.3/tests/test_codeset_edit.py +641 -0
  44. messagefoundry-0.2.3/tests/test_connection_event_api.py +83 -0
  45. messagefoundry-0.2.3/tests/test_connection_event_emit.py +212 -0
  46. messagefoundry-0.2.3/tests/test_connection_event_outbound.py +100 -0
  47. messagefoundry-0.2.3/tests/test_connection_event_store.py +208 -0
  48. messagefoundry-0.2.3/tests/test_console_event_log.py +141 -0
  49. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_widgets.py +4 -2
  50. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_startup_fault_isolation.py +60 -0
  51. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_wiring.py +143 -1
  52. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_wiring_engine.py +4 -0
  53. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.claude/settings.json +0 -0
  54. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.dockerignore +0 -0
  55. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.gitattributes +0 -0
  56. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/CODEOWNERS +0 -0
  57. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  58. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  59. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  60. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  61. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/SECURITY.md +0 -0
  62. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/dependabot.yml +0 -0
  63. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/benchmark.yml +0 -0
  64. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/ci.yml +0 -0
  65. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/cla.yml +0 -0
  66. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/dependabot-auto-merge.yml +0 -0
  67. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/dependabot-lock-resync.yml +0 -0
  68. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/release-sync-check.yml +0 -0
  69. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/release.yml +0 -0
  70. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/security.yml +0 -0
  71. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/vuln-metrics.yml +0 -0
  72. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.gitleaks.toml +0 -0
  73. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.pre-commit-config.yaml +0 -0
  74. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.semgrep/messagefoundry.yml +0 -0
  75. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/CLA.md +0 -0
  76. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/CLAUDE.md +0 -0
  77. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/CODE_OF_CONDUCT.md +0 -0
  78. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/COMMERCIAL-LICENSE.md +0 -0
  79. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/CONTRIBUTING.md +0 -0
  80. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/GOVERNANCE.md +0 -0
  81. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/LICENSE +0 -0
  82. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/MAINTAINERS.md +0 -0
  83. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/NOTICE +0 -0
  84. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/Dockerfile +0 -0
  85. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/README.md +0 -0
  86. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/compose.yaml +0 -0
  87. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/k8s/secret.example.yaml +0 -0
  88. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/k8s/statefulset.yaml +0 -0
  89. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/locks/requirements-core.lock +0 -0
  90. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/locks/requirements-sqlserver.lock +0 -0
  91. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/secrets.env.example +0 -0
  92. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/smoke/Dockerfile +0 -0
  93. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/smoke/config/IB_Test_ADT.py +0 -0
  94. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/smoke/send_adt.py +0 -0
  95. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/ADOPTER-CI.md +0 -0
  96. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/AI.md +0 -0
  97. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/ARCHITECTURE.md +0 -0
  98. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CI-QUALITY.md +0 -0
  99. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CLUSTERING.md +0 -0
  100. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CONTAINER-EXPOSURE-EVALUATION.md +0 -0
  101. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
  102. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
  103. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
  104. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/DEPLOY-SERVER-DB.md +0 -0
  105. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/DEPLOYMENT.md +0 -0
  106. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/DICOM.md +0 -0
  107. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/DUAL_LICENSING_PLAN.md +0 -0
  108. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
  109. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/FEATURE-MAP.md +0 -0
  110. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/HL7-VALIDATION.md +0 -0
  111. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/INSTALL-GUIDE.md +0 -0
  112. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/LOAD-TESTING.md +0 -0
  113. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/MENTAL-MODEL.md +0 -0
  114. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/MessageFoundry-Mental-Model.docx +0 -0
  115. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/PHI.md +0 -0
  116. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
  117. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/REMOTE-CONSOLE.md +0 -0
  118. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/SECURITY.md +0 -0
  119. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/SERVICE.md +0 -0
  120. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/SUPPORT-POLICY.md +0 -0
  121. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/SYSTEM-REQUIREMENTS.md +0 -0
  122. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/Secure_AI_Development_Standards.md +0 -0
  123. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/Secure_Development_Standards.md +0 -0
  124. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/TEE-RELAY.md +0 -0
  125. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/THROUGHPUT-IMPROVEMENTS.md +0 -0
  126. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/WORKTREES.md +0 -0
  127. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0001-staged-pipeline-architecture.md +0 -0
  128. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
  129. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
  130. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
  131. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0005-transform-accessible-state.md +0 -0
  132. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0006-external-data-lookups.md +0 -0
  133. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
  134. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0008-cluster-observability-api.md +0 -0
  135. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0009-run-scoped-context-providers.md +0 -0
  136. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
  137. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0011-timer-scheduled-source.md +0 -0
  138. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0012-x12-edi-codec.md +0 -0
  139. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0013-increment-2-reingress-design.md +0 -0
  140. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0013-query-response-orchestration.md +0 -0
  141. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0014-alerting-rules-engine.md +0 -0
  142. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
  143. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
  144. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0017-consumer-deployment-model.md +0 -0
  145. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
  146. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
  147. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
  148. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
  149. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
  150. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
  151. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
  152. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0026-off-box-egress-update-check.md +0 -0
  153. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
  154. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
  155. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
  156. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0032-console-desktop-launch.md +0 -0
  157. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/TEMPLATE.md +0 -0
  158. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-components.png +0 -0
  159. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-components.svg +0 -0
  160. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-config-graph.png +0 -0
  161. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-config-graph.svg +0 -0
  162. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-diagram.md +0 -0
  163. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-message-flow.png +0 -0
  164. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-message-flow.svg +0 -0
  165. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-topology.png +0 -0
  166. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-topology.svg +0 -0
  167. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/TUNING-BASELINE.md +0 -0
  168. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
  169. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
  170. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
  171. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
  172. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
  173. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
  174. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/step-b-write-amplification.md +0 -0
  175. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/hl7-message-ordering-reference.md +0 -0
  176. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/message-ordering-design.md +0 -0
  177. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
  178. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
  179. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
  180. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
  181. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
  182. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/MULTISESSION-PLAN.md +0 -0
  183. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
  184. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
  185. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
  186. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/v0.1-PLAN.md +0 -0
  187. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
  188. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/research/cloud-deployment-research-2026-06.md +0 -0
  189. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/research/config-ux-review.md +0 -0
  190. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/research/non-hl7-transform-components.md +0 -0
  191. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
  192. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
  193. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ADVISORY-PROCESS.md +0 -0
  194. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
  195. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
  196. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
  197. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
  198. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
  199. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-L3-STATUS.md +0 -0
  200. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
  201. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
  202. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
  203. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/BEYOND-ASVS-L3.md +0 -0
  204. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
  205. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/DEPENDENCY-METRICS.md +0 -0
  206. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
  207. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/PHASE-8C-RBAC.md +0 -0
  208. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/PUBLISHING.md +0 -0
  209. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/RCA-TEMPLATE.md +0 -0
  210. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/RELEASE-GATE.md +0 -0
  211. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/REMEDIATION-PLAN.md +0 -0
  212. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/REVIEW-2026-06-07.md +0 -0
  213. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
  214. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
  215. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SECURITY-POSTURE.md +0 -0
  216. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
  217. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
  218. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
  219. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/THREAT-MODEL.md +0 -0
  220. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/testing/VERIFY.md +0 -0
  221. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
  222. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
  223. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
  224. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/environments/dev.toml +0 -0
  225. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/environments/prod.toml +0 -0
  226. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/README.md +0 -0
  227. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/__main__.py +0 -0
  228. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/__init__.py +0 -0
  229. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/__main__.py +0 -0
  230. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/matrix.py +0 -0
  231. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/probes.py +0 -0
  232. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/report.py +0 -0
  233. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/runner.py +0 -0
  234. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/compose.py +0 -0
  235. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/config/coverage.py +0 -0
  236. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/config/load/_shape.py +0 -0
  237. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/config/load/graph.py +0 -0
  238. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/file_panel.py +0 -0
  239. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/file_transport.py +0 -0
  240. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/__init__.py +0 -0
  241. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/corpus.py +0 -0
  242. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/correlator.py +0 -0
  243. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/enginepoll.py +0 -0
  244. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/failover.py +0 -0
  245. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/failover_track.py +0 -0
  246. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/governor.py +0 -0
  247. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/ids.py +0 -0
  248. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/metrics.py +0 -0
  249. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profile.py +0 -0
  250. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/README.md +0 -0
  251. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/closed-loop.toml +0 -0
  252. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/failover.toml +0 -0
  253. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/fanout-baseline.toml +0 -0
  254. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/malformed-load.toml +0 -0
  255. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/reference.toml +0 -0
  256. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/smoke-sqlserver.toml +0 -0
  257. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/smoke.toml +0 -0
  258. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/soak.toml +0 -0
  259. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/spike-burst.toml +0 -0
  260. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/sustained-overload.toml +0 -0
  261. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/writeamp.toml +0 -0
  262. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/report.py +0 -0
  263. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/runner.py +0 -0
  264. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/sender.py +0 -0
  265. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/sink.py +0 -0
  266. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/mllp.py +0 -0
  267. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/monitor.py +0 -0
  268. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/receive.py +0 -0
  269. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/__init__.py +0 -0
  270. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/__main__.py +0 -0
  271. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/capture.py +0 -0
  272. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/compare.py +0 -0
  273. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/normalize.py +0 -0
  274. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/report.py +0 -0
  275. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/scenarios.py +0 -0
  276. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/send.py +0 -0
  277. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/window.py +0 -0
  278. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/.gitignore +0 -0
  279. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/.vscodeignore +0 -0
  280. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/README.md +0 -0
  281. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/esbuild.js +0 -0
  282. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/media/hl7schema.json +0 -0
  283. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/media/icon.png +0 -0
  284. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/media/icon.svg +0 -0
  285. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/package-lock.json +0 -0
  286. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/snippets/messagefoundry.code-snippets +0 -0
  287. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/aiPolicy.ts +0 -0
  288. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/alertEditor.ts +0 -0
  289. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/auth.ts +0 -0
  290. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/chat.ts +0 -0
  291. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/completion.ts +0 -0
  292. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/connectionEditor.ts +0 -0
  293. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/engineClient.ts +0 -0
  294. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/generate.ts +0 -0
  295. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/git.ts +0 -0
  296. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/graphTree.ts +0 -0
  297. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/home.ts +0 -0
  298. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/newRoute.ts +0 -0
  299. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/promote.ts +0 -0
  300. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/sourceControl.ts +0 -0
  301. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/test/runTest.ts +0 -0
  302. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/test/suite/chat.test.ts +0 -0
  303. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/test/suite/index.ts +0 -0
  304. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/testBench.ts +0 -0
  305. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/validate.ts +0 -0
  306. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/tsconfig.json +0 -0
  307. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/tsconfig.test.json +0 -0
  308. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/mefor.code-workspace +0 -0
  309. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/adr_analyze.py +0 -0
  310. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/__init__.py +0 -0
  311. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/_pools.py +0 -0
  312. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/hl7.py +0 -0
  313. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/keying.py +0 -0
  314. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/leak.py +0 -0
  315. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/rules.py +0 -0
  316. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/surrogates.py +0 -0
  317. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/__init__.py +0 -0
  318. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/approvals.py +0 -0
  319. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/auth_models.py +0 -0
  320. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/auth_routes.py +0 -0
  321. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/field_authz.py +0 -0
  322. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/metrics.py +0 -0
  323. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/security.py +0 -0
  324. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/tls.py +0 -0
  325. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/__init__.py +0 -0
  326. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
  327. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/data/common_passwords.txt +0 -0
  328. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/identity.py +0 -0
  329. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/ldap.py +0 -0
  330. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/notifications.py +0 -0
  331. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/passwords.py +0 -0
  332. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/permissions.py +0 -0
  333. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/policy.py +0 -0
  334. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/ratelimit.py +0 -0
  335. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/service.py +0 -0
  336. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/tokens.py +0 -0
  337. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/totp.py +0 -0
  338. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/checks.py +0 -0
  339. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/__init__.py +0 -0
  340. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/active_environment.py +0 -0
  341. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/ai_policy.py +0 -0
  342. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/alerts_edit.py +0 -0
  343. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/code_sets.py +0 -0
  344. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/connections_edit.py +0 -0
  345. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/db_lookup.py +0 -0
  346. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/environments.py +0 -0
  347. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/ingest_time.py +0 -0
  348. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/models.py +0 -0
  349. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/reference.py +0 -0
  350. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/response.py +0 -0
  351. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/run_context.py +0 -0
  352. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/state.py +0 -0
  353. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/tls_policy.py +0 -0
  354. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/__init__.py +0 -0
  355. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/__main__.py +0 -0
  356. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/_async.py +0 -0
  357. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/alerts_page.py +0 -0
  358. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/change_password.py +0 -0
  359. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/connections.py +0 -0
  360. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/dead_letters_page.py +0 -0
  361. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/delegates.py +0 -0
  362. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/alerts.svg +0 -0
  363. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/connections.svg +0 -0
  364. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/dead-letters.svg +0 -0
  365. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/engine-status.svg +0 -0
  366. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/log-search.svg +0 -0
  367. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/logo-lockup.svg +0 -0
  368. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/users.svg +0 -0
  369. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/login.py +0 -0
  370. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/mfa.py +0 -0
  371. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/reauth.py +0 -0
  372. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/resources/README.md +0 -0
  373. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/resources/app.ico +0 -0
  374. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/resources/app.svg +0 -0
  375. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/search.py +0 -0
  376. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/service_control.py +0 -0
  377. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/sessions.py +0 -0
  378. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/status.py +0 -0
  379. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/theme.py +0 -0
  380. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/users_page.py +0 -0
  381. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/widgets.py +0 -0
  382. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/README.md +0 -0
  383. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/__init__.py +0 -0
  384. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/_core.py +0 -0
  385. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/_hl7data.py +0 -0
  386. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/adt.py +0 -0
  387. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/all_types.py +0 -0
  388. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/bar.py +0 -0
  389. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/dft.py +0 -0
  390. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/documents.py +0 -0
  391. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/mdm.py +0 -0
  392. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/mfn.py +0 -0
  393. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/oml.py +0 -0
  394. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/orl.py +0 -0
  395. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/orm.py +0 -0
  396. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/oru.py +0 -0
  397. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/ras.py +0 -0
  398. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/rde.py +0 -0
  399. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/siu.py +0 -0
  400. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/vxu.py +0 -0
  401. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/hl7schema.py +0 -0
  402. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/last_resort.py +0 -0
  403. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/logging_setup.py +0 -0
  404. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/__init__.py +0 -0
  405. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/binary.py +0 -0
  406. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/consistency.py +0 -0
  407. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/__init__.py +0 -0
  408. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/_deps.py +0 -0
  409. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/_util.py +0 -0
  410. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/dataset.py +0 -0
  411. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/errors.py +0 -0
  412. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
  413. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/peek.py +0 -0
  414. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/fhir/__init__.py +0 -0
  415. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/fhir/_deps.py +0 -0
  416. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/fhir/errors.py +0 -0
  417. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/fhir/peek.py +0 -0
  418. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/fhir/resource.py +0 -0
  419. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/groups.py +0 -0
  420. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/message.py +0 -0
  421. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/peek.py +0 -0
  422. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/split.py +0 -0
  423. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/summary.py +0 -0
  424. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/tree.py +0 -0
  425. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/validate.py +0 -0
  426. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/__init__.py +0 -0
  427. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/delimiters.py +0 -0
  428. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/errors.py +0 -0
  429. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/interchange.py +0 -0
  430. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/message.py +0 -0
  431. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/peek.py +0 -0
  432. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/__init__.py +0 -0
  433. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/cert_expiry.py +0 -0
  434. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/cluster.py +0 -0
  435. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
  436. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/config_convergence.py +0 -0
  437. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/dryrun.py +0 -0
  438. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/leader_tasks.py +0 -0
  439. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/reference_sync.py +0 -0
  440. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/security_notify.py +0 -0
  441. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/state_convergence.py +0 -0
  442. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/py.typed +0 -0
  443. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/redaction.py +0 -0
  444. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/scaffold.py +0 -0
  445. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/secrets_dpapi.py +0 -0
  446. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/__init__.py +0 -0
  447. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/audit_tee.py +0 -0
  448. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/crypto.py +0 -0
  449. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/keyprovider.py +0 -0
  450. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/timezone.py +0 -0
  451. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/__init__.py +0 -0
  452. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/database.py +0 -0
  453. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/dicom.py +0 -0
  454. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/dicomweb.py +0 -0
  455. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/fhir.py +0 -0
  456. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/file.py +0 -0
  457. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/framing.py +0 -0
  458. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/loopback.py +0 -0
  459. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/remotefile.py +0 -0
  460. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/rest.py +0 -0
  461. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/signing.py +0 -0
  462. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/smart.py +0 -0
  463. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/soap.py +0 -0
  464. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/timer.py +0 -0
  465. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/x12.py +0 -0
  466. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/__init__.py +0 -0
  467. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/checks.py +0 -0
  468. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/model.py +0 -0
  469. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/report.py +0 -0
  470. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/runner.py +0 -0
  471. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/smoke.py +0 -0
  472. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/pyproject.toml +0 -0
  473. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/requirements.lock +0 -0
  474. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_ACME_ADT.py +0 -0
  475. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_FHIR_INTAKE.py +0 -0
  476. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
  477. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_PARTNER_X12.py +0 -0
  478. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_RADIOLOGY_SR.py +0 -0
  479. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
  480. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/adt.py +0 -0
  481. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/codesets/event_labels.csv +0 -0
  482. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/codesets/facility_mnemonics.toml +0 -0
  483. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/connections.toml +0 -0
  484. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/consistency/validated_adt.py +0 -0
  485. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/dicom/generate_sr_sample.py +0 -0
  486. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/adt_a01.hl7 +0 -0
  487. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/adt_batch.hl7 +0 -0
  488. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
  489. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/README.md +0 -0
  490. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
  491. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
  492. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
  493. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
  494. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
  495. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
  496. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
  497. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/x12_270_eligibility.edi +0 -0
  498. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/results_relay/README.md +0 -0
  499. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/results_relay/codesets/test_codes.csv +0 -0
  500. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
  501. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/results_relay/messages/oru_results.hl7 +0 -0
  502. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/results_relay/results_relay.py +0 -0
  503. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/send_mllp.py +0 -0
  504. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/console/install-console-shortcut.ps1 +0 -0
  505. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/console/pack_ico.py +0 -0
  506. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
  507. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/dev/postgres.ps1 +0 -0
  508. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/dev/sqlserver-docker.ps1 +0 -0
  509. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/dev/sqlserver.ps1 +0 -0
  510. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
  511. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/publish/check_release_sync.py +0 -0
  512. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/publish/publish-denylist.txt +0 -0
  513. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/publish/publish.ps1 +0 -0
  514. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/publish/scan_forbidden.py +0 -0
  515. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/security/crypto_inventory_check.py +0 -0
  516. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/security/vuln_metrics.py +0 -0
  517. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/service/import-db-ca.ps1 +0 -0
  518. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/service/install-service.ps1 +0 -0
  519. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/service/uninstall-service.ps1 +0 -0
  520. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/trace_icon.py +0 -0
  521. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/worktree/new.ps1 +0 -0
  522. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/worktree/remove.ps1 +0 -0
  523. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/worktree/session-context.ps1 +0 -0
  524. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/worktree/spawn.ps1 +0 -0
  525. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/__init__.py +0 -0
  526. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/__main__.py +0 -0
  527. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/__init__.py +0 -0
  528. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/_hl7data.py +0 -0
  529. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/_pools.py +0 -0
  530. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/hl7.py +0 -0
  531. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/keying.py +0 -0
  532. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/leak.py +0 -0
  533. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/rules.py +0 -0
  534. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/surrogates.py +0 -0
  535. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/compare.py +0 -0
  536. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/correlate.py +0 -0
  537. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/hl7_fields.py +0 -0
  538. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/mefor_api.py +0 -0
  539. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/mllp.py +0 -0
  540. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/relay.py +0 -0
  541. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/report.py +0 -0
  542. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/store.py +0 -0
  543. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/_dicom_sample.py +0 -0
  544. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/_failover_load_support.py +0 -0
  545. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/_fhir_fixtures.py +0 -0
  546. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/conftest.py +0 -0
  547. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_acceptance_framework.py +0 -0
  548. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_active_environment.py +0 -0
  549. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_ad_group_scope.py +0 -0
  550. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_admin_new_ip.py +0 -0
  551. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_adr_analyze.py +0 -0
  552. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_ai_policy.py +0 -0
  553. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_alert_rules.py +0 -0
  554. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_alert_sinks.py +0 -0
  555. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_alerts_edit.py +0 -0
  556. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_alerts_rules_api.py +0 -0
  557. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_anon_core.py +0 -0
  558. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_anon_integration.py +0 -0
  559. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_anon_parity.py +0 -0
  560. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_api.py +0 -0
  561. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_api_auth.py +0 -0
  562. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_api_reload.py +0 -0
  563. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_api_tls.py +0 -0
  564. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_approvals.py +0 -0
  565. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_asvs_phase0.py +0 -0
  566. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_audit_integrity.py +0 -0
  567. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_audit_offbox_tee.py +0 -0
  568. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_core.py +0 -0
  569. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_entry_hardening.py +0 -0
  570. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_hardening.py +0 -0
  571. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_service.py +0 -0
  572. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_session_lifecycle.py +0 -0
  573. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_store.py +0 -0
  574. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_binary_carriage.py +0 -0
  575. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cert_expiry.py +0 -0
  576. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_channel_rbac.py +0 -0
  577. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_checks.py +0 -0
  578. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cli.py +0 -0
  579. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cluster.py +0 -0
  580. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cluster_failover_postgres.py +0 -0
  581. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cluster_failover_sqlserver.py +0 -0
  582. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cluster_graph_gating.py +0 -0
  583. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cluster_lease.py +0 -0
  584. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_code_sets.py +0 -0
  585. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_connection_api.py +0 -0
  586. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_connection_resilience.py +0 -0
  587. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_connections_cli.py +0 -0
  588. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_connections_file.py +0 -0
  589. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_consistency.py +0 -0
  590. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_alerts.py +0 -0
  591. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_auth.py +0 -0
  592. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_client.py +0 -0
  593. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_dead_letters.py +0 -0
  594. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_hardening.py +0 -0
  595. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_icon.py +0 -0
  596. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_password.py +0 -0
  597. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_sessions.py +0 -0
  598. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_status.py +0 -0
  599. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_step_up.py +0 -0
  600. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_theme.py +0 -0
  601. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_users.py +0 -0
  602. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_database_connector_integration.py +0 -0
  603. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_database_transport.py +0 -0
  604. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_db_lookup.py +0 -0
  605. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_db_lookup_live_runner.py +0 -0
  606. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_delivery_settings.py +0 -0
  607. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dependency_boundaries.py +0 -0
  608. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dicom_codec.py +0 -0
  609. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dicom_scp.py +0 -0
  610. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dicom_scu.py +0 -0
  611. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dicom_wiring.py +0 -0
  612. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dicomweb.py +0 -0
  613. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_docs_runbooks.py +0 -0
  614. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dryrun.py +0 -0
  615. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_ed_documents.py +0 -0
  616. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_ed_documents_e2e.py +0 -0
  617. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_egress_allowlist.py +0 -0
  618. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_environments.py +0 -0
  619. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_fhir_parsing.py +0 -0
  620. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_fhir_resource.py +0 -0
  621. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_fhir_transport.py +0 -0
  622. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_field_authz.py +0 -0
  623. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_fifo_ordering.py +0 -0
  624. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_generate_cli.py +0 -0
  625. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_generated_adt.py +0 -0
  626. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_generators_core.py +0 -0
  627. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_generators_types.py +0 -0
  628. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_groups.py +0 -0
  629. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness.py +0 -0
  630. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_compose.py +0 -0
  631. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_config.py +0 -0
  632. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_faults.py +0 -0
  633. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_file.py +0 -0
  634. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_monitor.py +0 -0
  635. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_scenarios.py +0 -0
  636. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_hl7_core_features.py +0 -0
  637. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_hl7schema.py +0 -0
  638. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_inbound_bind.py +0 -0
  639. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_ingest_time.py +0 -0
  640. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_keyprovider.py +0 -0
  641. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_last_resort.py +0 -0
  642. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_leader_tasks.py +0 -0
  643. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_config.py +0 -0
  644. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_corpus.py +0 -0
  645. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_failover_postgres.py +0 -0
  646. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_failover_sqlserver.py +0 -0
  647. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_failover_unit.py +0 -0
  648. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_metrics.py +0 -0
  649. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_profile.py +0 -0
  650. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_report.py +0 -0
  651. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_runner.py +0 -0
  652. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_sender.py +0 -0
  653. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_sink.py +0 -0
  654. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_logging.py +0 -0
  655. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_message.py +0 -0
  656. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_message_split.py +0 -0
  657. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_metrics_exporter.py +0 -0
  658. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_mfa.py +0 -0
  659. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_mllp_encoding_override.py +0 -0
  660. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_mllp_tls.py +0 -0
  661. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_operability_config.py +0 -0
  662. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_outbound_signing.py +0 -0
  663. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_outbound_simulate.py +0 -0
  664. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_packaging.py +0 -0
  665. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_parse_tree.py +0 -0
  666. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_parsing.py +0 -0
  667. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_payload_agnostic_ingress.py +0 -0
  668. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_postgres_store.py +0 -0
  669. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_reconcile_capture.py +0 -0
  670. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_reconcile_compare.py +0 -0
  671. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_reconcile_harness.py +0 -0
  672. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_redaction.py +0 -0
  673. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_reference_sets.py +0 -0
  674. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_reingress.py +0 -0
  675. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_remotefile_transport.py +0 -0
  676. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_response_capture.py +0 -0
  677. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_rest_transport.py +0 -0
  678. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_retention.py +0 -0
  679. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_run_context.py +0 -0
  680. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_scaffold.py +0 -0
  681. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_scan_forbidden.py +0 -0
  682. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_secrets_dpapi.py +0 -0
  683. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_security_notify.py +0 -0
  684. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_security_static.py +0 -0
  685. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_service_control.py +0 -0
  686. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_settings.py +0 -0
  687. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_smart_backend.py +0 -0
  688. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_soap_transport.py +0 -0
  689. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_soap_wssecurity.py +0 -0
  690. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_sqlserver_coordinator.py +0 -0
  691. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_sqlserver_store.py +0 -0
  692. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_staged_pipeline.py +0 -0
  693. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_stats_reset.py +0 -0
  694. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_step_up.py +0 -0
  695. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store.py +0 -0
  696. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store_backend.py +0 -0
  697. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store_encryption.py +0 -0
  698. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store_file_hardening.py +0 -0
  699. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store_read_pool.py +0 -0
  700. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store_ssl.py +0 -0
  701. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_summary.py +0 -0
  702. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_task_resilience.py +0 -0
  703. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tcp_transport.py +0 -0
  704. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_cli.py +0 -0
  705. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_compare.py +0 -0
  706. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_correlate.py +0 -0
  707. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_hl7_fields.py +0 -0
  708. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_mefor_api.py +0 -0
  709. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_mllp.py +0 -0
  710. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_relay.py +0 -0
  711. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_report.py +0 -0
  712. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_store.py +0 -0
  713. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_timer_source.py +0 -0
  714. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_timezone.py +0 -0
  715. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tls_policy.py +0 -0
  716. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_totp.py +0 -0
  717. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_transform_state.py +0 -0
  718. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_transports.py +0 -0
  719. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_verify.py +0 -0
  720. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_version.py +0 -0
  721. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_win2025_acceptance.py +0 -0
  722. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_wiring_reload.py +0 -0
  723. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_wiring_serve.py +0 -0
  724. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_x12_parsing.py +0 -0
  725. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_x12_rte.py +0 -0
  726. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_x12_transport.py +0 -0
  727. {messagefoundry-0.2.2 → messagefoundry-0.2.3}/uv.lock +0 -0
@@ -74,3 +74,9 @@ TRANSCRIPTS.md
74
74
  /docs/security/DEPENDENCY-RESPONSE-A4-HANDOFF.md
75
75
  # vuln_metrics.py local CSV output (the CI run uploads it as an artifact; not committed)
76
76
  /docs/security/metrics/
77
+
78
+ # Operator-local load/throughput profiles — tuned to a specific deployment's volume; kept OUT of the
79
+ # OSS repo + public mirror (the plan itself lives on the operator share, WIN2025-LOAD-THROUGHPUT-MATRIX.md).
80
+ # Still usable by name (they sit in PROFILES_DIR) and copy-on to the test box.
81
+ /harness/load/profiles/hospital-baseline.toml
82
+ /harness/load/profiles/soak-12h.toml
@@ -6,6 +6,36 @@ All notable changes to MessageFoundry are documented here. The format follows
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.2.3] — 2026-06-26 — Early Access
10
+
11
+ A bug-fix + feature release: the SQL Server store no longer raises "connection busy" errors under
12
+ concurrent load, plus connection/transport event logging, GUI-managed translation tables, and inbound
13
+ listener port-conflict detection.
14
+
15
+ ### Fixed
16
+ - **SQL Server: "Connection is busy with results for another command" under concurrent load (EF-6).**
17
+ `claim_next_fifo` — and three sibling sites (`_maybe_finalize`, `consume_recovery_code_hash`,
18
+ `consume_totp_step`) — read a result-set-returning statement with a lone `fetchone()` and could return
19
+ the pooled connection to the pool with the result set still pending, so the next borrower's first
20
+ command raced an `HY000` busy error (ODBC Driver 18, no MARS). All affected sites now fully drain the
21
+ result set (`fetchall`) before commit/release. SQLite and PostgreSQL were unaffected (asyncpg
22
+ materializes rows; SQLite has no shared pooled-connection single-result-set constraint). (#543)
23
+
24
+ ### Added
25
+ - **Connection/transport event log + "Response Sent" ACK capture** (ADR 0020 / ADR 0021). A new id-keyed,
26
+ metadata-only `connection_event` table records inbound connection lifecycle, pre-ingress failures, and
27
+ outbound lane transitions, with a `[diagnostics]` config block (per-connection overrides + retention),
28
+ a `GET /events` read API, and a console **Event Log** page. Event reasons are scrubbed and encrypted at
29
+ rest. (#541)
30
+ - **GUI-managed translation tables (code sets)** (ADR 0033). A code-set CLI + writer and a VS Code
31
+ extension grid editor / **Translation Tables** view for maintaining code-set mappings. (#540)
32
+ - **Inbound listener port-conflict detection** — static + runtime checks that flag two inbound
33
+ connections bound to the same host:port before they collide at startup. (#538)
34
+
35
+ ### Changed
36
+ - Docs: README install instructions are now version-agnostic and link the website docs; the roadmap
37
+ section is replaced with a features summary. (#542, #544)
38
+
9
39
  ## [0.2.2] — 2026-06-24 — Early Access
10
40
 
11
41
  A security-hardening release: PHI-at-rest encryption is closed across every backend, the active-passive
@@ -141,7 +171,9 @@ tests, but the external code review + penetration test (the bar for a security-c
141
171
  - Releases are built, SBOM'd (CycloneDX), and signed with [Sigstore](https://www.sigstore.dev/) — see the
142
172
  `release` workflow.
143
173
 
144
- [Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.1...HEAD
174
+ [Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.3...HEAD
175
+ [0.2.3]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.2...v0.2.3
176
+ [0.2.2]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.1...v0.2.2
145
177
  [0.2.1]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.0...v0.2.1
146
178
  [0.2.0]: https://github.com/wshallwshall/MessageFoundry/compare/v0.1.0...v0.2.0
147
179
  [0.1.0]: https://github.com/wshallwshall/MessageFoundry/releases/tag/v0.1.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: messagefoundry
3
- Version: 0.2.2
3
+ Version: 0.2.3
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
@@ -102,62 +102,34 @@ renders on GitHub and in the VS Code preview). The prose source of truth is
102
102
  and **transport TLS** (HTTPS/WSS for the API plus MLLP-over-TLS) are **built**; MFA and off-box log
103
103
  shipping remain on the roadmap. See [docs/PHI.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/PHI.md) for the full data-protection map.
104
104
 
105
- ## Roadmap
106
-
107
- **Phase 1 minimum reliable engine**
108
- - [x] Connection/Router/Handler model + config-module loader
109
- - [x] Durable message store / queue (SQLite WAL, outbox pattern)
110
- - [x] Parse / validate (tolerant peek + opt-in strict validation)
111
- - [x] MLLP source + destination (correct `0x0B 0x1C 0x0D` framing, ACK/NACK)
112
- - [x] File source + destination
113
- - [x] Pipeline: source parse/validate/filter/transform outbox per-dest workers,
114
- with retry/backoff, dead-letter, and replay
115
- - [x] localhost API (connections start/stop, message track/search/detail, replay, stats,
116
- live WebSocket feed) + `python -m messagefoundry serve`
117
- - [x] PySide6 console: connection dashboard, message browser, HL7 parse-tree viewer,
118
- delivery/audit trail, replay (`python -m messagefoundry.console`)
119
-
120
- **Phase 1 complete.**
121
-
122
- **Since Phase 1 now built**
123
- - [x] Staged pipeline (ingressroutedoutbound): at-least-once handoff, dead-letter, replay
124
- - [x] Authentication, RBAC, user-attributed audit log, at-rest body encryption (AES-256-GCM)
125
- - [x] **PostgreSQL** store backend (production, single-node)
126
- - [x] **Microsoft SQL Server** store backend (production, single-node)
127
- - [x] REST, SOAP, and Database destinations
128
- - [x] Database poll source
129
- - [x] Reference / lookup tables (`code_set`) for enrichment
130
- - [x] Alerting — logging sink + webhook/email notifier
131
- - [x] Connections-as-data (`connections.toml`) editable by hand or a VS Code GUI
132
- - [x] **Active-passive high availability** — self-fencing leadership lease, leader-gated graph, and a
133
- failover-load test harness (kill-the-primary-under-load), on **both** PostgreSQL and SQL Server
134
- - [x] **Native transport TLS** — in-process API TLS (HTTPS/WSS) and MLLP-over-TLS, with an off-loopback
135
- bind guard and a certificate-expiry monitor
136
- - [x] Published throughput + active-passive failover **baseline** ([docs/benchmarks/TUNING-BASELINE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/benchmarks/TUNING-BASELINE.md))
137
- - [x] **SMART Backend Services token provider** — OAuth2 `client_credentials` + signed-JWT
138
- `client_assertion` (RS384/ES384) authenticating the FHIR/REST outbound against real SMART-secured
139
- servers (Epic, Oracle Health); a `with_smart_backend()` composer over `FHIR()`/`Rest()` that mints,
140
- caches, and re-mints (on 401) a short-lived bearer, token endpoint gated by `[egress].allowed_http`
141
- ([ADR 0024](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0024-smart-backend-services-token-provider.md))
142
- - [x] **base64 binary-carriage codec** — an `mfb64:v1:` marker carries arbitrary NUL-safe **bytes** over
143
- the str/TEXT ingress + store (`RawMessage.from_bytes()`/`.raw_bytes`/`.binary()`/`.is_binary`), plus
144
- HL7 OBX-5 ED (Encapsulated Data) embedding helpers ([ADR 0028](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0028-base64-binary-carriage-codec.md))
145
- - [x] **DICOM codec + C-STORE SCP** (Phase 1) — a pure codec (routing peek, headers/Structured Report,
146
- code-first SR→HL7 mapping helpers; **headers + SR only, no pixel data**) on `content_type=dicom`
147
- payload-agnostic ingress, plus an inbound C-STORE SCP listener (`DICOM()`) ([ADR 0025](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0025-dicom-codec-store-connectors.md))
148
- - [x] **Anonymizer / de-identification** — builds PHI-free test datasets from real traffic with
149
- deterministic secret-per-dataset pseudonymization, field-anchored site-code scrub, and fail-closed
150
- emission (never an un-scrubbed body), via a `tee anonymize-captures` subcommand and test-harness
151
- hooks ([ADR 0030](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0030-anonymization-test-harness-tee.md))
152
-
153
- **Later** — higher-throughput delivery (a pooled/persistent MLLP connector); a read-only **component
154
- SDK** (fork-to-customize); DICOM Phase 2 (C-STORE SCU + C-ECHO + DICOMweb STOW-RS, designed); MFA and
155
- off-box log shipping. See [docs/EARLY-ADOPTER-GUIDE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/EARLY-ADOPTER-GUIDE.md) §2 for the current
156
- built-vs-experimental map.
157
-
158
- Horizontal **active-active** scale-out (the multi-node cluster path) was **dropped on 2026-06-18 and
159
- its code removed** — it is not a planned milestone; single-leader **active-passive** HA (above) is the
160
- supported HA model.
105
+ ## Features
106
+
107
+ MessageFoundry ships a reliable, PHI-aware engine today: the Connection/Router/Handler graph
108
+ over a durable staged pipeline (at-least-once delivery, retries, dead-letter, replay), backed by
109
+ SQLite, PostgreSQL, or SQL Server. It speaks MLLP (plain and over TLS), file/SFTP, REST, SOAP,
110
+ FHIR, database, and DICOM (C-STORE SCP), parses HL7 v2 tolerantly (with opt-in strict validation)
111
+ and carries other formats payload-agnostically (JSON, XML/SOAP, X12, binary). Security is
112
+ first-class authentication, RBAC, a user-attributed audit log, at-rest body encryption, and
113
+ transport TLS and it runs single-node or in active-passive high availability.
114
+
115
+ **See the full, up-to-date feature breakdown built vs. planned at
116
+ [messagefoundry.org/features-table.html](https://messagefoundry.org/features-table.html).**
117
+
118
+ ## Documentation
119
+
120
+ Full documentation lives on **[messagefoundry.org](https://messagefoundry.org/)**:
121
+
122
+ - **[Mental map](https://messagefoundry.org/assets/docs/MessageFoundry-Mental-Model.pdf)**a one-page
123
+ picture of how the pieces fit: Connections RouterHandlers Connections, with the headless
124
+ engine and the console/IDE that drive it.
125
+ - **[Install Guide](https://messagefoundry.org/assets/docs/MessageFoundry-Install-Guide.pdf)** install,
126
+ configure, secure, and roll out to production.
127
+ - **[User Guide](https://messagefoundry.org/assets/docs/MessageFoundry-User-Guide.pdf)** author and
128
+ operate interfaces day to day.
129
+
130
+ **Get started:** [Quickstart](https://messagefoundry.org/getting-started.html) ·
131
+ [Guides](https://messagefoundry.org/guides/) ·
132
+ [Documents](https://messagefoundry.org/documents.html)
161
133
 
162
134
  ## Installing & rolling out
163
135
 
@@ -167,21 +139,23 @@ supported production artifact, with no source checkout required. Install it as a
167
139
  dependency**, then scaffold your own config repo ([ADR 0017](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0017-consumer-deployment-model.md)):
168
140
 
169
141
  ```bash
170
- pip install "messagefoundry==0.2.1" # pin the exact engine version (core runtime, SQLite store)
171
- messagefoundry init ./my-config-repo # scaffold a standalone config repo
142
+ pip install "messagefoundry==<version>" # pin the exact engine version (core runtime, SQLite store)
143
+ messagefoundry init ./my-config-repo # scaffold a standalone config repo
172
144
  cd ./my-config-repo
173
145
  messagefoundry serve --config config --env dev
174
146
  ```
175
147
 
176
- `0.2.1` is the current **Early Access** release on PyPI. Always **pin the exact version** so
177
- upgrades stay deliberate. Add the extras your deployment needs (each is opt-in and lazy-imported):
148
+ MessageFoundry is in **Early Access**. Always **pin the exact version** so upgrades stay
149
+ deliberate replace `<version>` with the current release shown at the top of the
150
+ [PyPI project page](https://pypi.org/project/messagefoundry/). Add the extras your deployment
151
+ needs (each is opt-in and lazy-imported):
178
152
 
179
153
  ```bash
180
- pip install "messagefoundry[postgres]==0.2.1" # PostgreSQL store backend (production server DB)
181
- pip install "messagefoundry[sqlserver]==0.2.1" # SQL Server store backend (+ OS-level ODBC Driver 18)
182
- pip install "messagefoundry[console]==0.2.1" # PySide6 admin console
183
- pip install "messagefoundry[sftp]==0.2.1" # SFTP transport for the REMOTEFILE connector
184
- pip install "messagefoundry[dicom]==0.2.1" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
154
+ pip install "messagefoundry[postgres]==<version>" # PostgreSQL store backend (production server DB)
155
+ pip install "messagefoundry[sqlserver]==<version>" # SQL Server store backend (+ OS-level ODBC Driver 18)
156
+ pip install "messagefoundry[console]==<version>" # PySide6 admin console
157
+ pip install "messagefoundry[sftp]==<version>" # SFTP transport for the REMOTEFILE connector
158
+ pip install "messagefoundry[dicom]==<version>" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
185
159
  ```
186
160
 
187
161
  > **Verify before you install (supply chain).** Every release is built by a GitHub Actions workflow,
@@ -193,7 +167,7 @@ pip install "messagefoundry[dicom]==0.2.1" # DICOM codec + C-STORE SCP (py
193
167
  >
194
168
  > *(Engine developers install from a checkout instead — see [Development](#development).)*
195
169
 
196
- Piloting MessageFoundry? The **[Early-Adopter Installation & Rollout Guide](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/EARLY-ADOPTER-GUIDE.md)**
170
+ Piloting MessageFoundry? The **[Install Guide](https://messagefoundry.org/assets/docs/MessageFoundry-Install-Guide.pdf)**
197
171
  takes you from first install through a staged, go/no-go-gated path to full production
198
172
  (Lab → Shadow/Parallel → Limited → Full). It leads with an honest built-vs-experimental
199
173
  maturity map and covers prerequisites, install, security/PHI hardening, reliability
@@ -49,62 +49,34 @@ renders on GitHub and in the VS Code preview). The prose source of truth is
49
49
  and **transport TLS** (HTTPS/WSS for the API plus MLLP-over-TLS) are **built**; MFA and off-box log
50
50
  shipping remain on the roadmap. See [docs/PHI.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/PHI.md) for the full data-protection map.
51
51
 
52
- ## Roadmap
53
-
54
- **Phase 1 minimum reliable engine**
55
- - [x] Connection/Router/Handler model + config-module loader
56
- - [x] Durable message store / queue (SQLite WAL, outbox pattern)
57
- - [x] Parse / validate (tolerant peek + opt-in strict validation)
58
- - [x] MLLP source + destination (correct `0x0B 0x1C 0x0D` framing, ACK/NACK)
59
- - [x] File source + destination
60
- - [x] Pipeline: source parse/validate/filter/transform outbox per-dest workers,
61
- with retry/backoff, dead-letter, and replay
62
- - [x] localhost API (connections start/stop, message track/search/detail, replay, stats,
63
- live WebSocket feed) + `python -m messagefoundry serve`
64
- - [x] PySide6 console: connection dashboard, message browser, HL7 parse-tree viewer,
65
- delivery/audit trail, replay (`python -m messagefoundry.console`)
66
-
67
- **Phase 1 complete.**
68
-
69
- **Since Phase 1 now built**
70
- - [x] Staged pipeline (ingressroutedoutbound): at-least-once handoff, dead-letter, replay
71
- - [x] Authentication, RBAC, user-attributed audit log, at-rest body encryption (AES-256-GCM)
72
- - [x] **PostgreSQL** store backend (production, single-node)
73
- - [x] **Microsoft SQL Server** store backend (production, single-node)
74
- - [x] REST, SOAP, and Database destinations
75
- - [x] Database poll source
76
- - [x] Reference / lookup tables (`code_set`) for enrichment
77
- - [x] Alerting — logging sink + webhook/email notifier
78
- - [x] Connections-as-data (`connections.toml`) editable by hand or a VS Code GUI
79
- - [x] **Active-passive high availability** — self-fencing leadership lease, leader-gated graph, and a
80
- failover-load test harness (kill-the-primary-under-load), on **both** PostgreSQL and SQL Server
81
- - [x] **Native transport TLS** — in-process API TLS (HTTPS/WSS) and MLLP-over-TLS, with an off-loopback
82
- bind guard and a certificate-expiry monitor
83
- - [x] Published throughput + active-passive failover **baseline** ([docs/benchmarks/TUNING-BASELINE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/benchmarks/TUNING-BASELINE.md))
84
- - [x] **SMART Backend Services token provider** — OAuth2 `client_credentials` + signed-JWT
85
- `client_assertion` (RS384/ES384) authenticating the FHIR/REST outbound against real SMART-secured
86
- servers (Epic, Oracle Health); a `with_smart_backend()` composer over `FHIR()`/`Rest()` that mints,
87
- caches, and re-mints (on 401) a short-lived bearer, token endpoint gated by `[egress].allowed_http`
88
- ([ADR 0024](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0024-smart-backend-services-token-provider.md))
89
- - [x] **base64 binary-carriage codec** — an `mfb64:v1:` marker carries arbitrary NUL-safe **bytes** over
90
- the str/TEXT ingress + store (`RawMessage.from_bytes()`/`.raw_bytes`/`.binary()`/`.is_binary`), plus
91
- HL7 OBX-5 ED (Encapsulated Data) embedding helpers ([ADR 0028](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0028-base64-binary-carriage-codec.md))
92
- - [x] **DICOM codec + C-STORE SCP** (Phase 1) — a pure codec (routing peek, headers/Structured Report,
93
- code-first SR→HL7 mapping helpers; **headers + SR only, no pixel data**) on `content_type=dicom`
94
- payload-agnostic ingress, plus an inbound C-STORE SCP listener (`DICOM()`) ([ADR 0025](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0025-dicom-codec-store-connectors.md))
95
- - [x] **Anonymizer / de-identification** — builds PHI-free test datasets from real traffic with
96
- deterministic secret-per-dataset pseudonymization, field-anchored site-code scrub, and fail-closed
97
- emission (never an un-scrubbed body), via a `tee anonymize-captures` subcommand and test-harness
98
- hooks ([ADR 0030](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0030-anonymization-test-harness-tee.md))
99
-
100
- **Later** — higher-throughput delivery (a pooled/persistent MLLP connector); a read-only **component
101
- SDK** (fork-to-customize); DICOM Phase 2 (C-STORE SCU + C-ECHO + DICOMweb STOW-RS, designed); MFA and
102
- off-box log shipping. See [docs/EARLY-ADOPTER-GUIDE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/EARLY-ADOPTER-GUIDE.md) §2 for the current
103
- built-vs-experimental map.
104
-
105
- Horizontal **active-active** scale-out (the multi-node cluster path) was **dropped on 2026-06-18 and
106
- its code removed** — it is not a planned milestone; single-leader **active-passive** HA (above) is the
107
- supported HA model.
52
+ ## Features
53
+
54
+ MessageFoundry ships a reliable, PHI-aware engine today: the Connection/Router/Handler graph
55
+ over a durable staged pipeline (at-least-once delivery, retries, dead-letter, replay), backed by
56
+ SQLite, PostgreSQL, or SQL Server. It speaks MLLP (plain and over TLS), file/SFTP, REST, SOAP,
57
+ FHIR, database, and DICOM (C-STORE SCP), parses HL7 v2 tolerantly (with opt-in strict validation)
58
+ and carries other formats payload-agnostically (JSON, XML/SOAP, X12, binary). Security is
59
+ first-class authentication, RBAC, a user-attributed audit log, at-rest body encryption, and
60
+ transport TLS and it runs single-node or in active-passive high availability.
61
+
62
+ **See the full, up-to-date feature breakdown built vs. planned at
63
+ [messagefoundry.org/features-table.html](https://messagefoundry.org/features-table.html).**
64
+
65
+ ## Documentation
66
+
67
+ Full documentation lives on **[messagefoundry.org](https://messagefoundry.org/)**:
68
+
69
+ - **[Mental map](https://messagefoundry.org/assets/docs/MessageFoundry-Mental-Model.pdf)**a one-page
70
+ picture of how the pieces fit: Connections RouterHandlers Connections, with the headless
71
+ engine and the console/IDE that drive it.
72
+ - **[Install Guide](https://messagefoundry.org/assets/docs/MessageFoundry-Install-Guide.pdf)** install,
73
+ configure, secure, and roll out to production.
74
+ - **[User Guide](https://messagefoundry.org/assets/docs/MessageFoundry-User-Guide.pdf)** author and
75
+ operate interfaces day to day.
76
+
77
+ **Get started:** [Quickstart](https://messagefoundry.org/getting-started.html) ·
78
+ [Guides](https://messagefoundry.org/guides/) ·
79
+ [Documents](https://messagefoundry.org/documents.html)
108
80
 
109
81
  ## Installing & rolling out
110
82
 
@@ -114,21 +86,23 @@ supported production artifact, with no source checkout required. Install it as a
114
86
  dependency**, then scaffold your own config repo ([ADR 0017](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0017-consumer-deployment-model.md)):
115
87
 
116
88
  ```bash
117
- pip install "messagefoundry==0.2.1" # pin the exact engine version (core runtime, SQLite store)
118
- messagefoundry init ./my-config-repo # scaffold a standalone config repo
89
+ pip install "messagefoundry==<version>" # pin the exact engine version (core runtime, SQLite store)
90
+ messagefoundry init ./my-config-repo # scaffold a standalone config repo
119
91
  cd ./my-config-repo
120
92
  messagefoundry serve --config config --env dev
121
93
  ```
122
94
 
123
- `0.2.1` is the current **Early Access** release on PyPI. Always **pin the exact version** so
124
- upgrades stay deliberate. Add the extras your deployment needs (each is opt-in and lazy-imported):
95
+ MessageFoundry is in **Early Access**. Always **pin the exact version** so upgrades stay
96
+ deliberate replace `<version>` with the current release shown at the top of the
97
+ [PyPI project page](https://pypi.org/project/messagefoundry/). Add the extras your deployment
98
+ needs (each is opt-in and lazy-imported):
125
99
 
126
100
  ```bash
127
- pip install "messagefoundry[postgres]==0.2.1" # PostgreSQL store backend (production server DB)
128
- pip install "messagefoundry[sqlserver]==0.2.1" # SQL Server store backend (+ OS-level ODBC Driver 18)
129
- pip install "messagefoundry[console]==0.2.1" # PySide6 admin console
130
- pip install "messagefoundry[sftp]==0.2.1" # SFTP transport for the REMOTEFILE connector
131
- pip install "messagefoundry[dicom]==0.2.1" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
101
+ pip install "messagefoundry[postgres]==<version>" # PostgreSQL store backend (production server DB)
102
+ pip install "messagefoundry[sqlserver]==<version>" # SQL Server store backend (+ OS-level ODBC Driver 18)
103
+ pip install "messagefoundry[console]==<version>" # PySide6 admin console
104
+ pip install "messagefoundry[sftp]==<version>" # SFTP transport for the REMOTEFILE connector
105
+ pip install "messagefoundry[dicom]==<version>" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
132
106
  ```
133
107
 
134
108
  > **Verify before you install (supply chain).** Every release is built by a GitHub Actions workflow,
@@ -140,7 +114,7 @@ pip install "messagefoundry[dicom]==0.2.1" # DICOM codec + C-STORE SCP (py
140
114
  >
141
115
  > *(Engine developers install from a checkout instead — see [Development](#development).)*
142
116
 
143
- Piloting MessageFoundry? The **[Early-Adopter Installation & Rollout Guide](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/EARLY-ADOPTER-GUIDE.md)**
117
+ Piloting MessageFoundry? The **[Install Guide](https://messagefoundry.org/assets/docs/MessageFoundry-Install-Guide.pdf)**
144
118
  takes you from first install through a staged, go/no-go-gated path to full production
145
119
  (Lab → Shadow/Parallel → Limited → Full). It leads with an honest built-vs-experimental
146
120
  maturity map and covers prerequisites, install, security/PHI hardening, reliability
@@ -931,6 +931,10 @@ console-view scope.
931
931
 
932
932
  **Source:** Corepoint event-log gap analysis (2026-06-17); ADRs 0020 + 0021.
933
933
 
934
+ **See also #46** — the complementary *happy-path* connection-state lifecycle log (established / connecting /
935
+ retrying / lost). #16's retained scope is pre-message *failure* events + "Response Sent" ACK; #46 is the
936
+ routine Transport-event transitions. Build them together (one event log) if either is un-deferred.
937
+
934
938
  ---
935
939
 
936
940
  ## 17. CI: the `py3.11` test leg hangs (pytest deadlock) — OBSOLETE (py3.11/3.13 legs removed)
@@ -1255,6 +1259,14 @@ too. Fold the alert-rule view/test (ADR 0014 rules) into the Alerts page.
1255
1259
  **Why P2:** no new engine work — purely the console surface. Matters for operator parity, but the
1256
1260
  API/CLI already cover the underlying capability.
1257
1261
 
1262
+ > **#22c Event Log page (committed, from #46 — do NOT drop).** When the **#46** Corepoint-style event logging
1263
+ > lands engine-side ("logging like Corepoint", owner go 2026-06-25), it ships **engine capture first** with the
1264
+ > operator-facing **console Event Log page as a committed fast-follow, not optional.** A filterable PySide6 page
1265
+ > (by connection / direction / kind / time, Corepoint Transport/Diagnostic/Alert/Misc filter) over
1266
+ > `GET /events` + `GET /connections/{name}/events`, plus the Response-Sent ("ACK returned") view off
1267
+ > `GET /messages/{id}/responses?kind=ack_sent`. Replaces a `PlaceholderPage`, same pattern as #22a/#22b.
1268
+ > Tracked here so the GUI surface is built once the #46 engine API exists. See **#46**.
1269
+
1258
1270
  **Source:** Mirth brochure gap analysis (2026-06-18); FEATURE-MAP §10.
1259
1271
 
1260
1272
  ---
@@ -2127,6 +2139,76 @@ avoid. Build when a private-CA adopter is blocked.
2127
2139
 
2128
2140
  ---
2129
2141
 
2142
+ ## 46. Connection lifecycle event log — "established / lost / connecting / retrying" (Corepoint Transport-event parity)
2143
+
2144
+ > **✅ SCOPED FOR BUILD (owner go, 2026-06-25): "logging like Corepoint."** Build a unified, metadata-only
2145
+ > `connection_event` log capturing **inbound lifecycle** (established/closed) + the **ADR 0021 §7 failures**
2146
+ > (allowlist/capacity/oversize/peer-reset/framing) + **outbound lifecycle** (connection_lost/restored,
2147
+ > edge-triggered — no per-delivery spam), plus **Response Sent ACK/NAK** (ADR 0021 §§1-6, PHI, encrypted).
2148
+ > **ON by default** for the no-PHI connection events (master `[diagnostics].connection_events`). Engine
2149
+ > capture-first; the **console "Event Log" viewer is a committed fast-follow, NOT optional** — see
2150
+ > *Console deliverable* below. Raw protocol trace (ADR 0020) stays declined. Build increments + the two
2151
+ > confirm-items are in the 2026-06-25 plan.
2152
+ >
2153
+ > **Console deliverable (do NOT drop).** The point of "like Corepoint" is the *operator-facing* event log, so
2154
+ > the engine increments are not "done" until the **PySide6 console Event Log page** ships: a filterable view
2155
+ > (by connection / direction / kind / time) over `GET /events` + `GET /connections/{name}/events`, with the
2156
+ > Corepoint-style Transport / Diagnostic / Alert / Misc filter, plus the Response-Sent ("ACK returned") view
2157
+ > off `GET /messages/{id}/responses?kind=ack_sent`. This rides the **#22** console-page workstream (its natural
2158
+ > home) — tracked there too so it can't fall through the gap between the engine work and the GUI work.
2159
+
2160
+ **Type:** feature — operational/diagnostic observability. Closely related to **#16** (Corepoint event-log
2161
+ parity) — see *Relationship* below; this is the broader, happy-path slice #16's narrowed scope does **not**
2162
+ cover.
2163
+
2164
+ **What:** MessageFoundry's technical log does **not** emit the routine per-connection lifecycle play-by-play
2165
+ that Corepoint/Mirth surface under their **Transport** event filter — "connection established", "connection
2166
+ lost", "trying to connect", "reconnecting". Today the connection layer is silent on the happy path and only
2167
+ records the *exceptional* edges:
2168
+ - **Inbound (MLLP/TCP listeners):** a successful client accept is **not logged** — only refusals
2169
+ (`source_ip_allowlist`), at-capacity (silent), frame-over-cap, and unexpected per-connection errors are
2170
+ ([`transports/mllp.py`](../messagefoundry/transports/mllp.py) `_serve_client`,
2171
+ [`transports/tcp.py`](../messagefoundry/transports/tcp.py)). When a peer connects and sends normally, the
2172
+ **message** is what's counted/dispositioned in the store — there is no "accepted connection from <peer>" event.
2173
+ - **Outbound (delivery):** [`MLLPDestination`](../messagefoundry/transports/mllp.py) opens a **fresh connection
2174
+ per delivery** (connect → send → ACK → close), so there is no persistent connection to "lose" or
2175
+ "reconnect". A connect/IO failure becomes a `DeliveryError` → retry-with-backoff, and **each failed attempt
2176
+ is not written to the technical log** — the detail goes to the store row's `last_error`, surfaced to
2177
+ operators only via the `AlertSink` `queue_buildup` when a lane backs up
2178
+ ([`pipeline/wiring_runner.py`](../messagefoundry/pipeline/wiring_runner.py) delivery loop, the
2179
+ `except DeliveryError` arm). So there is no "trying to connect… refused… retrying" stream.
2180
+
2181
+ What the technical log *does* carry at connection level: engine/wiring lifecycle (`wiring started: N inbound,
2182
+ M outbound`, `wiring stopped/reloaded`), connection-failed-to-bind (isolated, ADR 0031), worker
2183
+ crashed/respawned, STOP-policy halts, and egress/connect allowlist denials.
2184
+
2185
+ **Proposed shape (when triggered):** a lightweight **structured connection *event* log — metadata only, no raw
2186
+ bytes / no PHI** (peer, direction, connection name, transition, timestamp, reason) recording the lifecycle
2187
+ transitions: inbound accept/close, outbound connect-attempt/connected/failed/retry-scheduled, and lane
2188
+ stop/resume. Reuse the existing `AlertSink` seam + the planned lightweight connection-error event log from
2189
+ #16's narrowed ADR 0020 scope rather than a second mechanism; emit-points are connector lifecycle hooks in
2190
+ `transports/` (accept/close on the listeners; connect/send/close on the outbound) plus the delivery-worker
2191
+ retry transitions in `wiring_runner.py`. Keep it **off-by-default / metadata-only** so it never reintroduces a
2192
+ raw-PHI-at-rest tier (the exact reason #16 dropped ADR 0020's raw-frame capture).
2193
+
2194
+ **Relationship to #16:** #16's *retained* slice is **pre-message *failure* events that have no `message_id`**
2195
+ (bad framing, TLS-accept failure, peer reset, allowlist refuse) + ADR 0021's "Response Sent" ACK/NAK capture.
2196
+ This item is the complementary **happy-path connection-state lifecycle** (established / connecting / retrying /
2197
+ lost) — the routine Transport-event transitions a successful connection goes through, which today are silent.
2198
+ Build the two together (one event log, two event classes) if either is un-deferred, to avoid a split design.
2199
+
2200
+ **Why deferred (on-trigger):** no customer pull yet — internal Corepoint-checklist origin, same posture as
2201
+ ADR 0020. Operator visibility for *failures* is already met via per-message disposition + `last_error` + the
2202
+ `queue_buildup`/`connection_stopped` alerts; this adds **diagnostic** visibility of normal connection churn,
2203
+ valuable mainly to operators migrating from an engine that shows it. Build when an adopter needs Corepoint-style
2204
+ connection-event visibility. **Trigger:** a pilot/adopter asks for a connection-state/transport event log.
2205
+
2206
+ **Source:** session question 2026-06-25 ("do our connection logs show connection established / lost / trying to
2207
+ connect?") — confirmed against `transports/mllp.py`, `transports/tcp.py`, and the `wiring_runner.py` delivery
2208
+ loop; relationship to the #16 Corepoint event-log gap analysis (2026-06-17) + ADRs 0020/0021.
2209
+
2210
+ ---
2211
+
2130
2212
  *Everything else from the 2026-06-10 full-codebase review (1 critical, 13 high, 33 medium, 31 low —
2131
2213
  78 findings) has been remediated; see the review report's §6 action order. The two items it still
2132
2214
  sourced — **#1 (SQL Server concurrency)** and **#2 (console off-thread)** — are now both **DONE**
@@ -0,0 +1,109 @@
1
+ # Code sets — translation tables (operator reference)
2
+
3
+ A **code set** is read-only reference data a code-first Router/Handler looks up by name — an Epic
4
+ diet code → a food-service value, a facility code → a downstream mnemonic. This is the operator
5
+ reference for **editing** code sets: the VS Code grid editor and the `messagefoundry codeset` CLI it
6
+ shells. For how a Handler *consumes* a code set (`code_set("name")`), the on-disk format, and the
7
+ purity/reload semantics, see [CONFIGURATION.md → "Code sets"](CONFIGURATION.md#code-sets--reference-lookup-tables-codesets).
8
+ The design record is [ADR 0033](adr/0033-gui-manageable-code-sets.md) (a sibling of the connection
9
+ editor, [ADR 0007](adr/0007-gui-manageable-connections-toml.md)).
10
+
11
+ ## Where the files live
12
+
13
+ Code sets live in `codesets/` **relative to the `--config` dir** — a config bundle carries its own
14
+ reference tables and they **reload with the graph** (`POST /config/reload`). The code-set **name** is
15
+ the file's stem (`codesets/epic_diets.csv` → `"epic_diets"`). A missing `codesets/` dir is fine (no
16
+ code sets); the directory is created on the first `upsert`.
17
+
18
+ - **CSV** (`<name>.csv`) — the editable, GUI-canonical format. A header row; the **first column is the
19
+ lookup key**. One other column → the value is that scalar (`str`); several other columns → the value
20
+ is a `dict` `{header: cell}`. A duplicate key is a **load error** (fail loud).
21
+ - **TOML** (`<name>.toml`) — hand-authored / legacy. Summarized by `list` and shown **read-only** in
22
+ the grid; the CLI never *writes* TOML. (A TOML-in-grid editor is a fast-follow.)
23
+
24
+ Both editors — a hand edit and a GUI save — write the same `codesets/<name>.csv`, so they are
25
+ interchangeable.
26
+
27
+ ## The grid editor (VS Code)
28
+
29
+ The extension opens a **grid** (rows × columns of strings; the first column is the lookup key) to
30
+ **create / edit / rename / delete** a translation table. It never writes a file itself: it shells the
31
+ `messagefoundry codeset` CLI, which owns all validation and the atomic write. A CLI error comes back
32
+ inline and the grid stays open (file unchanged) so you can fix it. When the opened set is a `.toml`
33
+ file the grid is **read-only** (Save disabled).
34
+
35
+ ## The `messagefoundry codeset` CLI
36
+
37
+ The CLI is **offline** (no engine start, no egress check — a code set is standalone data) and
38
+ validates against the **same loader** that runs at startup. Under `--json` it prints a single-line
39
+ JSON result on success, or `{"error": "<message>"}` (exit 1) on failure, so the IDE can surface the
40
+ loader's own wording inline.
41
+
42
+ | Command | What it does |
43
+ |---|---|
44
+ | `messagefoundry codeset list --config DIR` | Summarize every set under `codesets/` (`.csv` **and** `.toml`), sorted by name. |
45
+ | `messagefoundry codeset show --config DIR --name N` | The grid for set `N` (headers + rows); `format:"toml"` ⇒ read-only. |
46
+ | `messagefoundry codeset upsert --config DIR [--data JSON]` | Validate → write `codesets/N.csv` atomically (temp + replace, owner-only perms) → **re-load the written file as the final check**; a bad save rolls back. DETAIL JSON comes from `--data` or stdin. |
47
+ | `messagefoundry codeset rename --config DIR --name N --to M` | Atomic `os.replace` of `codesets/N.<ext>` → `codesets/M.<ext>`; rejects a stem collision. |
48
+ | `messagefoundry codeset remove --config DIR --name N` | Delete `codesets/N.csv` (else `.toml`). |
49
+
50
+ Add `--json` to any command for machine-readable output.
51
+
52
+ ### DETAIL shape (for `upsert` / returned by `show`)
53
+
54
+ ```json
55
+ {
56
+ "name": "epic_diets",
57
+ "format": "csv",
58
+ "columns": ["code", "value"],
59
+ "rows": [["A", "Apple"], ["B", "Banana"]]
60
+ }
61
+ ```
62
+
63
+ `rows` is an **array of arrays** (`string[][]`), each row positionally aligned to `columns`; the
64
+ first column is the key. One value column ⇒ a scalar value, two or more ⇒ a `{header: cell}` dict —
65
+ exactly the loader's rule.
66
+
67
+ ### The operator-supplied name is untrusted
68
+
69
+ `upsert`'s `name`, `rename`'s `--to`, **and** the `--name` on `show`/`remove` are all treated as
70
+ **untrusted data** (CLAUDE.md §5/§8). The CLI rejects a name that contains a path separator, `..`, an
71
+ absolute / drive-prefixed path, or an embedded `.csv`/`.toml` extension, and applies a final
72
+ `resolve()` check that the target stays inside `codesets/` — so a name can never read or write a file
73
+ outside the code-sets directory.
74
+
75
+ ### Validation rules (mirror the loader exactly)
76
+
77
+ A bad `upsert` is rejected **before** any file is touched: a non-empty key column plus at least one
78
+ value column, unique non-empty headers, all-string cells, no row longer than `columns`, a fully-blank
79
+ row dropped while a blank-key row that carries data is rejected (fail loud — never silently dropped),
80
+ and no duplicate key. A stem that collides with an existing
81
+ `.toml` is rejected (the same ambiguity the loader fails loud on). After the write, the file is
82
+ **re-loaded** as the final authority; any failure rolls the prior content back (or unlinks a
83
+ brand-new file), so a bad edit never lands.
84
+
85
+ ## Promote to apply — and the rename/remove caveat
86
+
87
+ Editing a `codesets/` file changes nothing live; the running graph adopts the change only through the
88
+ **existing audited `POST /config/reload`** (the IDE promote), exactly like a connection or handler
89
+ change.
90
+
91
+ **Renaming or removing a code set can break a handler reference.** A code set is referenced by **name**
92
+ from a Handler (`code_set("epic_diets")`), and that reference is resolved at the loader/runner — not by
93
+ `messagefoundry codeset`. So after a rename/remove, a `code_set("old_name")` call raises at run time
94
+ (that message's `ERROR` disposition). A plain `validate` only confirms each *file* parses, so it
95
+ **won't** catch a now-dangling reference.
96
+
97
+ > **After a rename or remove, run `messagefoundry check` before promoting.** Its dry-run actually
98
+ > executes the transforms, so it triggers the lookup and surfaces a broken `code_set(...)` reference at
99
+ > the gate rather than at the first message in production. The editor deliberately does **not** scan
100
+ > handler source for references (that would couple a data tool to code parsing and still miss a
101
+ > call-time-computed name) — the `messagefoundry check` dry-run is the safety net.
102
+
103
+ ## Out of scope
104
+
105
+ **Reference sets** ([ADR 0006](adr/0006-external-data-lookups.md)) and **`db_lookup`**
106
+ ([ADR 0010](adr/0010-handler-callable-db-lookup.md)) are **not** editable here: their data is
107
+ externally owned (synced on a cadence, or a live database read), so editing it in this grid would be
108
+ overwritten by the next sync/query and is therefore meaningless. This editor governs only the
109
+ bundle-shipped, operator-owned code sets.
@@ -188,6 +188,34 @@ system value, a facility code → a downstream mnemonic. Rather than a hand-main
188
188
  crash-re-run can make the re-run derive a different output. That's acceptable for reference data (a
189
189
  code set is deliberately operator-editable, and a reload is an explicit, audited act), but it is the
190
190
  one way a transform's re-run can legitimately differ — note it where you document the transform.
191
+ - **Editing — by hand or from the IDE.** A code set is a plain `codesets/<name>.csv` you can edit in any
192
+ editor, **and** a GUI-manageable artifact ([ADR 0033](adr/0033-gui-manageable-code-sets.md)). The VS
193
+ Code extension opens a **grid editor** (rows × columns of strings — the first column is the lookup
194
+ key) to **create / edit / rename / delete** a translation table; it shells a new
195
+ **`messagefoundry codeset`** CLI that owns validation and the atomic write. Both editors write the
196
+ same file (CSV-first), so a hand edit and a GUI save are interchangeable — mirroring the connections
197
+ editor ([ADR 0007](adr/0007-gui-manageable-connections-toml.md)).
198
+ - `messagefoundry codeset list --config DIR` — summarize every set under `codesets/` (`.csv` **and**
199
+ `.toml`; TOML sets are summarized and shown **read-only** in the grid — TOML-in-grid editing is a
200
+ fast-follow).
201
+ - `messagefoundry codeset show --config DIR --name N` — the grid (headers + rows).
202
+ - `messagefoundry codeset upsert --config DIR --data '{…}'` — validate → write `codesets/N.csv`
203
+ atomically (temp + replace, owner-only perms) → **re-load the written file as the final check**;
204
+ a bad save rolls back, so the CLI never leaves an unloadable table.
205
+ - `messagefoundry codeset rename --config DIR --name N --to M` / `… remove --config DIR --name N`.
206
+
207
+ The CLI is **offline** (no engine start, no egress check — a code set is standalone data); it validates
208
+ against the **same loader** that runs at startup, and the operator-supplied **name is treated as
209
+ untrusted data** (rejecting path separators, `..`, absolute/drive paths, and an embedded extension, so
210
+ a name can't escape `codesets/`). Apply a change with the existing audited promote/reload below.
211
+ - **Promote to apply (rename/remove caveat).** Editing a `codesets/` file changes nothing live; the
212
+ running graph adopts the change only through **`POST /config/reload`** (the IDE promote), exactly like
213
+ a connection or handler change. **Renaming or removing a code set can break a handler reference** — a
214
+ `code_set("old_name")` call then raises at run time (that message's `ERROR` disposition). A plain
215
+ `validate` only confirms each file parses, so it **won't** catch a now-dangling reference; **run
216
+ `messagefoundry check` after a rename/remove**, whose dry-run executes the transforms and surfaces the
217
+ broken `code_set(...)` lookup before you promote. See [docs/CODESETS.md](CODESETS.md) for the full grid
218
+ editor + CLI reference.
191
219
 
192
220
  ### Transform state — cross-message correlation ([ADR 0005](adr/0005-transform-accessible-state.md))
193
221
 
@@ -200,6 +200,16 @@ or leave empty for no restriction.
200
200
  > scoped to one listener; the same off-loopback risk applies), and **`source_ip_allowlist`** restricts
201
201
  > which peers that listener accepts. See [docs/CONFIGURATION.md](CONFIGURATION.md).
202
202
 
203
+ > **Port-conflict detection.** Two inbound listeners that bind the **same port on overlapping
204
+ > interfaces** are caught **statically** — at `messagefoundry check` / dry-run and at engine
205
+ > start/reload — naming **both** connections, instead of aborting at the bare OS bind. The check is
206
+ > **interface-aware**: two listeners on the same port but **different** explicit `bind_address`es (a
207
+ > multi-NIC host) don't conflict, while a `0.0.0.0` (all-interfaces) bind conflicts with any specific
208
+ > interface on that port. `env()`-resolved ports and the engine's own **API listener port** (`[api].port`)
209
+ > are included in the start/reload pass. At runtime, a port already held by **another process** (a
210
+ > second instance, an OS service) is reported as a clear, named conflict and the affected inbound is
211
+ > **isolated** (the engine still comes up; see [ADR 0031](adr/0031-startup-connection-fault-isolation.md)).
212
+
203
213
  #### Inspecting & testing a connection (API)
204
214
 
205
215
  Two read/diagnostic endpoints back the console's connection view (auth + per-channel RBAC apply — see