messagefoundry 0.2.8__tar.gz → 0.2.10__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 (841) hide show
  1. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/ci.yml +35 -7
  2. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/CHANGELOG.md +118 -1
  3. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/CLAUDE.md +20 -6
  4. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/PKG-INFO +7 -1
  5. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/BACKLOG.md +160 -76
  6. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CONFIGURATION.md +59 -2
  7. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CONNECTIONS.md +130 -1
  8. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0017-consumer-deployment-model.md +39 -0
  9. messagefoundry-0.2.10/docs/adr/0023-inbound-http-listener.md +326 -0
  10. messagefoundry-0.2.10/docs/adr/0027-per-connection-retention.md +208 -0
  11. messagefoundry-0.2.10/docs/adr/0029-email-smtp-destination.md +267 -0
  12. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0041-load-path-attestation-and-change-attribution.md +36 -7
  13. messagefoundry-0.2.10/docs/adr/0042-embedded-document-pruning.md +177 -0
  14. messagefoundry-0.2.10/docs/adr/0043-fhir-read-lookup.md +303 -0
  15. messagefoundry-0.2.10/docs/adr/0044-operator-alert-state.md +262 -0
  16. messagefoundry-0.2.10/docs/adr/0045-custom-rbac-roles.md +266 -0
  17. messagefoundry-0.2.10/docs/adr/0046-message-content-search.md +251 -0
  18. messagefoundry-0.2.10/docs/adr/0048-third-tier-disaster-recovery-standby.md +216 -0
  19. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/README.md +10 -4
  20. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/TUNING-BASELINE.md +43 -0
  21. messagefoundry-0.2.10/docs/releases/MULTISESSION-PLAN-4.md +167 -0
  22. messagefoundry-0.2.10/docs/releases/MULTISESSION-PLAN-5.md +453 -0
  23. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-L2-PHASE0-CHANGES.md +1 -0
  24. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/__init__.py +26 -2
  25. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/__main__.py +73 -0
  26. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/app.py +446 -27
  27. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/auth_models.py +19 -0
  28. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/auth_routes.py +108 -7
  29. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/models.py +72 -1
  30. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/identity.py +10 -2
  31. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/permissions.py +86 -0
  32. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/service.py +155 -1
  33. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/connections_file.py +27 -1
  34. messagefoundry-0.2.10/messagefoundry/config/fhir_lookup.py +132 -0
  35. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/models.py +25 -2
  36. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/settings.py +106 -4
  37. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/wiring.py +310 -10
  38. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/alerts_page.py +146 -19
  39. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/client.py +85 -0
  40. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/shell.py +91 -7
  41. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/widgets.py +67 -17
  42. messagefoundry-0.2.10/messagefoundry/integrity.py +351 -0
  43. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/__init__.py +42 -0
  44. messagefoundry-0.2.10/messagefoundry/parsing/binary.py +312 -0
  45. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/message.py +62 -0
  46. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/__init__.py +18 -2
  47. messagefoundry-0.2.10/messagefoundry/parsing/x12/_deps.py +43 -0
  48. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/errors.py +12 -1
  49. messagefoundry-0.2.10/messagefoundry/parsing/x12/validate.py +217 -0
  50. messagefoundry-0.2.10/messagefoundry/parsing/xml/__init__.py +50 -0
  51. messagefoundry-0.2.10/messagefoundry/parsing/xml/_deps.py +62 -0
  52. messagefoundry-0.2.10/messagefoundry/parsing/xml/errors.py +52 -0
  53. messagefoundry-0.2.10/messagefoundry/parsing/xml/harden.py +73 -0
  54. messagefoundry-0.2.10/messagefoundry/parsing/xml/message.py +154 -0
  55. messagefoundry-0.2.10/messagefoundry/parsing/xml/schema.py +69 -0
  56. messagefoundry-0.2.10/messagefoundry/parsing/xml/signature.py +68 -0
  57. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/alert_sinks.py +138 -4
  58. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/alerts.py +63 -0
  59. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/engine.py +44 -0
  60. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/retention.py +185 -10
  61. messagefoundry-0.2.10/messagefoundry/pipeline/update_check.py +225 -0
  62. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/wiring_runner.py +322 -20
  63. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/__init__.py +2 -0
  64. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/base.py +162 -3
  65. messagefoundry-0.2.10/messagefoundry/store/content_search.py +131 -0
  66. messagefoundry-0.2.10/messagefoundry/store/document_strip.py +51 -0
  67. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/postgres.py +411 -26
  68. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/sqlserver.py +387 -15
  69. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/store.py +528 -23
  70. messagefoundry-0.2.10/messagefoundry/support/__init__.py +21 -0
  71. messagefoundry-0.2.10/messagefoundry/support/bundle.py +231 -0
  72. messagefoundry-0.2.10/messagefoundry/support/redact.py +75 -0
  73. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/timezone.py +153 -2
  74. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/__init__.py +2 -0
  75. messagefoundry-0.2.10/messagefoundry/transports/email.py +196 -0
  76. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/fhir.py +240 -1
  77. messagefoundry-0.2.10/messagefoundry/transports/http_listener.py +473 -0
  78. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/mllp.py +17 -4
  79. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/smart.py +33 -13
  80. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/tcp.py +12 -3
  81. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/x12.py +12 -3
  82. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/pyproject.toml +14 -1
  83. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/requirements.lock +62 -1
  84. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/security/crypto_inventory_check.py +11 -0
  85. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_alert_rules.py +44 -0
  86. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_alert_sinks.py +27 -0
  87. messagefoundry-0.2.10/tests/test_alert_state.py +459 -0
  88. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_api.py +68 -0
  89. messagefoundry-0.2.10/tests/test_api_alerts.py +247 -0
  90. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_config_source_trust.py +10 -0
  91. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_event_emit.py +25 -8
  92. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_event_outbound.py +2 -0
  93. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connections_file.py +134 -0
  94. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_alerts.py +121 -8
  95. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_status.py +1 -1
  96. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_widgets.py +58 -1
  97. messagefoundry-0.2.10/tests/test_content_search.py +378 -0
  98. messagefoundry-0.2.10/tests/test_custom_roles.py +417 -0
  99. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_delivery_settings.py +38 -1
  100. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dependabot_automerge_guardrails.py +7 -0
  101. messagefoundry-0.2.10/tests/test_dual_control_reload.py +190 -0
  102. messagefoundry-0.2.10/tests/test_email_destination.py +313 -0
  103. messagefoundry-0.2.10/tests/test_embedded_document_pruning.py +367 -0
  104. messagefoundry-0.2.10/tests/test_fhir_lookup.py +423 -0
  105. messagefoundry-0.2.10/tests/test_inbound_http_source.py +424 -0
  106. messagefoundry-0.2.10/tests/test_message_timestamps.py +79 -0
  107. messagefoundry-0.2.10/tests/test_per_connection_retention.py +373 -0
  108. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_postgres_store.py +46 -0
  109. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_settings.py +38 -0
  110. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sqlserver_store.py +42 -0
  111. messagefoundry-0.2.10/tests/test_startup_attestation.py +254 -0
  112. messagefoundry-0.2.10/tests/test_support_bundle.py +169 -0
  113. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_timezone.py +139 -1
  114. messagefoundry-0.2.10/tests/test_update_check.py +199 -0
  115. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_wiring_engine.py +105 -0
  116. messagefoundry-0.2.10/tests/test_x12_validate.py +110 -0
  117. messagefoundry-0.2.10/tests/test_xml_message.py +169 -0
  118. messagefoundry-0.2.10/tests/test_xml_schema_signature.py +63 -0
  119. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/uv.lock +104 -1
  120. messagefoundry-0.2.8/messagefoundry/parsing/binary.py +0 -152
  121. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.claude/settings.json +0 -0
  122. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.dockerignore +0 -0
  123. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.gitattributes +0 -0
  124. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/CODEOWNERS +0 -0
  125. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  126. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  127. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  128. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  129. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/SECURITY.md +0 -0
  130. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/dependabot.yml +0 -0
  131. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/benchmark.yml +0 -0
  132. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/cla.yml +0 -0
  133. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/codeql.yml +0 -0
  134. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/dependabot-auto-merge.yml +0 -0
  135. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/dependabot-lock-resync.yml +0 -0
  136. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/freethread-smoke.yml +0 -0
  137. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/release-sync-check.yml +0 -0
  138. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/release.yml +0 -0
  139. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/scorecard.yml +0 -0
  140. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/security.yml +0 -0
  141. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/vuln-metrics.yml +0 -0
  142. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/zizmor.yml +0 -0
  143. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.gitignore +0 -0
  144. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.gitleaks.toml +0 -0
  145. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.mefor-hooks/pre-commit +0 -0
  146. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.pre-commit-config.yaml +0 -0
  147. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.semgrep/messagefoundry.yml +0 -0
  148. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/CLA.md +0 -0
  149. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/CODE_OF_CONDUCT.md +0 -0
  150. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/COMMERCIAL-LICENSE.md +0 -0
  151. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/CONTRIBUTING.md +0 -0
  152. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/GOVERNANCE.md +0 -0
  153. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/LICENSE +0 -0
  154. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/MAINTAINERS.md +0 -0
  155. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/NOTICE +0 -0
  156. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/README.md +0 -0
  157. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/Dockerfile +0 -0
  158. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/README.md +0 -0
  159. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/compose.yaml +0 -0
  160. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/k8s/secret.example.yaml +0 -0
  161. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/k8s/statefulset.yaml +0 -0
  162. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/locks/requirements-core.lock +0 -0
  163. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/locks/requirements-sqlserver.lock +0 -0
  164. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/secrets.env.example +0 -0
  165. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/smoke/Dockerfile +0 -0
  166. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/smoke/config/IB_Test_ADT.py +0 -0
  167. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/smoke/send_adt.py +0 -0
  168. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/ADOPTER-CI.md +0 -0
  169. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/AI.md +0 -0
  170. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/ARCHITECTURE.md +0 -0
  171. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CI-QUALITY.md +0 -0
  172. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CLUSTERING.md +0 -0
  173. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CODESETS.md +0 -0
  174. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CONTAINER-EXPOSURE-EVALUATION.md +0 -0
  175. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
  176. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
  177. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
  178. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/DEPLOY-SERVER-DB.md +0 -0
  179. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/DEPLOYMENT.md +0 -0
  180. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/DICOM.md +0 -0
  181. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/DUAL_LICENSING_PLAN.md +0 -0
  182. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
  183. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/FEATURE-MAP.md +0 -0
  184. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/HL7-VALIDATION.md +0 -0
  185. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/INSTALL-GUIDE.md +0 -0
  186. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/LOAD-TESTING.md +0 -0
  187. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/MENTAL-MODEL.md +0 -0
  188. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/MessageFoundry-Mental-Model.docx +0 -0
  189. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/PHI.md +0 -0
  190. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
  191. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/REMOTE-CONSOLE.md +0 -0
  192. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/SECURITY-REMEDIATION-LEDGER.md +0 -0
  193. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/SECURITY.md +0 -0
  194. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/SERVICE.md +0 -0
  195. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/SUPPORT-POLICY.md +0 -0
  196. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/SYSTEM-REQUIREMENTS.md +0 -0
  197. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/Secure_AI_Development_Standards.md +0 -0
  198. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/Secure_Development_Standards.md +0 -0
  199. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/TEE-RELAY.md +0 -0
  200. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/THROUGHPUT-IMPROVEMENTS.md +0 -0
  201. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/USER-GUIDE.md +0 -0
  202. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/WORKTREES.md +0 -0
  203. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0001-staged-pipeline-architecture.md +0 -0
  204. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
  205. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
  206. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
  207. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0005-transform-accessible-state.md +0 -0
  208. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0006-external-data-lookups.md +0 -0
  209. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
  210. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0008-cluster-observability-api.md +0 -0
  211. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0009-run-scoped-context-providers.md +0 -0
  212. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
  213. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0011-timer-scheduled-source.md +0 -0
  214. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0012-x12-edi-codec.md +0 -0
  215. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0013-increment-2-reingress-design.md +0 -0
  216. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0013-query-response-orchestration.md +0 -0
  217. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0014-alerting-rules-engine.md +0 -0
  218. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
  219. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
  220. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
  221. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
  222. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
  223. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
  224. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
  225. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
  226. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
  227. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0026-off-box-egress-update-check.md +0 -0
  228. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
  229. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
  230. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
  231. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0032-console-desktop-launch.md +0 -0
  232. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0033-gui-manageable-code-sets.md +0 -0
  233. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0034-static-analysis-triage-policy-accepted-risk-register.md +0 -0
  234. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0035-ide-extension-workspace-trust-and-scope.md +0 -0
  235. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0036-windows-config-source-trust.md +0 -0
  236. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0037-multi-process-sharding-l3.md +0 -0
  237. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0038-internal-pass-through-connector.md +0 -0
  238. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0039-database-tier-sharding-l5.md +0 -0
  239. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0040-free-threaded-engine-support.md +0 -0
  240. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/TEMPLATE.md +0 -0
  241. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-components.png +0 -0
  242. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-components.svg +0 -0
  243. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-config-graph.png +0 -0
  244. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-config-graph.svg +0 -0
  245. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-diagram.md +0 -0
  246. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-message-flow.png +0 -0
  247. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-message-flow.svg +0 -0
  248. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-topology.png +0 -0
  249. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-topology.svg +0 -0
  250. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
  251. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
  252. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
  253. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
  254. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
  255. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
  256. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/step-b-write-amplification.md +0 -0
  257. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/design/dbshard.md +0 -0
  258. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/design/freethread.md +0 -0
  259. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/design/multiproc.md +0 -0
  260. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/hl7-message-ordering-reference.md +0 -0
  261. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/message-ordering-design.md +0 -0
  262. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
  263. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
  264. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
  265. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
  266. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
  267. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/MULTISESSION-PLAN.md +0 -0
  268. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
  269. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
  270. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
  271. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/v0.1-PLAN.md +0 -0
  272. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
  273. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/research/cloud-deployment-research-2026-06.md +0 -0
  274. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/research/config-ux-review.md +0 -0
  275. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/research/non-hl7-transform-components.md +0 -0
  276. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
  277. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
  278. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ADVISORY-PROCESS.md +0 -0
  279. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
  280. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
  281. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
  282. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
  283. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-L3-STATUS.md +0 -0
  284. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
  285. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
  286. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
  287. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3.md +0 -0
  288. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
  289. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/DEPENDENCY-METRICS.md +0 -0
  290. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
  291. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/PHASE-8C-RBAC.md +0 -0
  292. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/PUBLISHING.md +0 -0
  293. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/RCA-TEMPLATE.md +0 -0
  294. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/RELEASE-GATE.md +0 -0
  295. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/REMEDIATION-PLAN.md +0 -0
  296. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/REVIEW-2026-06-07.md +0 -0
  297. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
  298. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
  299. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SECURITY-POSTURE.md +0 -0
  300. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
  301. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
  302. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
  303. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/THREAT-MODEL.md +0 -0
  304. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/testing/VERIFY.md +0 -0
  305. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
  306. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
  307. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
  308. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/environments/dev.toml +0 -0
  309. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/environments/prod.toml +0 -0
  310. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/README.md +0 -0
  311. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/__main__.py +0 -0
  312. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/__init__.py +0 -0
  313. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/__main__.py +0 -0
  314. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/matrix.py +0 -0
  315. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/probes.py +0 -0
  316. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/report.py +0 -0
  317. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/runner.py +0 -0
  318. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/compose.py +0 -0
  319. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/config/coverage.py +0 -0
  320. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/config/load/_shape.py +0 -0
  321. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/config/load/graph.py +0 -0
  322. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/config/passthrough/graph.py +0 -0
  323. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/config/store_once/graph.py +0 -0
  324. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/file_panel.py +0 -0
  325. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/file_transport.py +0 -0
  326. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/__init__.py +0 -0
  327. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/corpus.py +0 -0
  328. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/correlator.py +0 -0
  329. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/enginepoll.py +0 -0
  330. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/failover.py +0 -0
  331. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/failover_track.py +0 -0
  332. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/governor.py +0 -0
  333. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/ids.py +0 -0
  334. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/metrics.py +0 -0
  335. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profile.py +0 -0
  336. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/README.md +0 -0
  337. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/adt-fanout-stress.toml +0 -0
  338. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/closed-loop.toml +0 -0
  339. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/failover.toml +0 -0
  340. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/fanout-baseline.toml +0 -0
  341. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/malformed-load.toml +0 -0
  342. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/reference.toml +0 -0
  343. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/smoke-sqlserver.toml +0 -0
  344. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/smoke.toml +0 -0
  345. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/soak.toml +0 -0
  346. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/spike-burst.toml +0 -0
  347. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/sustained-overload.toml +0 -0
  348. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/writeamp.toml +0 -0
  349. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/report.py +0 -0
  350. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/runner.py +0 -0
  351. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/sender.py +0 -0
  352. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/sink.py +0 -0
  353. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/mllp.py +0 -0
  354. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/monitor.py +0 -0
  355. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/receive.py +0 -0
  356. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/__init__.py +0 -0
  357. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/__main__.py +0 -0
  358. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/capture.py +0 -0
  359. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/compare.py +0 -0
  360. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/normalize.py +0 -0
  361. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/report.py +0 -0
  362. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/scenarios.py +0 -0
  363. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/send.py +0 -0
  364. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/window.py +0 -0
  365. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/.gitignore +0 -0
  366. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/.vscodeignore +0 -0
  367. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/README.md +0 -0
  368. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/esbuild.js +0 -0
  369. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/media/hl7schema.json +0 -0
  370. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/media/icon-amber.svg +0 -0
  371. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/media/icon.png +0 -0
  372. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/media/icon.svg +0 -0
  373. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/package-lock.json +0 -0
  374. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/package.json +0 -0
  375. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/snippets/messagefoundry.code-snippets +0 -0
  376. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/aiPolicy.ts +0 -0
  377. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/alertEditor.ts +0 -0
  378. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/auth.ts +0 -0
  379. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/chat.ts +0 -0
  380. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/cli.ts +0 -0
  381. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/codeSetEditor.ts +0 -0
  382. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/codesetsTree.ts +0 -0
  383. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/completion.ts +0 -0
  384. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/connectionEditor.ts +0 -0
  385. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/editorToolbar.ts +0 -0
  386. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/engineClient.ts +0 -0
  387. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/engineTarget.ts +0 -0
  388. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/extension.ts +0 -0
  389. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/generate.ts +0 -0
  390. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/git.ts +0 -0
  391. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/graphTree.ts +0 -0
  392. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/home.ts +0 -0
  393. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/insertElement.ts +0 -0
  394. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/newRoute.ts +0 -0
  395. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/promote.ts +0 -0
  396. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/promoteTarget.ts +0 -0
  397. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/sourceControl.ts +0 -0
  398. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/runTest.ts +0 -0
  399. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/ai-policy.test.ts +0 -0
  400. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/chat.test.ts +0 -0
  401. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/editor-toolbar.test.ts +0 -0
  402. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/engine-target.test.ts +0 -0
  403. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/extension.test.ts +0 -0
  404. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/index.ts +0 -0
  405. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/insert-element.test.ts +0 -0
  406. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/promote-target.test.ts +0 -0
  407. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/pythonpath.test.ts +0 -0
  408. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/settings-scope.test.ts +0 -0
  409. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/testBench.ts +0 -0
  410. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/validate.ts +0 -0
  411. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/tsconfig.json +0 -0
  412. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/tsconfig.test.json +0 -0
  413. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/mefor.code-workspace +0 -0
  414. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/adr_analyze.py +0 -0
  415. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/__init__.py +0 -0
  416. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/_pools.py +0 -0
  417. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/hl7.py +0 -0
  418. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/keying.py +0 -0
  419. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/leak.py +0 -0
  420. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/rules.py +0 -0
  421. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/surrogates.py +0 -0
  422. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/__init__.py +0 -0
  423. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/approvals.py +0 -0
  424. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/field_authz.py +0 -0
  425. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/metrics.py +0 -0
  426. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/security.py +0 -0
  427. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/tls.py +0 -0
  428. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/__init__.py +0 -0
  429. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
  430. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/data/common_passwords.txt +0 -0
  431. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/ldap.py +0 -0
  432. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/notifications.py +0 -0
  433. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/passwords.py +0 -0
  434. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/policy.py +0 -0
  435. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/ratelimit.py +0 -0
  436. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/tokens.py +0 -0
  437. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/totp.py +0 -0
  438. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/checks.py +0 -0
  439. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/__init__.py +0 -0
  440. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/active_environment.py +0 -0
  441. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/ai_policy.py +0 -0
  442. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/alerts_edit.py +0 -0
  443. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/code_sets.py +0 -0
  444. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/codeset_edit.py +0 -0
  445. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/connections_edit.py +0 -0
  446. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/db_lookup.py +0 -0
  447. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/environments.py +0 -0
  448. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/fingerprint.py +0 -0
  449. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/ingest_time.py +0 -0
  450. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/reference.py +0 -0
  451. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/response.py +0 -0
  452. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/run_context.py +0 -0
  453. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/state.py +0 -0
  454. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/tls_policy.py +0 -0
  455. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/__init__.py +0 -0
  456. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/__main__.py +0 -0
  457. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/_async.py +0 -0
  458. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/change_password.py +0 -0
  459. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/connections.py +0 -0
  460. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/dead_letters_page.py +0 -0
  461. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/delegates.py +0 -0
  462. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/event_log_page.py +0 -0
  463. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/alerts.svg +0 -0
  464. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/connections.svg +0 -0
  465. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/dead-letters.svg +0 -0
  466. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/engine-status.svg +0 -0
  467. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/log-search.svg +0 -0
  468. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/logo-lockup.svg +0 -0
  469. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/users.svg +0 -0
  470. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/login.py +0 -0
  471. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/mfa.py +0 -0
  472. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/reauth.py +0 -0
  473. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/resources/README.md +0 -0
  474. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/resources/app.ico +0 -0
  475. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/resources/app.svg +0 -0
  476. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/search.py +0 -0
  477. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/service_control.py +0 -0
  478. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/sessions.py +0 -0
  479. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/shards.py +0 -0
  480. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/status.py +0 -0
  481. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/theme.py +0 -0
  482. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/users_page.py +0 -0
  483. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/README.md +0 -0
  484. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/__init__.py +0 -0
  485. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/_core.py +0 -0
  486. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/_hl7data.py +0 -0
  487. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/adt.py +0 -0
  488. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/all_types.py +0 -0
  489. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/bar.py +0 -0
  490. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/dft.py +0 -0
  491. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/documents.py +0 -0
  492. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/mdm.py +0 -0
  493. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/mfn.py +0 -0
  494. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/oml.py +0 -0
  495. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/orl.py +0 -0
  496. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/orm.py +0 -0
  497. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/oru.py +0 -0
  498. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/ras.py +0 -0
  499. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/rde.py +0 -0
  500. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/siu.py +0 -0
  501. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/vxu.py +0 -0
  502. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/hl7schema.py +0 -0
  503. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/last_resort.py +0 -0
  504. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/logging_setup.py +0 -0
  505. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/consistency.py +0 -0
  506. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/__init__.py +0 -0
  507. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/_deps.py +0 -0
  508. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/_util.py +0 -0
  509. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/dataset.py +0 -0
  510. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/errors.py +0 -0
  511. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
  512. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/peek.py +0 -0
  513. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/__init__.py +0 -0
  514. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/_deps.py +0 -0
  515. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/errors.py +0 -0
  516. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/peek.py +0 -0
  517. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/resource.py +0 -0
  518. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/groups.py +0 -0
  519. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/peek.py +0 -0
  520. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/split.py +0 -0
  521. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/summary.py +0 -0
  522. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/tree.py +0 -0
  523. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/validate.py +0 -0
  524. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/delimiters.py +0 -0
  525. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/interchange.py +0 -0
  526. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/message.py +0 -0
  527. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/peek.py +0 -0
  528. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/__init__.py +0 -0
  529. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/cert_expiry.py +0 -0
  530. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/cluster.py +0 -0
  531. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
  532. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/config_convergence.py +0 -0
  533. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/dryrun.py +0 -0
  534. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/leader_tasks.py +0 -0
  535. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/reference_sync.py +0 -0
  536. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/security_notify.py +0 -0
  537. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/sharding.py +0 -0
  538. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/state_convergence.py +0 -0
  539. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/supervisor.py +0 -0
  540. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/py.typed +0 -0
  541. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/redaction.py +0 -0
  542. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/scaffold.py +0 -0
  543. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/secrets_dpapi.py +0 -0
  544. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/audit_tee.py +0 -0
  545. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/crypto.py +0 -0
  546. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/keyprovider.py +0 -0
  547. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/base.py +0 -0
  548. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/database.py +0 -0
  549. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/dicom.py +0 -0
  550. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/dicomweb.py +0 -0
  551. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/file.py +0 -0
  552. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/framing.py +0 -0
  553. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/loopback.py +0 -0
  554. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/passthrough.py +0 -0
  555. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/remotefile.py +0 -0
  556. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/rest.py +0 -0
  557. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/signing.py +0 -0
  558. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/soap.py +0 -0
  559. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/timer.py +0 -0
  560. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/__init__.py +0 -0
  561. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/checks.py +0 -0
  562. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/model.py +0 -0
  563. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/report.py +0 -0
  564. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/runner.py +0 -0
  565. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/smoke.py +0 -0
  566. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/packaging/messagefoundry-harness/README.md +0 -0
  567. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/packaging/messagefoundry-harness/pyproject.toml +0 -0
  568. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_ACME_ADT.py +0 -0
  569. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_FHIR_INTAKE.py +0 -0
  570. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
  571. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_PARTNER_X12.py +0 -0
  572. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_RADIOLOGY_SR.py +0 -0
  573. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
  574. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/adt.py +0 -0
  575. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/codesets/event_labels.csv +0 -0
  576. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/codesets/facility_mnemonics.toml +0 -0
  577. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/connections.toml +0 -0
  578. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/consistency/validated_adt.py +0 -0
  579. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/dicom/generate_sr_sample.py +0 -0
  580. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/adt_a01.hl7 +0 -0
  581. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/adt_batch.hl7 +0 -0
  582. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
  583. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/README.md +0 -0
  584. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
  585. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
  586. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
  587. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
  588. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
  589. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
  590. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
  591. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/x12_270_eligibility.edi +0 -0
  592. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/results_relay/README.md +0 -0
  593. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/results_relay/codesets/test_codes.csv +0 -0
  594. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
  595. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/results_relay/messages/oru_results.hl7 +0 -0
  596. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/results_relay/results_relay.py +0 -0
  597. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/send_mllp.py +0 -0
  598. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/console/install-console-shortcut.ps1 +0 -0
  599. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/console/pack_ico.py +0 -0
  600. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
  601. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/dev/postgres.ps1 +0 -0
  602. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/dev/sqlserver-docker.ps1 +0 -0
  603. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/dev/sqlserver.ps1 +0 -0
  604. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
  605. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/publish/check_release_sync.py +0 -0
  606. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/publish/publish-denylist.txt +0 -0
  607. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/publish/publish.ps1 +0 -0
  608. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/publish/scan_forbidden.py +0 -0
  609. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/security/vuln_metrics.py +0 -0
  610. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/service/import-db-ca.ps1 +0 -0
  611. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/service/install-service.ps1 +0 -0
  612. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/service/uninstall-service.ps1 +0 -0
  613. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/trace_icon.py +0 -0
  614. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/worktree/new.ps1 +0 -0
  615. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/worktree/remove.ps1 +0 -0
  616. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/worktree/session-context.ps1 +0 -0
  617. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/worktree/spawn.ps1 +0 -0
  618. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/__init__.py +0 -0
  619. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/__main__.py +0 -0
  620. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/__init__.py +0 -0
  621. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/_hl7data.py +0 -0
  622. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/_pools.py +0 -0
  623. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/hl7.py +0 -0
  624. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/keying.py +0 -0
  625. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/leak.py +0 -0
  626. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/rules.py +0 -0
  627. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/surrogates.py +0 -0
  628. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/compare.py +0 -0
  629. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/correlate.py +0 -0
  630. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/hl7_fields.py +0 -0
  631. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/mefor_api.py +0 -0
  632. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/mllp.py +0 -0
  633. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/relay.py +0 -0
  634. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/report.py +0 -0
  635. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/store.py +0 -0
  636. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/_dicom_sample.py +0 -0
  637. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/_failover_load_support.py +0 -0
  638. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/_fhir_fixtures.py +0 -0
  639. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/conftest.py +0 -0
  640. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_acceptance_framework.py +0 -0
  641. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ack_capture_runner.py +0 -0
  642. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ack_sent_store.py +0 -0
  643. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_active_environment.py +0 -0
  644. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ad_group_scope.py +0 -0
  645. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_admin_new_ip.py +0 -0
  646. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_adr_analyze.py +0 -0
  647. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ai_policy.py +0 -0
  648. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_alerts_edit.py +0 -0
  649. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_alerts_rules_api.py +0 -0
  650. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_anon_core.py +0 -0
  651. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_anon_integration.py +0 -0
  652. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_anon_parity.py +0 -0
  653. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_api_auth.py +0 -0
  654. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_api_reload.py +0 -0
  655. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_api_tls.py +0 -0
  656. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_approvals.py +0 -0
  657. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_asvs_phase0.py +0 -0
  658. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_audit_integrity.py +0 -0
  659. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_audit_offbox_tee.py +0 -0
  660. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_core.py +0 -0
  661. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_entry_hardening.py +0 -0
  662. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_hardening.py +0 -0
  663. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_service.py +0 -0
  664. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_session_lifecycle.py +0 -0
  665. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_store.py +0 -0
  666. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_binary_carriage.py +0 -0
  667. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_bootstrap_admin_perms.py +0 -0
  668. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cert_expiry.py +0 -0
  669. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_channel_rbac.py +0 -0
  670. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_checks.py +0 -0
  671. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_checks_lint.py +0 -0
  672. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cli.py +0 -0
  673. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cluster.py +0 -0
  674. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cluster_failover_postgres.py +0 -0
  675. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cluster_failover_sqlserver.py +0 -0
  676. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cluster_graph_gating.py +0 -0
  677. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cluster_lease.py +0 -0
  678. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_code_sets.py +0 -0
  679. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_codeset_edit.py +0 -0
  680. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_config_fingerprint.py +0 -0
  681. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_api.py +0 -0
  682. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_event_api.py +0 -0
  683. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_event_scope.py +0 -0
  684. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_event_store.py +0 -0
  685. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_resilience.py +0 -0
  686. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connections_cli.py +0 -0
  687. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_consistency.py +0 -0
  688. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_auth.py +0 -0
  689. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_client.py +0 -0
  690. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_dead_letters.py +0 -0
  691. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_event_log.py +0 -0
  692. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_hardening.py +0 -0
  693. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_icon.py +0 -0
  694. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_password.py +0 -0
  695. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_sessions.py +0 -0
  696. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_shards.py +0 -0
  697. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_step_up.py +0 -0
  698. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_theme.py +0 -0
  699. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_users.py +0 -0
  700. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_database_connector_integration.py +0 -0
  701. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_database_transport.py +0 -0
  702. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_db_lookup.py +0 -0
  703. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_db_lookup_live_runner.py +0 -0
  704. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dependency_boundaries.py +0 -0
  705. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicom_codec.py +0 -0
  706. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicom_scp.py +0 -0
  707. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicom_scp_security.py +0 -0
  708. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicom_scu.py +0 -0
  709. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicom_wiring.py +0 -0
  710. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicomweb.py +0 -0
  711. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_docs_runbooks.py +0 -0
  712. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dryrun.py +0 -0
  713. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ed_documents.py +0 -0
  714. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ed_documents_e2e.py +0 -0
  715. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_egress_allowlist.py +0 -0
  716. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_enginepoll_aggregate.py +0 -0
  717. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_environments.py +0 -0
  718. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_fhir_parsing.py +0 -0
  719. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_fhir_resource.py +0 -0
  720. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_fhir_transport.py +0 -0
  721. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_field_authz.py +0 -0
  722. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_field_authz_metadata.py +0 -0
  723. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_fifo_ordering.py +0 -0
  724. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_generate_cli.py +0 -0
  725. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_generated_adt.py +0 -0
  726. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_generators_core.py +0 -0
  727. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_generators_types.py +0 -0
  728. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_groups.py +0 -0
  729. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness.py +0 -0
  730. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_compose.py +0 -0
  731. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_config.py +0 -0
  732. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_faults.py +0 -0
  733. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_file.py +0 -0
  734. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_monitor.py +0 -0
  735. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_scenarios.py +0 -0
  736. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_hl7_core_features.py +0 -0
  737. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_hl7schema.py +0 -0
  738. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_inbound_bind.py +0 -0
  739. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ingest_time.py +0 -0
  740. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_keyprovider.py +0 -0
  741. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_last_admin_guard.py +0 -0
  742. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_last_resort.py +0 -0
  743. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_leader_tasks.py +0 -0
  744. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_listener_tls_exposure.py +0 -0
  745. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_config.py +0 -0
  746. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_corpus.py +0 -0
  747. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_failover_postgres.py +0 -0
  748. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_failover_sqlserver.py +0 -0
  749. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_failover_unit.py +0 -0
  750. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_metrics.py +0 -0
  751. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_profile.py +0 -0
  752. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_report.py +0 -0
  753. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_runner.py +0 -0
  754. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_sender.py +0 -0
  755. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_sink.py +0 -0
  756. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_logging.py +0 -0
  757. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_message.py +0 -0
  758. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_message_split.py +0 -0
  759. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_metrics_exporter.py +0 -0
  760. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_mfa.py +0 -0
  761. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_mllp_encoding_override.py +0 -0
  762. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_mllp_tls.py +0 -0
  763. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_nonhl7_ingress_size_cap.py +0 -0
  764. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_operability_config.py +0 -0
  765. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_outbound_signing.py +0 -0
  766. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_outbound_simulate.py +0 -0
  767. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_packaging.py +0 -0
  768. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_parse_tree.py +0 -0
  769. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_parsing.py +0 -0
  770. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_passthrough.py +0 -0
  771. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_passthrough_graph.py +0 -0
  772. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_payload_agnostic_ingress.py +0 -0
  773. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_reconcile_capture.py +0 -0
  774. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_reconcile_compare.py +0 -0
  775. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_reconcile_harness.py +0 -0
  776. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_redaction.py +0 -0
  777. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_reference_sets.py +0 -0
  778. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_reingress.py +0 -0
  779. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_remotefile_transport.py +0 -0
  780. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_response_capture.py +0 -0
  781. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_rest_transport.py +0 -0
  782. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_retention.py +0 -0
  783. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_run_context.py +0 -0
  784. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_scaffold.py +0 -0
  785. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_scaffold_requirements.py +0 -0
  786. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_scan_forbidden.py +0 -0
  787. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_secrets_dpapi.py +0 -0
  788. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_security_notify.py +0 -0
  789. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_security_static.py +0 -0
  790. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_service_control.py +0 -0
  791. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sharding.py +0 -0
  792. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sibling_helper_finder.py +0 -0
  793. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_smart_backend.py +0 -0
  794. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_soap_transport.py +0 -0
  795. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_soap_wssecurity.py +0 -0
  796. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sqlserver_coordinator.py +0 -0
  797. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sqlserver_cursor_close.py +0 -0
  798. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sqlserver_schema_init.py +0 -0
  799. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_staged_pipeline.py +0 -0
  800. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_startup_fault_isolation.py +0 -0
  801. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_stats_reset.py +0 -0
  802. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_step_up.py +0 -0
  803. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store.py +0 -0
  804. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_backend.py +0 -0
  805. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_encryption.py +0 -0
  806. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_file_hardening.py +0 -0
  807. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_once_deliver_many.py +0 -0
  808. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_once_graph.py +0 -0
  809. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_read_pool.py +0 -0
  810. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_ssl.py +0 -0
  811. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_summary.py +0 -0
  812. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_supervisor.py +0 -0
  813. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_task_resilience.py +0 -0
  814. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tcp_transport.py +0 -0
  815. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_cli.py +0 -0
  816. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_compare.py +0 -0
  817. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_correlate.py +0 -0
  818. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_hl7_fields.py +0 -0
  819. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_mefor_api.py +0 -0
  820. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_mllp.py +0 -0
  821. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_relay.py +0 -0
  822. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_report.py +0 -0
  823. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_store.py +0 -0
  824. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_timer_source.py +0 -0
  825. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tls_policy.py +0 -0
  826. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_totp.py +0 -0
  827. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_totp_window.py +0 -0
  828. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_transform_offloop.py +0 -0
  829. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_transform_state.py +0 -0
  830. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_transports.py +0 -0
  831. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_verify.py +0 -0
  832. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_version.py +0 -0
  833. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_win2025_acceptance.py +0 -0
  834. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_wiring.py +0 -0
  835. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_wiring_reload.py +0 -0
  836. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_wiring_serve.py +0 -0
  837. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ws_stats_revalidation.py +0 -0
  838. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_x12_parsing.py +0 -0
  839. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_x12_rte.py +0 -0
  840. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_x12_source_ip_allowlist.py +0 -0
  841. {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_x12_transport.py +0 -0
@@ -23,9 +23,11 @@ jobs:
23
23
  test:
24
24
  name: test (${{ matrix.os }}, py${{ matrix.python-version }})
25
25
  runs-on: ${{ matrix.os }}
26
- # Wall-clock backstop: bound each leg so a hung test fails in minutes, not the 6h default. The
27
- # pytest-timeout watchdog (60s/test) should catch a culprit first; this is the belt-and-suspenders cap
28
- # if a whole process ever deadlocks below pytest.
26
+ # Wall-clock backstop: bound each leg so a hung test fails in minutes, not the 6h default. Three
27
+ # nested watchdogs catch a hang at increasing scope (#55): the pytest-timeout per-test cap (60s,
28
+ # pyproject addopts) + the faulthandler belt fire FIRST and name the stuck frame; the pytest STEP
29
+ # has its own `timeout-minutes: 13` so a process-level deadlock below pytest fails the step fast;
30
+ # this job cap is the outermost belt if even that is somehow out-raced.
29
31
  timeout-minutes: 15
30
32
  strategy:
31
33
  fail-fast: false
@@ -56,7 +58,7 @@ jobs:
56
58
  sudo apt-get update
57
59
  sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libdbus-1-3
58
60
 
59
- - name: Install project (dev + console + fhir + dicom extras)
61
+ - name: Install project (dev + console + fhir + dicom + x12 + xml extras)
60
62
  run: |
61
63
  python -m pip install --upgrade pip
62
64
  # [fhir] so the FHIR typed-tier tests (incl. the PHI-no-leak invariant, ADR 0022) actually
@@ -64,7 +66,9 @@ jobs:
64
66
  # [dicom] (pydicom + pynetdicom; ADR 0025) does the same for the DICOM codec + C-STORE SCP
65
67
  # tests, and lets mypy type-check transports/dicom.py + parsing/dicom/ against the real
66
68
  # (py.typed) libraries rather than treating them as Any.
67
- pip install -e ".[dev,console,fhir,dicom]"
69
+ # [x12] (pyx12) + [xml] (lxml/xmlschema/signxml) likewise so the strict X12 validation (#32)
70
+ # and the hardened XML/SOAP codec (#31) tests run their assertions instead of importorskip-skipping.
71
+ pip install -e ".[dev,console,fhir,dicom,x12,xml]"
68
72
 
69
73
  - name: Lint (ruff)
70
74
  run: ruff check messagefoundry tests
@@ -75,10 +79,27 @@ jobs:
75
79
  - name: Type-check (mypy, strict)
76
80
  run: mypy messagefoundry
77
81
 
82
+ # Step-level watchdog UNDER the 15-min job cap (#55): the windows-2022 leg intermittently
83
+ # wedges ~25% in (a Windows ProactorEventLoop listener-teardown / socket wait that the shared
84
+ # session event loop can't get past), emits no output for ~12 min, then the JOB cap CANCELS it
85
+ # — a red ✗ with no stack and no named test. Two belts make that fail FAST and NAMED instead:
86
+ # * `--timeout-method=thread` (the ONLY method on Windows — SIGALRM is POSIX-only) dumps ALL
87
+ # thread stacks at the per-test cap (60s, set in pyproject addopts), naming the stuck frame.
88
+ # * PYTHONFAULTHANDLER=1 + `-o faulthandler_timeout=90` is the belt that fires even when the
89
+ # thread-timer CANNOT interrupt a main-thread C-level wait (a Proactor overlapped op /
90
+ # blocking accept / subprocess.wait): pytest's faulthandler plugin arms a separate watchdog
91
+ # thread that dumps the NATIVE stack of every thread at 90s (> the 60s pytest-timeout, so the
92
+ # per-test dump is attributed first; this is the last-resort stack when the thread method is
93
+ # itself out-raced). NB the plugin exposes this as the `faulthandler_timeout` ini key, not a
94
+ # `--faulthandler-*` CLI flag, so it is passed with `-o`; it only DUMPS (never kills), safe.
95
+ # The step `timeout-minutes: 13` is the outer backstop, well under the job's 15-min cap, so a
96
+ # hang both watchdogs somehow miss still fails the STEP (not the whole job at the silent cap).
78
97
  - name: Tests (pytest)
98
+ timeout-minutes: 13
79
99
  env:
80
100
  QT_QPA_PLATFORM: offscreen
81
- run: pytest -q
101
+ PYTHONFAULTHANDLER: "1"
102
+ run: pytest -q -o faulthandler_timeout=90
82
103
 
83
104
  # Build + type-check the VS Code extension, and run its integration tests. The Python jobs never
84
105
  # touch ide/, so a dep bump or IDE code change that breaks the bundle or the types would otherwise
@@ -592,7 +613,14 @@ jobs:
592
613
  # install-service.ps1 -Environment threads it into the service command + resolves
593
614
  # environments/prod.toml). INFO not DEBUG: `serve` refuses DEBUG in prod (Gate #1 — DEBUG can
594
615
  # surface PHI); INFO is enough to smoke service start + MLLP.
595
- .\scripts\service\install-service.ps1 -AppExe $exe -LogLevel INFO -Environment prod
616
+ # -LockConfigDir: the runner checks out samples/config with the default ACL, which grants
617
+ # BUILTIN\Users (S-1-5-32-545) write. The in-process config-source trust guard (SEC-003,
618
+ # wiring._assert_safe_config_source_windows) then REFUSES to load it ("writable-by-others
619
+ # path") and `serve` crash-loops to SERVICE_PAUSED, so /health never comes up. Locking the
620
+ # config dir (strip inheritance -> SYSTEM/Administrators only; the LocalSystem service still
621
+ # reads it) is the production-correct posture docs/SERVICE.md prescribes, and exercises the
622
+ # real -LockConfigDir install path rather than the MEFOR_ALLOW_INSECURE_CONFIG_SOURCE dev escape.
623
+ .\scripts\service\install-service.ps1 -AppExe $exe -LogLevel INFO -Environment prod -LockConfigDir
596
624
  # The shipped samples graph includes a mutual-TLS WS-* SOAP feed (IB_IMMUNIZATION_VXU) whose
597
625
  # connector LOADS its client cert at wiring time, so the engine refuses to start the graph
598
626
  # without a readable cert+key. Mint a throwaway pair for the smoke — the smoke sends only an
@@ -6,6 +6,121 @@ All notable changes to MessageFoundry are documented here. The format follows
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.2.10] — 2026-06-27 — Early Access
10
+
11
+ The **Plan-5 "v0.3 candidate" wave** — completing the deferred connector/codec set and the Corepoint
12
+ parity gaps, built across two multisession waves (L1–L9) and adversarially reviewed. All on-prem,
13
+ code-first, no behavior change to existing graphs.
14
+
15
+ ### Added
16
+ - **Inbound HTTP / REST listener** (#7, [ADR 0023](docs/adr/0023-inbound-http-listener.md)) — a
17
+ connector-owned bound `asyncio` HTTP/1.1 socket **source** in `transports/` (not `api/`), feeding the
18
+ payload-agnostic ingress (ADR 0004) as a `RawMessage`. ACK-on-receipt (respond-with-receipt **after** the
19
+ raw is durably committed), with oversize/malformed/slow-loris hardening surfaced as `connection_event`s;
20
+ new `ConnectorType.HTTP`. The substrate for the future inbound FHIR facade (#20) / DICOMweb receiver (#24).
21
+ *(SOAP-envelope sync-reply, intake-socket auth, and method/path routing metadata are deferred follow-ons.)*
22
+ - **`fhir_lookup(connection, query)`** (#58, [ADR 0043](docs/adr/0043-fhir-read-lookup.md)) — a Handler-callable,
23
+ **read-only** FHIR read/search that extends the ADR 0010 `db_lookup` carve-out to FHIR: off the event loop,
24
+ raises on a Router / in dry-run, reuses the SMART Backend bearer (ADR 0024) + `[egress].allowed_http`, GET-only.
25
+ - **Email / SMTP outbound destination** (#23, [ADR 0029](docs/adr/0029-email-smtp-destination.md)) — a stdlib
26
+ `Email()`/`SMTP()` connector; STARTTLS-by-default, AUTH-over-TLS-only, a new deny-by-default
27
+ `[egress].allowed_smtp` arm. (IMAP/POP read + XOAUTH2 is a deferred Phase 2.)
28
+ - **X12 strict implementation-guide validation** via `pyx12` (#32) behind the tolerant `X12Peek`/`X12Message`
29
+ hot path (`messagefoundry[x12]`; yields 997/999 acks), and a **structured `[xml]` codec layer** (#31) —
30
+ `XmlMessage` (XPath read/set + ns-aware re-encode) over **hardened lxml** + optional `xmlschema`/`signxml`
31
+ (`messagefoundry[xml]`; XXE / entity-expansion / external-DTD refused).
32
+ - **Operator alert-state** (#56, [ADR 0044](docs/adr/0044-operator-alert-state.md)) — a new `alert_instance`
33
+ store table (open / acknowledged / resolved + first/last-seen + count) across all three backends, de-duped on
34
+ the ADR-0014 throttle key; `GET /alerts/active` + ack/resolve (RBAC `MONITORING_DIAGNOSE`); the per-connection
35
+ `alerts_active` count is now real; a console Alerts tab. Metadata-only.
36
+ - **User-definable custom RBAC roles** (#57, [ADR 0045](docs/adr/0045-custom-rbac-roles.md)) — an admin-defined
37
+ named role = a chosen **subset** of the existing Permission catalog (no new permission kinds), persisted via an
38
+ additive `roles` migration (3 backends), gated by `USERS_MANAGE`; the six built-ins stay; narrowing revokes on
39
+ live sessions.
40
+ - **Message-content search** (#51, [ADR 0046](docs/adr/0046-message-content-search.md)) — HL7 field-path /
41
+ raw-content matching by **scan-and-decrypt-per-row** (the store is AES-GCM-encrypted at rest, so a plain `LIKE`
42
+ is impossible): metadata-pre-filtered, hard row/result caps (truncate-and-tell), decrypt off the event loop,
43
+ behind `messages:view_*` + **step-up** + a `message_search` audit row that never logs the search needle.
44
+ - **HL7 timestamp helpers on `Message`** (#59) — `age`-from-DOB, length-of-stay, and the tolerant HL7-TS parse
45
+ surfaced on the `Message` API (reusing `timezone.py`; no duplicate parser).
46
+ - **`messagefoundry support-bundle`** CLI (#49) — a PHI-safe diagnostic zip (no message bodies, no secrets;
47
+ redacted log tail) — and a **zero-egress version update-check** (#30,
48
+ [ADR 0026](docs/adr/0026-off-box-egress-update-check.md)): a no-network pinned-vs-current diff surfaced as a
49
+ `/status` field + an `update_available` alert + a console banner (on by default; `mode=live` rejected at load).
50
+
51
+ ### Changed
52
+ - `[egress]` gains `allowed_smtp` (email); the read-only-lookup carve-out (CLAUDE.md §2/§8) now names
53
+ `fhir_lookup` alongside `db_lookup`.
54
+ - New connectors/codecs are documented in [`docs/CONNECTIONS.md`](docs/CONNECTIONS.md) and the update-check in
55
+ [`docs/CONFIGURATION.md`](docs/CONFIGURATION.md) (`[update_check]`).
56
+
57
+ ### Security
58
+ - All new live-lookup / search paths stay on-prem and gated: `fhir_lookup` and the update-check are zero-/
59
+ allow-listed-egress; content search is step-up-gated + audited and never weakens at-rest encryption (the
60
+ cleartext key-field index was **declined**; a keyed-token index is a deferred 2nd slice). New crypto sites
61
+ (`transports/http_listener.py` TLS) are registered in the ASVS-11.1.3 crypto inventory.
62
+
63
+ ### Dependencies
64
+ - New optional extras only: `messagefoundry[x12]` (`pyx12`) and `messagefoundry[xml]`
65
+ (`lxml`/`xmlschema`/`signxml`); the base install is unchanged. Lockfile re-exported.
66
+
67
+ ## [0.2.9] — 2026-06-27 — Early Access
68
+
69
+ A retention + security-hardening + observability release: per-connection retention and
70
+ embedded-document pruning windows, dual-control config reloads with startup code-attestation,
71
+ operational-health metrics, and a fix for the intermittent Windows listener-teardown / CI hang.
72
+
73
+ ### Added
74
+ - **Per-connection retention windows (ADR 0027).** Optional `messages_days` (inbound) and
75
+ `dead_letter_days` (outbound) on a connection, layered over the global `[retention]` window and
76
+ authored on the connection spec or `connections.toml` (the same override idiom as the delivery
77
+ knobs): `None` inherits the global window, `0` keeps forever. The `RetentionRunner` threads a
78
+ per-connection cutoff through the body and dead-letter purge on **all three** store backends; the
79
+ never-purge-an-in-flight-body guard and the single per-pass audit row (now recording the overrides)
80
+ are unchanged. (#34)
81
+ - **Embedded-document pruning (ADR 0042).** Optional `prune_documents_after` (+ a size threshold)
82
+ per inbound connection: after the window, bulky **base64 embedded documents** — HL7 **OBX-5 ED**
83
+ and the generic `mfb64:v1:` carriage — are stripped **in place** to a small size/content-type
84
+ tombstone (via the parsed model / codec, **never** string-slicing HL7), keeping the rest of the
85
+ message parseable; the row is never deleted and a `documents_pruned` flag is set. All three
86
+ backends. (The ingest-time offload variant remains deferred.) (#47)
87
+ - **Dual-control `config:reload` (ADR 0041 D2).** `config_reload` is now a gateable
88
+ `[approvals].operations` op — a **distinct** second approver must release a live config reload
89
+ (the requester can never self-approve; both identities land in the hash-chained audit). Opt-in /
90
+ deny-by-default, so single-operator deployments are unchanged. (#53)
91
+ - **Startup code self-attestation (ADR 0041 D3).** At startup the engine hashes its loaded modules
92
+ against the wheel's `dist-info/RECORD`; on drift it records a hash-chained, off-box-teed
93
+ `startup_integrity` audit row and raises an alert (**alert-only by default**; opt-in
94
+ `[integrity].fail_closed_on_drift` refuses to start). A no-op on an editable (`pip install -e .`)
95
+ install, so development is never bricked. (#54)
96
+ - **Operational-health metrics.** `GET /status` now meters the app-log directory's disk usage
97
+ alongside the database, and a per-connection **message-stall** alert rule fires when a connection's
98
+ oldest-undelivered age crosses a configurable threshold. (#50)
99
+
100
+ ### Changed
101
+ - **Non-editable, hash-locked wheel is the enforced production default (ADR 0017 amendment).** The
102
+ prior recommendation is now the default for production deployments; editable installs remain a
103
+ no-op for development. (#54)
104
+
105
+ ### Fixed
106
+ - **Intermittent Windows listener-teardown hang.** `MLLPSource` / `TcpSource` / `X12Source` no longer
107
+ `await server.wait_closed()` / `writer.wait_closed()` **unbounded** on the Windows Proactor loop
108
+ during teardown — a wait that never completes can no longer stall a shared event loop (the same
109
+ class as the resolved py3.11 hang). Added CI guards (a per-test `faulthandler` stack dump and a
110
+ step-level watchdog) so a future hang fails fast and names itself instead of silently timing out. (#55)
111
+
112
+ ### Docs
113
+ - Refreshed `benchmarks/TUNING-BASELINE.md` with measured multi-process sharding throughput from the
114
+ Windows Server 2025 box (η ≈ 0.85 speedup shape; per-shard E_core ≈ 42 msg/s — a test-box SQLite
115
+ floor), plus the still-unmeasured hardware-gated follow-ups (enterprise E_core, the shared-DB
116
+ commit-wall sweep). (#28, #29)
117
+ - Authored **ADR 0027** (per-connection retention) and **ADR 0042** (embedded-document pruning); added
118
+ EARS acceptance criteria to **ADR 0041** D2/D3; amended **ADR 0017** for the enforced wheel.
119
+
120
+ ### CI
121
+ - Locked the smoke job's config directory (#603) and skipped a mirror-only Dependabot guardrail test
122
+ on the OSS mirror (#606), greening `main` CI post-0.2.8.
123
+
9
124
  ## [0.2.8] — 2026-06-27 — Early Access
10
125
 
11
126
  A tooling/ops release: the load harness gains a **multi-shard driver** so one harness can drive a
@@ -339,7 +454,9 @@ tests, but the external code review + penetration test (the bar for a security-c
339
454
  - Releases are built, SBOM'd (CycloneDX), and signed with [Sigstore](https://www.sigstore.dev/) — see the
340
455
  `release` workflow.
341
456
 
342
- [Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.8...HEAD
457
+ [Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.10...HEAD
458
+ [0.2.10]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.9...v0.2.10
459
+ [0.2.9]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.8...v0.2.9
343
460
  [0.2.8]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.7...v0.2.8
344
461
  [0.2.7]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.6...v0.2.7
345
462
  [0.2.6]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.5...v0.2.6
@@ -100,10 +100,12 @@ drains independently (a slow/failing one never blocks siblings); routing and tra
100
100
  queued stages, so a slow/hung router or transform can no longer stall intake — or each other. At-
101
101
  least-once now relies on a re-run re-deriving identical output, so **routers and transforms must be
102
102
  pure** (message in → message out, no external side effects); outbound connections must still be
103
- **idempotent**. *Carve-out (ADR 0010):* a Handler may make a **live, read-only** database read via
104
- `db_lookup(connection, statement, params)` the result may differ on a re-run, **accepted by design**
105
- (it reflects the database at that pass). It is the one sanctioned non-pure input: read-only, gated by
106
- `[egress].allowed_db`, run **off the event loop**, and unavailable on a Router or in dry-run (it raises).
103
+ **idempotent**. *Carve-out (ADRs 0010/0043):* a Handler may make a **live, read-only** lookup a
104
+ database read via `db_lookup(connection, statement, params)` (gated by `[egress].allowed_db`) or a FHIR
105
+ read/search via `fhir_lookup(connection, query)` (ADR 0043; gated by `[egress].allowed_http`, reusing the
106
+ SMART bearer, GET-only) the result may differ on a re-run, **accepted by design** (it reflects the source
107
+ at that pass). These are the sanctioned non-pure inputs: read-only, run **off the event loop**, and
108
+ unavailable on a Router or in dry-run (they raise).
107
109
 
108
110
  **Count-and-log invariant (do not break):** **every received message is persisted before the ACK**
109
111
  (status `RECEIVED` at the ingress stage), so inbound counts still reflect the true received volume and
@@ -201,6 +203,17 @@ diverge enough to warrant it; keep this root file general.
201
203
  - Paste/point at the relevant existing code alongside a plan request; it measurably improves
202
204
  results.
203
205
 
206
+ ### Prefer Ultracode for substantive work
207
+ - Before starting any substantive / non-trivial task, **check whether ultracode is enabled this
208
+ session** (an `ultracode` system-reminder confirms it). If it is **not**, **warn the user up
209
+ front and offer to do the work in ultracode** — a **Workflow** (multi-agent, adversarially
210
+ verified) is the preferred mode here — before proceeding.
211
+ - You **cannot enable ultracode yourself**: it is **session-only** and opt-in by keyword. So the
212
+ offer is *re-send the request with the keyword "ultracode"*, **or** confirm they want to proceed
213
+ solo — never claim to "switch it on", and don't auto-run a Workflow without the opt-in.
214
+ - **Solo only on conversational turns or trivial mechanical edits** — don't nag there. The warn-
215
+ and-offer gate is for non-trivial build/design/debug work, alongside the planning gate above.
216
+
204
217
  ### Keep context clean
205
218
  - One logical task per session. After ~two failed attempts at the same problem, `/clear` and
206
219
  restart with a better prompt incorporating what was learned — don't grind in a polluted
@@ -319,8 +332,9 @@ python samples/send_mllp.py samples/messages/adt_a01.hl7
319
332
  - **Preserve the original raw message** in the store alongside the transformed form, so an
320
333
  operator always sees what actually arrived.
321
334
  - Keep transforms **pure where possible**: message in → message out; side effects (DB, network)
322
- belong in connections/transports. The one sanctioned exception is a **read-only** `db_lookup` (ADR
323
- 0010) for live enrichment/gating (provider/eligibility lookups) — never a write or other side effect.
335
+ belong in connections/transports. The sanctioned exceptions are the **read-only** `db_lookup` (ADR
336
+ 0010) and `fhir_lookup` (ADR 0043) for live enrichment/gating (provider/eligibility lookups) — never a
337
+ write or other side effect.
324
338
  - **ACK/NAK:** generate proper AA/AE/AR for MLLP inbound connections; the ack mode (original vs
325
339
  enhanced vs none) is **configurable per inbound connection** (`AckMode`). Under the staged
326
340
  pipeline the ACK is **on receipt** (`ack_after=ingest`, the default — `AckAfter`): decode/parse/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: messagefoundry
3
- Version: 0.2.8
3
+ Version: 0.2.10
4
4
  Summary: Open-source healthcare integration engine — route, transform, and validate messages across many formats and connection types
5
5
  Project-URL: Homepage, https://messagefoundry.org/
6
6
  Project-URL: Documentation, https://messagefoundry.org/
@@ -66,6 +66,12 @@ Provides-Extra: sftp
66
66
  Requires-Dist: paramiko>=5.0; extra == 'sftp'
67
67
  Provides-Extra: sqlserver
68
68
  Requires-Dist: aioodbc>=0.5; extra == 'sqlserver'
69
+ Provides-Extra: x12
70
+ Requires-Dist: pyx12>=4.0.0; extra == 'x12'
71
+ Provides-Extra: xml
72
+ Requires-Dist: lxml>=6.0.0; extra == 'xml'
73
+ Requires-Dist: signxml>=4.0.0; extra == 'xml'
74
+ Requires-Dist: xmlschema>=4.0.0; extra == 'xml'
69
75
  Description-Content-Type: text/markdown
70
76
 
71
77
  # MessageFoundry
@@ -37,10 +37,10 @@ code has since been removed** (per-lane ownership, the `renew_leases` heartbeat,
37
37
  > - **Workstream G** (console HA operability) — **DONE**: leader/cluster view on Engine Status + off-thread
38
38
  > reads (#299), with the per-page off-thread polling completed in #341 — which also closes deferred **#2**.
39
39
  >
40
- > The public `0.1.0` tag shipped **without** gating on the licensing/legal decision (#13) — that formal
41
- > counsel review is **deferred to v0.2 as a dated accepted-risk decision (2026-06-17)**: `v0.1.0` shipped on
42
- > the drafted AGPL-3.0-or-later + `NOTICE`/`COMMERCIAL-LICENSE`/`CLA` posture **without** counsel sign-off
43
- > (see #13). *Optional non-gating follow-up:* re-run the Postgres failover after fix #293 to refresh the
40
+ > The public `0.1.0` tag shipped **without** gating on the licensing/legal decision — that formal
41
+ > counsel review was **deferred as a dated accepted-risk decision (2026-06-17)**: `v0.1.0` shipped on
42
+ > the drafted AGPL-3.0-or-later + `NOTICE`/`COMMERCIAL-LICENSE`/`CLA` posture **without** counsel sign-off.
43
+ > *Optional non-gating follow-up:* re-run the Postgres failover after fix #293 to refresh the
44
44
  > published ~60 s recovery figure (the hard conformance tier — zero loss, order-preserving, drain-to-zero —
45
45
  > passes on all three backends regardless).
46
46
 
@@ -52,7 +52,7 @@ With `v0.1.0` shipped, the active priority moves to **v0.2**. Its headline is th
52
52
  client (#20)** plus the operator-visibility quick wins — **observability/metrics export (#21)**, the
53
53
  **console Alerts/Dead-Letters pages (#22)**, and the **user guide (#19)**. The candidate work is the
54
54
  Mirth feature-gap items **#20–#27** below, plus deferred **#3** (per-key ordering), **#16** (Corepoint
55
- event-log parity, ADRs 0020/0021), the licensing counsel review (**#13**), and the security-posture
55
+ event-log parity, ADRs 0020/0021), and the security-posture
56
56
  follow-ups below. **Active-active horizontal scale-out is dropped and its code removed** — no longer a
57
57
  planned milestone (2026-06-18). Full build sequencing across parallel sessions:
58
58
  [`releases/MULTISESSION-PLAN-3.md`](releases/MULTISESSION-PLAN-3.md) (the living plan; supersedes
@@ -75,9 +75,9 @@ separate owner exercise** — this is the candidate set, not a committed plan.
75
75
 
76
76
  | Item | Value | Verdict | Effort | Why / trigger |
77
77
  |---|---|---|---|---|
78
- | **Meta — lock v0.2 scope** | Med | **do-now** | S | Ratify #20–#27 as committed (marquee shipped, declines recorded, **#24 promoted 2026-06-20 — ADR 0025, adopter-driven**); decide #22b ship-or-slip. Governance, not a feature. Don't let the open #13 counsel review be a false blocker (dated accepted-risk). |
79
- | **#28 load test** | Med | **do-now** | S | Run the built no-loss harness regression-guards the active-active-removal claim-path rework + gives pilot perf evidence. Pair with #29 in one run window. |
80
- | **#29 throughput test** | Med | **do-now** | S | Refresh the stale `TUNING-BASELINE.md`; same harness/run as #28. Measure-and-publish, **not** premature perf-tuning. |
78
+ | **Meta — lock v0.2 scope** | Med | **do-now** | S | Ratify #20–#27 as committed (marquee shipped, declines recorded, **#24 promoted 2026-06-20 — ADR 0025, adopter-driven**); decide #22b ship-or-slip. Governance, not a feature. |
79
+ | **#28 load test** | Med | **done** | S | Executed on the local test boxes (2026-06-27) — no-loss/latency result in `TUNING-BASELINE.md`. These are the **consumer-hardware floor**; the enterprise-hardware run is slated for the **#40** self-hosted box. |
80
+ | **#29 throughput test** | Med | **done** | S | Re-measured on the local test boxes + `TUNING-BASELINE.md` refreshed (2026-06-27). Consumer-hardware floor numbers; the enterprise re-measure is slated for the **#40** self-hosted box. |
81
81
  | **#22b Alerts GUI page** | Med | do-next | S | Endpoint `/alerts/rules` shipped (#415); thin console page in flight (PR #420). Operator-parity polish, not a migration-unblocker. |
82
82
  | **#33 config-UX audit** | Med | do-next | M | Right timing to audit config sprawl — but value realizes **only if** the spawned follow-ups are funded. Keep bounded to transport/service config (logic stays code-first — never drift toward #26). |
83
83
  | **FEATURE-MAP refresh** | Med | do-next → **done** | S | Verified stale (Dead-Letters row); ASVS score synced to 212/0/0/133 (#425). |
@@ -85,7 +85,6 @@ separate owner exercise** — this is the candidate set, not a committed plan.
85
85
  | **#16 eventlog (0021 half)** | Med | on-trigger | L | Trigger: a partner needs ACK-reconciliation evidence. 0021 (inbound ACK "Response Sent") is cheap (extends ADR 0013); **0020 (raw protocol-trace) = near-drop** (new raw-PHI-at-rest tier nobody named). The #14 tee already surfaces ACK signal. |
86
86
  | **#34 per-connection retention** | Med | on-trigger | M | Trigger: a real multi-feed estate needs differential windows (keep ADT 90d, prune a chatty lab feed 7d). Bounded; follows the per-connection-over-global pattern. |
87
87
  | **least-priv service-account default** | Med | on-trigger | S | Account + ACLs already built; only the default flip off LocalSystem remains. Ride the next green `windows-service-smoke`. |
88
- | **#13 licensing close-out** | Med | on-trigger | S | Blocked on counsel's reply; owner can only chase, not build (v0.1.0 already shipped the posture as accepted risk). |
89
88
  | **#11 WebAuthn (WP-14b)** | Low | on-trigger | L | Buys **zero** ASVS movement (6.3.3 already Pass via TOTP); only on off-loopback exposure. |
90
89
  | **connector SecretProvider seam** | Low | on-trigger | M | Already a conditional Pass; managed-identity (gMSA/Entra) covers the audience. Build on real Vault/KMS demand. |
91
90
  | **#31 `.xml()` accessor** | Low | on-trigger | S | Trigger: the first inbound XML feed (lands with #7). Core `.xml()` only, hardened defaults — **no** `[xml]`/lxml SOAP/CDA model. |
@@ -96,7 +95,6 @@ separate owner exercise** — this is the candidate set, not a committed plan.
96
95
  | **#24 DICOM** | **Med–High** | **done (Phases 1 + 2)** | L | **Adopter-driven** — a radiology practice on Corepoint DICOM Gear wants to adopt. ✅ **Phases 1 + 2 SHIPPED** ([ADR 0025](adr/0025-dicom-codec-store-connectors.md) Accepted): pure codec + DIMSE **C-STORE SCP** + code-first SR→HL7 Handler (Phase 1, PR #439); **C-STORE SCU + C-ECHO + DICOMweb STOW-RS** outbound (Phase 2, `rest.py` reuse — no new dep). **MWL/Q-R/inbound-DICOMweb declined/deferred.** Did **not** need #7. |
97
96
  | **Meta — v0.3 cut** | Low | defer | S | Don't formalize now — a themed candidate set anchored on **ADR 0023 / inbound-HTTP**, gated on real feeds. |
98
97
  | **#30 dependency-update check** | Low | defer → drop | M | Zero demand; an outbound PyPI call **tensions the on-prem/no-egress identity**. `requirements.lock` + DEP-1 already cover it. |
99
- | **#9 ASVS `.docx` re-stamp** | Low | **drop** | S | Out-of-repo pandoc run before a CISO meeting — not backlog work (the in-repo assessment is already current). |
100
98
  | **ASVS 11.7.1 in-use memory encryption** | Low | **drop (N/A)** | XL | Already scored **N/A** — a hardware/OS/hypervisor capability, unachievable for pure-Python on-prem. |
101
99
  | **#18 git-offering** | Low | **confirm-decline** | M | Buyers already run git/ADO/GHE — a non-problem. Fold conventions into #33; AGPL-compat entanglement. |
102
100
  | **#25 JMS** | Low | **confirm-decline** (as named) | M | Java-broker artifact vs the **no-broker identity** (the staged SQLite queue *is* the durability story). Keep only a *generic* AMQP/Kafka on-trigger candidate. |
@@ -612,37 +610,6 @@ wanted, gating the approve route with `require_step_up` too is a one-line change
612
610
 
613
611
  ---
614
612
 
615
- ## 9. Regenerate the InfoSec standards-conformance deliverables to ASVS L3
616
-
617
- > ✅ **DONE (2026-06-17), then advanced.** The in-repo **`docs/security/ASVS-L3-STATUS.md`** memo was
618
- > re-stamped — first to **186 / 21 / 5 / 133** (post-WP-14 MFA, 6.3.3 MFA-as-Fail framing rewritten), then
619
- > to **189 / 20 / 3 / 133** after WP-L3-13 admin defense (8.4.2) and sec-offbox-log off-box
620
- > forwarding (16.4.3 + 16.2.4) landed. The OneDrive reviewer-facing `.docx` deliverables (the ASVS-L3 status memo, the InfoSec
621
- > standards summary, and the executive summary) were re-stamped to the same scorecard via pandoc
622
- > (originals backed up `*.pre-restamp.docx`). **Note (current posture, 2026-06-19):** the score has since
623
- > advanced to **212 / 0 / 0 / 133** (16.4.3 + 16.2.4 closed by sec-offbox-log → 189/20/3/133; the 4.1.5 #378,
624
- > 12.1.4 #376, 13.3.3 #377 Fail→Pass flips → 192/20/0/133; then the #383 partials sweep closed the last 20
625
- > Partials with documented residuals → 212/0/0/133); the in-repo
626
- > `ASVS-L3-STATUS.md` / `ASVS-L3-ASSESSMENT.md` are updated, but the OneDrive `.docx` set needs another re-stamp.
627
- > *(The `STANDARDS-CONFORMANCE-SUMMARY.md` named below was never committed to the repo — the canonical
628
- > source of truth is `ASVS-L3-ASSESSMENT.md`; the summaries live in the OneDrive deliverable set.)*
629
-
630
- **Type:** documentation / reviewer-facing deliverable refresh. No code.
631
-
632
- **What:** `docs/security/STANDARDS-CONFORMANCE-SUMMARY.md` and its two `.docx` companions still carry
633
- the **L2** headline (`138 Pass / 18 Partial / 2 Fail / 95 N-A`) and L2 framing. The assessment was
634
- re-targeted to **Level 3** (PR #273) and the L3 remediation arc is largely closed — the current
635
- combined scorecard is **212 Pass / 0 Partial / 0 Fail / 133 N-A** (345 reqs — 0 open Fails *and* 0 open Partials after the #383 partials sweep, atop sec-offbox-log off-box forwarding + the 4.1.5 #378 / 12.1.4 #376 / 13.3.3 #377 Fail→Pass flips). Regenerate the summary +
636
- Word deliverables against `ASVS-L3-ASSESSMENT.md` / `ASVS-L3-REMEDIATION-PLAN.md` (re-run the
637
- `infosec-standards-doc` workflow), keeping the point-in-time SELF-assessment disclaimer.
638
-
639
- **Why deferred:** a derived deliverable, not a gate — regenerate when next presenting to a
640
- reviewer/CISO so the numbers don't drift again mid-arc.
641
-
642
- **Source:** ASVS L2→L3 re-target (PR #273) + the L3 remediation arc (#284 / #305 / #308 / #312).
643
-
644
- ---
645
-
646
613
  ## 10. Worktree tooling: `new.ps1 -Base` resolves the *local* branch, which can lag `origin`
647
614
 
648
615
  > ✅ **DONE (2026-06-17, PR #348).** `new.ps1`/`spawn.ps1` now `git fetch origin` first and default `-Base`
@@ -728,40 +695,6 @@ traced.
728
695
 
729
696
  ---
730
697
 
731
- ## 13. Licensing posture — config-as-separate-work + commercial edition (counsel review deferred to v0.2 — accepted risk)
732
-
733
- > 📂 **ENGAGEMENT OPENED 2026-06-19 (coordinator), PR #406.** The formal counsel review is now scoped and
734
- > opened — see [`COUNSEL-ENGAGEMENT-BRIEF.md`](COUNSEL-ENGAGEMENT-BRIEF.md), packaging the four review
735
- > artifacts (CLA, COMMERCIAL-LICENSE, ADR 0017 §6, DUAL_LICENSING_PLAN) + 11 questions for counsel (the six
736
- > plan questions incl. config-as-separate-work, plus five surfaced: no Corporate CLA, comment-assent
737
- > enforceability, the §3 patent grant, the steward's own §13, dependency license-compat). Doc-only; recording
738
- > counsel's answers + lifting "pending legal review" is the deferred close-out (Lane L).
739
-
740
- > **⚠️ DECISION 2026-06-17 (owner — accepted risk), CARRIED OUT 2026-06-18:** the formal licensing/counsel
741
- > review was **deferred to v0.2**, and **`v0.1.0` was not gated on it**. `v0.1.0` was cut and published
742
- > 2026-06-18 on the drafted **AGPL-3.0-or-later** posture (`NOTICE`, per-file SPDX headers, `CLA.md`,
743
- > `COMMERCIAL-LICENSE.md` — landed in #350). The owner **accepted the risk** that publishing `v0.1.0` and
744
- > reserving the package name — effectively irreversible, setting the licensing precedent adopters build on —
745
- > happened **before** counsel reviews ADR 0017 decision #6. This superseded the "settle with counsel *before*
746
- > first public release" stance recorded below (and ADR 0017 §6); the review moves to the v0.2 cycle.
747
-
748
- **Type:** licensing / release-gating decision. No code.
749
-
750
- **What:** ADR 0017's ratified **decision #6** — adopter **config is a "separate work"** from the AGPL
751
- engine, paired with a planned **commercial edition** — is recorded as **PENDING LEGAL REVIEW**. The
752
- licensing posture (how the AGPL engine, an adopter's own private config repo, and a possible commercial
753
- offering relate) should be settled with counsel **before** the first public release: publishing a version
754
- and reserving the package name is effectively irreversible and sets the licensing precedent adopters build
755
- on.
756
-
757
- **Why deferred:** it is a legal/business decision, not engineering — it gates *how* the licensing posture is
758
- counsel-blessed, not *whether* the engine works. **Per the 2026-06-17 decision above it did not hold the
759
- `v0.1.0` tag** (accepted-risk — `v0.1.0` shipped 2026-06-18); the review is rescheduled to the v0.2 cycle.
760
-
761
- **Source:** ADR 0017 ("Ratified decisions", decision #6); the v0.1 release-readiness discussion.
762
-
763
- ---
764
-
765
698
  ## 14. Parallel-run "tee" for the Corepoint → MEFOR cutover
766
699
 
767
700
  > ✅ **BUILT — shipped #335 (relay) + #340 (purge/export).** The standalone, dependency-free MLLP tee relay
@@ -1087,7 +1020,7 @@ adopter supplies git out-of-band.
1087
1020
  embedded lightweight git server for the config repo, or just documented git conventions + IDE wiring
1088
1021
  over the adopter's existing remote — these are very different commitments.
1089
1022
  - **Licensing fit:** any bundled component must be license-compatible with the AGPL engine and the
1090
- config-as-separate-work posture (ties into **#13** / ADR 0017 decision #6, pending legal).
1023
+ config-as-separate-work posture (ties into ADR 0017 decision #6, pending legal).
1091
1024
  - **Dependency/footprint cost:** adding a git dependency to the base install vs. keeping the engine
1092
1025
  lean and leaving VCS to the operator.
1093
1026
 
@@ -1416,6 +1349,13 @@ priority; situational.
1416
1349
 
1417
1350
  ## 28. Run a load test (execute the load harness on the current build)
1418
1351
 
1352
+ > ✅ **DONE — executed on the local test boxes (2026-06-27).** The no-loss / latency-under-load harness was
1353
+ > run against the current `0.2.9` build and [`benchmarks/TUNING-BASELINE.md`](benchmarks/TUNING-BASELINE.md)
1354
+ > carries the result. **Caveat:** these are the **consumer-hardware floor** figures (a ~15 W APU + consumer
1355
+ > SSD with the engine + DB co-located — a deliberately conservative floor, *not* the enterprise number). A
1356
+ > single-box-NVMe / enterprise-shaped run to pin the real ceiling is **slated for #40** (the self-hosted
1357
+ > Windows Server 2025 + SQL Server 2025 CI leg), which will be the standing home for the recurring perf runs.
1358
+
1419
1359
  **Type:** validation / verification — *running* existing tooling, not new code. The load harness is
1420
1360
  **BUILT** ([`harness/load/`](../harness/load/), [`docs/LOAD-TESTING.md`](LOAD-TESTING.md)) and a Gate-#3
1421
1361
  baseline is published ([`benchmarks/TUNING-BASELINE.md`](benchmarks/TUNING-BASELINE.md)).
@@ -1435,6 +1375,12 @@ pass is the evidence for a pilot/cutover and the regression guard for pipeline/s
1435
1375
 
1436
1376
  ## 29. Run a throughput test (re-measure + refresh the tuning baseline)
1437
1377
 
1378
+ > ✅ **DONE — re-measured on the local test boxes (2026-06-27).** Throughput (msg/s + p50/p95/p99) was
1379
+ > re-run across the store backends and [`benchmarks/TUNING-BASELINE.md`](benchmarks/TUNING-BASELINE.md)
1380
+ > refreshed. As with #28 these are the **consumer-hardware floor** numbers; the enterprise-hardware
1381
+ > re-measure is **slated for #40** (the self-hosted Windows Server 2025 + SQL Server 2025 leg), the standing
1382
+ > home for recurring throughput runs.
1383
+
1438
1384
  **Type:** validation / benchmark — *running* the existing benchmark, not new tooling.
1439
1385
 
1440
1386
  **What:** re-run the throughput benchmark (msg/sec + p50/p95/p99 latency) across the supported store
@@ -1975,6 +1921,9 @@ dedicated Windows Server + SQL Server test box and add a leg that:
1975
1921
  - runs the SQL Server store + coordinator + DATABASE-connector suites against the **local SQL Server
1976
1922
  2025** instance (`MEFOR_TEST_SQLSERVER=1`, real DSN) — exercising RCSI on a real engine, real
1977
1923
  `db_lookup`, and the AVX-capable hardware 2025 requires.
1924
+ - hosts the recurring **load + throughput runs (#28 / #29)** — the local-box runs published the
1925
+ consumer-hardware *floor*; this box is where the enterprise-hardware *ceiling* gets pinned on a
1926
+ recurring basis.
1978
1927
 
1979
1928
  **Scope / open questions (when built):**
1980
1929
  - **Self-hosted runner security:** it executes repo code — gate to **push / `workflow_dispatch` on
@@ -2501,6 +2450,141 @@ attachment-handler + data-pruner behavior researched the same day (citations abo
2501
2450
 
2502
2451
  ---
2503
2452
 
2453
+ ## 56. Operator alert-state — resolvable alert instances (ack / resolve) + a real `alerts_active` count (Corepoint parity) (P2)
2454
+
2455
+ > 📌 **PRE-RESERVED (Plan-5, 2026-06-27).** Number reserved + ADR authored; build scheduled. See
2456
+ > [`releases/MULTISESSION-PLAN-5.md`](releases/MULTISESSION-PLAN-5.md) Lane **L7** (Wave 2) and
2457
+ > [ADR 0044](adr/0044-operator-alert-state.md) (Proposed).
2458
+
2459
+ **Type:** feature — operator monitoring. Today alerts are stateless emit-points (ADR 0014) and the
2460
+ `ConnectionRow.alerts_active` field is **stubbed `0`**. Add a persisted `alert_instance` store table
2461
+ (open / acknowledged / resolved + first/last-seen + count) de-duped on the existing `_emit` throttle key,
2462
+ `GET /alerts/active` + ack/resolve endpoints (RBAC `MONITORING_DIAGNOSE`), the real `alerts_active` count,
2463
+ and a console Alerts-page tab. **Metadata only — no new at-rest PHI tier.** Surfaced by the #52 Corepoint
2464
+ parity gap analysis.
2465
+
2466
+ ---
2467
+
2468
+ ## 57. User-definable custom RBAC roles over the existing Permission catalog (Corepoint parity) (P2)
2469
+
2470
+ > 📌 **PRE-RESERVED (Plan-5, 2026-06-27).** See [`releases/MULTISESSION-PLAN-5.md`](releases/MULTISESSION-PLAN-5.md)
2471
+ > Lane **L8** (Wave 2) and [ADR 0045](adr/0045-custom-rbac-roles.md) (Proposed).
2472
+
2473
+ **Type:** feature — RBAC. Today there are **6 fixed built-in roles**. Add admin-defined named roles, each a
2474
+ chosen **subset** of the existing `Permission` catalog (no new permission kinds), persisted via a `roles`-table
2475
+ migration across all three backends (SQLite + Postgres + SQL Server), gated by `USERS_MANAGE`; the built-ins
2476
+ stay; custom roles are an additive overlay; deny-by-default preserved. Surfaced by the #52 Corepoint parity
2477
+ gap analysis.
2478
+
2479
+ ---
2480
+
2481
+ ## 58. FHIR client read / search lookup — `fhir_lookup` (read-only, like `db_lookup`) (P2)
2482
+
2483
+ > ✅ **SHIPPED (Plan-5 Wave 1, PR #618, 2026-06-27).** `fhir_lookup(connection, query)` is built — a read-only
2484
+ > GET / search that extends the `db_lookup` carve-out to FHIR ([ADR 0043](adr/0043-fhir-read-lookup.md),
2485
+ > Accepted), off the event loop, raises on a Router / in dry-run. See
2486
+ > [`releases/MULTISESSION-PLAN-5.md`](releases/MULTISESSION-PLAN-5.md) Lane L2.
2487
+
2488
+ **Type:** feature — live enrichment. The FHIR client (ADR 0022) is **write-only** today. Add a handler-callable,
2489
+ read-only `fhir_lookup(connection, query)` (read-by-id GET / search) that **extends** the ADR 0010 `db_lookup`
2490
+ carve-out to FHIR: reuses the SMART Backend bearer (ADR 0024) + `[egress].allowed_http`, runs off the event
2491
+ loop, raises on a Router / in dry-run, re-run-divergent by design (read-side only). GET-only — writes stay on
2492
+ `FhirDestination`. Surfaced by the #52 Corepoint parity gap analysis.
2493
+
2494
+ ---
2495
+
2496
+ ## 59. HL7 timestamp / age / length-of-stay helpers on `Message` (P3)
2497
+
2498
+ > ✅ **SHIPPED (Plan-5 Wave 1, PR #618, 2026-06-27).** `Message` now exposes age-from-DOB, length-of-stay, and
2499
+ > the tolerant HL7-TS parse (reusing `timezone.py`, no duplicate parser). See
2500
+ > [`releases/MULTISESSION-PLAN-5.md`](releases/MULTISESSION-PLAN-5.md) Lane L1.
2501
+
2502
+ **Type:** feature — transform ergonomics. **`messagefoundry/timezone.py` already provides the tolerant
2503
+ HL7-TS→`datetime` parse** (`_parse_hl7_timestamp` / `convert_hl7_timestamp` / `to_zone`); this item adds only
2504
+ the **new** helpers (age-from-DOB, length-of-stay between two timestamps, an `hl7_now()` / TS-format if missing)
2505
+ and surfaces the existing parser on the `Message` surface. MSH-encoding-aware, **no I/O**, console-importable
2506
+ (§4 carve-out). **Do not** build a duplicate parser. Surfaced by the #52 Corepoint parity gap analysis.
2507
+
2508
+ ---
2509
+
2510
+ ## 60. Turnkey disaster recovery — scheduled config/store backup + restore-verify (config-tier slice) (P3, owner decision)
2511
+
2512
+ > 📌 **PRE-RESERVED (Plan-5, 2026-06-27).** See [`releases/MULTISESSION-PLAN-5.md`](releases/MULTISESSION-PLAN-5.md)
2513
+ > §G (deferred tail). **Owner-gated** (backup cadence / retention / restore-verify posture).
2514
+
2515
+ **Type:** operations — DR. An engine-managed scheduled backup of the config bundle + store (config-tier slice
2516
+ first) with a restore-verify pass. Tracked for a future wave; **not staffed** until the owner sets the backup
2517
+ cadence / retention / restore-verify posture.
2518
+
2519
+ ---
2520
+
2521
+ ## 61. Third-tier DR standby — right-sized box that takes over when the HA pair fails, running only high-priority feeds (P3, owner decision)
2522
+
2523
+ > 📌 **Owner-gated / NEW candidate (2026-06-27).** A **third recovery tier** *below* the shipped
2524
+ > active-passive HA — distinct from **#60** (scheduled backup + restore-verify) and from the v0.1 HA
2525
+ > failover. **Not staffed** until the owner sets the DR posture (warm vs cold, activation trigger,
2526
+ > feed-priority tiers, fail-back); wants an **ADR** before code.
2527
+
2528
+ **Type:** operations — disaster recovery (site / HA-pair-loss tier).
2529
+
2530
+ **What:** a **right-sized DR box** that takes over when the **HA setup itself fails** — i.e. the primary
2531
+ *and* its active-passive partner are both gone (whole-site / shared-store loss, e.g. the production database
2532
+ goes down), not just a single engine-process crash. The DR server is intentionally **under-provisioned** — a
2533
+ small box, not a second full-size hot standby that mostly sits idle — so DR survivability doesn't require
2534
+ provisioning duplicate full-capacity hardware. On activation it brings up only a **prioritized subset** of
2535
+ connections — the **high-priority feeds** — and runs in a deliberately **degraded mode**, accepting reduced
2536
+ throughput/coverage as the cost of cheap DR.
2537
+
2538
+ **The three tiers (this item = tier 3):**
2539
+ 1. **Primary** — normal operation.
2540
+ 2. **Active-passive HA (shipped, v0.1)** — same-tier engine failover at *full* capacity; DB-tier HA delegated
2541
+ to the DBA. Handles a node failure, **not** loss of the whole HA pair/site.
2542
+ 3. **Third-tier DR (this item)** — a smaller box elsewhere that activates only when tier 2 is also gone, and
2543
+ runs *less* (high-priority feeds only), not more.
2544
+
2545
+ This is **not** active-active scale-out (dropped 2026-06-18, code removed) — DR here runs a *reduced* feed
2546
+ set on smaller hardware, the opposite of scale-out. It would **consume #60's backups** (or DB replication
2547
+ delegated to the DBA) to seed the DR store; #60 is the backup/restore mechanic, this is the
2548
+ **standby-takeover + degraded-operation** mechanic on top of it.
2549
+
2550
+ **New building block this needs — a per-connection priority tier.** For DR to "run only the high-priority
2551
+ feeds," each Connection needs a **priority / DR-tier** classification (e.g. `priority = critical|normal|low`
2552
+ or explicit `dr_profile` membership), layered as the same **global-default + per-connection-override** model
2553
+ used for FIFO, `RetryPolicy`, `BuildupThreshold`, per-connection retention (**#34**), and embedded-doc
2554
+ pruning (**#47**). Authored on the `ConnectionSpec` and/or as `connections.toml` keys (ADR 0007) so it stays
2555
+ hand-/GUI-editable. A **DR run-profile** is then "start only connections at tier ≥ X" — leaning on the
2556
+ per-connection start + startup fault-isolation path already built (ADR 0031). The priority signal is reusable
2557
+ beyond DR (load-shedding, ordered startup, alert severity).
2558
+
2559
+ **Open questions for the ADR:**
2560
+ - **How the DR box gets state** — DB replication to the DR site (delegated to the DBA, consistent with the
2561
+ declined "DB-tier backup/HA/restore" stance) vs. restore-from-#60-backups; the warm/cold choice sets RPO/RTO.
2562
+ The engine owns the feed-priority + selective-startup half, not the DB-replication half.
2563
+ - **Activation trigger & arbitration** — who declares the HA pair down and promotes DR (manual runbook vs.
2564
+ automated probe), and how split-brain is prevented so DR and a recovering primary don't both run the
2565
+ high-priority feeds.
2566
+ - **Degraded-mode partner behavior** — low-priority inbound feeds are *down* on DR; senders see a refused
2567
+ connection (their own resend/queue covers the gap) vs. an explicit maintenance NAK.
2568
+ - **Fail-back** — returning to the restored primary without losing or double-processing what DR handled (the
2569
+ at-least-once + idempotency invariants must hold across the handoff).
2570
+
2571
+ **Why P3 / owner-gated.** DR-beyond-HA is a recognized enterprise expectation and a Corepoint-parity gap (the
2572
+ gap analysis lists "standby failover/failback"), but it's a larger build touching deployment topology, the
2573
+ store-replication boundary (partly the DBA's), and a new priority-tier config surface — and it's not an open
2574
+ exposure on the shipping config. **Trigger:** an adopter requires site / HA-pair-loss DR on a budget (no
2575
+ second full hot standby) with a defined critical-feed set.
2576
+
2577
+ **Relation to siblings:** **#60** (backup/restore-verify — seeds the DR state), the shipped active-passive HA
2578
+ (tier 2), **#34** / **#47** (shared per-connection-override plumbing for the priority tier), **ADR 0031**
2579
+ (startup fault isolation — DR starts a *subset* of connections via the same path), **ADR 0007**
2580
+ (`connections.toml` for the GUI-editable priority key).
2581
+
2582
+ **Source:** owner request (2026-06-27) — "a disaster recovery option beyond HA: a third tier that takes over
2583
+ when the HA pair fails (e.g. the primary database goes down). A small, right-sized DR box — not a full-size
2584
+ server sitting unused — spins up and runs only the high-priority feeds."
2585
+
2586
+ ---
2587
+
2504
2588
  *Everything else from the 2026-06-10 full-codebase review (1 critical, 13 high, 33 medium, 31 low —
2505
2589
  78 findings) has been remediated; see the review report's §6 action order. The two items it still
2506
2590
  sourced — **#1 (SQL Server concurrency)** and **#2 (console off-thread)** — are now both **DONE**