messagefoundry 0.2.10__tar.gz → 0.2.11__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 (893) hide show
  1. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/ci.yml +126 -11
  2. messagefoundry-0.2.11/.github/workflows/manifest-lint.yml +114 -0
  3. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/release.yml +185 -0
  4. messagefoundry-0.2.11/.github/workflows/selfhosted-win2025-sql.yml +85 -0
  5. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/CHANGELOG.md +91 -0
  6. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/PKG-INFO +1 -1
  7. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docker/README.md +17 -6
  8. messagefoundry-0.2.11/docker/compose.yaml +201 -0
  9. messagefoundry-0.2.11/docker/k8s/ha-postgres.yaml +242 -0
  10. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docker/k8s/secret.example.yaml +12 -2
  11. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docker/k8s/statefulset.yaml +4 -2
  12. messagefoundry-0.2.11/docs/ANTIVIRUS-FIREWALL.md +219 -0
  13. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/BACKLOG.md +804 -65
  14. messagefoundry-0.2.11/docs/CLOUD-DEPLOYMENT.md +306 -0
  15. messagefoundry-0.2.11/docs/CLOUD-PHI-HIPAA.md +185 -0
  16. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/CONFIGURATION.md +3 -0
  17. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/CONTAINER-EXPOSURE-EVALUATION.md +5 -0
  18. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/DEPLOYMENT.md +24 -7
  19. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/FEATURE-MAP.md +2 -2
  20. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/PHI.md +1 -0
  21. messagefoundry-0.2.11/docs/POSITIONING.md +70 -0
  22. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/SERVICE.md +14 -0
  23. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/THROUGHPUT-IMPROVEMENTS.md +68 -15
  24. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0023-inbound-http-listener.md +1 -1
  25. messagefoundry-0.2.11/docs/adr/0032-console-desktop-launch.md +347 -0
  26. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0040-free-threaded-engine-support.md +9 -6
  27. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0044-operator-alert-state.md +1 -1
  28. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0045-custom-rbac-roles.md +1 -1
  29. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0046-message-content-search.md +1 -1
  30. messagefoundry-0.2.11/docs/adr/0047-cloud-kubernetes-ha-deployment-packaging.md +325 -0
  31. messagefoundry-0.2.11/docs/adr/0048-third-tier-disaster-recovery-standby.md +648 -0
  32. messagefoundry-0.2.11/docs/adr/0049-turnkey-dr-backup-restore-verify.md +525 -0
  33. messagefoundry-0.2.11/docs/adr/0050-single-project-root-config-anchoring.md +404 -0
  34. messagefoundry-0.2.11/docs/adr/0051-corepoint-throughput-parity-strategy.md +183 -0
  35. messagefoundry-0.2.11/docs/adr/0052-enterprise-scale-target.md +101 -0
  36. messagefoundry-0.2.11/docs/adr/0053-free-threaded-multicore-engine.md +249 -0
  37. messagefoundry-0.2.11/docs/adr/0054-low-allocation-builtins-hl7-parser.md +221 -0
  38. messagefoundry-0.2.11/docs/adr/0055-group-commit-durable-write.md +144 -0
  39. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/README.md +18 -10
  40. messagefoundry-0.2.11/docs/design/freethread-spike.md +177 -0
  41. messagefoundry-0.2.11/docs/releases/MULTISESSION-PLAN-6.md +258 -0
  42. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/research/cloud-deployment-research-2026-06.md +10 -4
  43. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/__init__.py +1 -1
  44. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/__main__.py +537 -17
  45. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/api/app.py +133 -11
  46. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/api/models.py +30 -2
  47. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/permissions.py +4 -2
  48. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/checks.py +35 -4
  49. messagefoundry-0.2.11/messagefoundry/config/anchor.py +169 -0
  50. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/connections_file.py +9 -0
  51. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/environments.py +20 -2
  52. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/models.py +25 -0
  53. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/settings.py +324 -1
  54. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/wiring.py +38 -3
  55. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/connections.py +9 -4
  56. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/theme.py +3 -1
  57. messagefoundry-0.2.11/messagefoundry/parsing/_backend.py +47 -0
  58. messagefoundry-0.2.11/messagefoundry/parsing/_builtin_hl7.py +687 -0
  59. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/message.py +91 -7
  60. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/peek.py +56 -5
  61. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/alert_sinks.py +6 -0
  62. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/alerts.py +15 -0
  63. messagefoundry-0.2.11/messagefoundry/pipeline/dr.py +459 -0
  64. messagefoundry-0.2.11/messagefoundry/pipeline/dr_backup.py +872 -0
  65. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/engine.py +193 -0
  66. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/wiring_runner.py +134 -2
  67. messagefoundry-0.2.11/messagefoundry/store/backup_codec.py +290 -0
  68. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/store/base.py +217 -1
  69. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/store/postgres.py +31 -1
  70. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/store/sqlserver.py +31 -0
  71. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/store/store.py +642 -241
  72. messagefoundry-0.2.11/packaging/console-installer/README.md +126 -0
  73. messagefoundry-0.2.11/packaging/console-installer/THIRD-PARTY-NOTICES.md +102 -0
  74. messagefoundry-0.2.11/packaging/console-installer/THIRD-PARTY-NOTICES.txt +131 -0
  75. messagefoundry-0.2.11/packaging/console-installer/console_launcher.py +31 -0
  76. messagefoundry-0.2.11/packaging/console-installer/licenses/GPL-3.0.txt +674 -0
  77. messagefoundry-0.2.11/packaging/console-installer/licenses/LGPL-3.0.txt +165 -0
  78. messagefoundry-0.2.11/packaging/console-installer/messagefoundry-console.iss +120 -0
  79. messagefoundry-0.2.11/packaging/console-installer/messagefoundry-console.spec +188 -0
  80. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/requirements.lock +19 -19
  81. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/security/crypto_inventory_check.py +9 -0
  82. messagefoundry-0.2.11/tests/test_backup_crypto.py +144 -0
  83. messagefoundry-0.2.11/tests/test_backup_restore_atleastonce.py +76 -0
  84. messagefoundry-0.2.11/tests/test_backup_runner.py +373 -0
  85. messagefoundry-0.2.11/tests/test_builtin_hl7_parity.py +620 -0
  86. messagefoundry-0.2.11/tests/test_cli_offline_resolution.py +250 -0
  87. messagefoundry-0.2.11/tests/test_config_anchoring.py +481 -0
  88. messagefoundry-0.2.11/tests/test_dr_activation.py +187 -0
  89. messagefoundry-0.2.11/tests/test_dr_api_status.py +94 -0
  90. messagefoundry-0.2.11/tests/test_dr_failback.py +114 -0
  91. messagefoundry-0.2.11/tests/test_dr_rbac.py +143 -0
  92. messagefoundry-0.2.11/tests/test_dr_run_profile.py +183 -0
  93. messagefoundry-0.2.11/tests/test_dr_seeding.py +216 -0
  94. messagefoundry-0.2.11/tests/test_frozen_launch_smoke.py +115 -0
  95. messagefoundry-0.2.11/tests/test_group_commit.py +625 -0
  96. messagefoundry-0.2.11/tests/test_license_notice.py +76 -0
  97. messagefoundry-0.2.11/tests/test_pool_warm.py +395 -0
  98. messagefoundry-0.2.11/tests/test_priority_resolution.py +128 -0
  99. messagefoundry-0.2.11/tests/test_release_console_installer.py +195 -0
  100. messagefoundry-0.2.11/tests/test_restore_verify.py +102 -0
  101. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_settings.py +115 -0
  102. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_supervisor.py +51 -0
  103. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/uv.lock +21 -21
  104. messagefoundry-0.2.10/docker/compose.yaml +0 -84
  105. messagefoundry-0.2.10/docs/adr/0032-console-desktop-launch.md +0 -86
  106. messagefoundry-0.2.10/docs/adr/0048-third-tier-disaster-recovery-standby.md +0 -216
  107. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.claude/settings.json +0 -0
  108. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.dockerignore +0 -0
  109. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.gitattributes +0 -0
  110. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/CODEOWNERS +0 -0
  111. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  112. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  113. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  114. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  115. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/SECURITY.md +0 -0
  116. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/dependabot.yml +0 -0
  117. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/benchmark.yml +0 -0
  118. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/cla.yml +0 -0
  119. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/codeql.yml +0 -0
  120. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/dependabot-auto-merge.yml +0 -0
  121. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/dependabot-lock-resync.yml +0 -0
  122. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/freethread-smoke.yml +0 -0
  123. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/release-sync-check.yml +0 -0
  124. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/scorecard.yml +0 -0
  125. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/security.yml +0 -0
  126. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/workflows/vuln-metrics.yml +0 -0
  127. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.github/zizmor.yml +0 -0
  128. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.gitignore +0 -0
  129. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.gitleaks.toml +0 -0
  130. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.mefor-hooks/pre-commit +0 -0
  131. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.pre-commit-config.yaml +0 -0
  132. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/.semgrep/messagefoundry.yml +0 -0
  133. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/CLA.md +0 -0
  134. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/CLAUDE.md +0 -0
  135. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/CODE_OF_CONDUCT.md +0 -0
  136. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/COMMERCIAL-LICENSE.md +0 -0
  137. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/CONTRIBUTING.md +0 -0
  138. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/GOVERNANCE.md +0 -0
  139. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/LICENSE +0 -0
  140. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/MAINTAINERS.md +0 -0
  141. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/NOTICE +0 -0
  142. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/README.md +0 -0
  143. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docker/Dockerfile +0 -0
  144. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docker/locks/requirements-core.lock +0 -0
  145. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docker/locks/requirements-sqlserver.lock +0 -0
  146. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docker/secrets.env.example +0 -0
  147. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docker/smoke/Dockerfile +0 -0
  148. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docker/smoke/config/IB_Test_ADT.py +0 -0
  149. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docker/smoke/send_adt.py +0 -0
  150. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/ADOPTER-CI.md +0 -0
  151. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/AI.md +0 -0
  152. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/ARCHITECTURE.md +0 -0
  153. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/CI-QUALITY.md +0 -0
  154. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/CLUSTERING.md +0 -0
  155. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/CODESETS.md +0 -0
  156. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/CONNECTIONS.md +0 -0
  157. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
  158. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
  159. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
  160. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/DEPLOY-SERVER-DB.md +0 -0
  161. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/DICOM.md +0 -0
  162. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/DUAL_LICENSING_PLAN.md +0 -0
  163. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
  164. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/HL7-VALIDATION.md +0 -0
  165. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/INSTALL-GUIDE.md +0 -0
  166. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/LOAD-TESTING.md +0 -0
  167. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/MENTAL-MODEL.md +0 -0
  168. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/MessageFoundry-Mental-Model.docx +0 -0
  169. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
  170. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/REMOTE-CONSOLE.md +0 -0
  171. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/SECURITY-REMEDIATION-LEDGER.md +0 -0
  172. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/SECURITY.md +0 -0
  173. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/SUPPORT-POLICY.md +0 -0
  174. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/SYSTEM-REQUIREMENTS.md +0 -0
  175. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/Secure_AI_Development_Standards.md +0 -0
  176. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/Secure_Development_Standards.md +0 -0
  177. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/TEE-RELAY.md +0 -0
  178. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/USER-GUIDE.md +0 -0
  179. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/WORKTREES.md +0 -0
  180. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0001-staged-pipeline-architecture.md +0 -0
  181. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
  182. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
  183. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
  184. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0005-transform-accessible-state.md +0 -0
  185. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0006-external-data-lookups.md +0 -0
  186. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
  187. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0008-cluster-observability-api.md +0 -0
  188. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0009-run-scoped-context-providers.md +0 -0
  189. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
  190. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0011-timer-scheduled-source.md +0 -0
  191. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0012-x12-edi-codec.md +0 -0
  192. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0013-increment-2-reingress-design.md +0 -0
  193. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0013-query-response-orchestration.md +0 -0
  194. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0014-alerting-rules-engine.md +0 -0
  195. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
  196. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
  197. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0017-consumer-deployment-model.md +0 -0
  198. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
  199. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
  200. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
  201. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
  202. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
  203. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
  204. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
  205. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0026-off-box-egress-update-check.md +0 -0
  206. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0027-per-connection-retention.md +0 -0
  207. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
  208. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0029-email-smtp-destination.md +0 -0
  209. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
  210. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
  211. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0033-gui-manageable-code-sets.md +0 -0
  212. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0034-static-analysis-triage-policy-accepted-risk-register.md +0 -0
  213. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0035-ide-extension-workspace-trust-and-scope.md +0 -0
  214. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0036-windows-config-source-trust.md +0 -0
  215. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0037-multi-process-sharding-l3.md +0 -0
  216. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0038-internal-pass-through-connector.md +0 -0
  217. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0039-database-tier-sharding-l5.md +0 -0
  218. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0041-load-path-attestation-and-change-attribution.md +0 -0
  219. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0042-embedded-document-pruning.md +0 -0
  220. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/0043-fhir-read-lookup.md +0 -0
  221. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/adr/TEMPLATE.md +0 -0
  222. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/architecture-components.png +0 -0
  223. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/architecture-components.svg +0 -0
  224. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/architecture-config-graph.png +0 -0
  225. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/architecture-config-graph.svg +0 -0
  226. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/architecture-diagram.md +0 -0
  227. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/architecture-message-flow.png +0 -0
  228. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/architecture-message-flow.svg +0 -0
  229. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/architecture-topology.png +0 -0
  230. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/architecture-topology.svg +0 -0
  231. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/benchmarks/TUNING-BASELINE.md +0 -0
  232. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
  233. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
  234. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
  235. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
  236. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
  237. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
  238. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/benchmarks/step-b-write-amplification.md +0 -0
  239. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/design/dbshard.md +0 -0
  240. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/design/freethread.md +0 -0
  241. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/design/multiproc.md +0 -0
  242. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/hl7-message-ordering-reference.md +0 -0
  243. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/message-ordering-design.md +0 -0
  244. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
  245. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
  246. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
  247. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
  248. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/MULTISESSION-PLAN-4.md +0 -0
  249. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/MULTISESSION-PLAN-5.md +0 -0
  250. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
  251. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/MULTISESSION-PLAN.md +0 -0
  252. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
  253. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
  254. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
  255. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/v0.1-PLAN.md +0 -0
  256. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
  257. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/research/config-ux-review.md +0 -0
  258. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/research/non-hl7-transform-components.md +0 -0
  259. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
  260. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
  261. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/ADVISORY-PROCESS.md +0 -0
  262. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
  263. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
  264. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
  265. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
  266. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
  267. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/ASVS-L3-STATUS.md +0 -0
  268. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
  269. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
  270. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
  271. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/BEYOND-ASVS-L3.md +0 -0
  272. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
  273. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/DEPENDENCY-METRICS.md +0 -0
  274. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
  275. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/PHASE-8C-RBAC.md +0 -0
  276. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/PUBLISHING.md +0 -0
  277. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/RCA-TEMPLATE.md +0 -0
  278. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/RELEASE-GATE.md +0 -0
  279. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/REMEDIATION-PLAN.md +0 -0
  280. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/REVIEW-2026-06-07.md +0 -0
  281. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
  282. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
  283. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/SECURITY-POSTURE.md +0 -0
  284. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
  285. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
  286. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
  287. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/security/THREAT-MODEL.md +0 -0
  288. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/testing/VERIFY.md +0 -0
  289. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
  290. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
  291. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
  292. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/environments/dev.toml +0 -0
  293. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/environments/prod.toml +0 -0
  294. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/README.md +0 -0
  295. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/__main__.py +0 -0
  296. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/acceptance/__init__.py +0 -0
  297. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/acceptance/__main__.py +0 -0
  298. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/acceptance/matrix.py +0 -0
  299. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/acceptance/probes.py +0 -0
  300. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/acceptance/report.py +0 -0
  301. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/acceptance/runner.py +0 -0
  302. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/compose.py +0 -0
  303. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/config/coverage.py +0 -0
  304. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/config/load/_shape.py +0 -0
  305. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/config/load/graph.py +0 -0
  306. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/config/passthrough/graph.py +0 -0
  307. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/config/store_once/graph.py +0 -0
  308. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/file_panel.py +0 -0
  309. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/file_transport.py +0 -0
  310. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/__init__.py +0 -0
  311. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/corpus.py +0 -0
  312. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/correlator.py +0 -0
  313. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/enginepoll.py +0 -0
  314. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/failover.py +0 -0
  315. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/failover_track.py +0 -0
  316. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/governor.py +0 -0
  317. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/ids.py +0 -0
  318. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/metrics.py +0 -0
  319. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profile.py +0 -0
  320. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/README.md +0 -0
  321. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/adt-fanout-stress.toml +0 -0
  322. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/closed-loop.toml +0 -0
  323. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/failover.toml +0 -0
  324. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/fanout-baseline.toml +0 -0
  325. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/malformed-load.toml +0 -0
  326. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/reference.toml +0 -0
  327. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/smoke-sqlserver.toml +0 -0
  328. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/smoke.toml +0 -0
  329. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/soak.toml +0 -0
  330. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/spike-burst.toml +0 -0
  331. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/sustained-overload.toml +0 -0
  332. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/profiles/writeamp.toml +0 -0
  333. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/report.py +0 -0
  334. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/runner.py +0 -0
  335. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/sender.py +0 -0
  336. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/load/sink.py +0 -0
  337. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/mllp.py +0 -0
  338. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/monitor.py +0 -0
  339. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/receive.py +0 -0
  340. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/reconcile/__init__.py +0 -0
  341. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/reconcile/__main__.py +0 -0
  342. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/reconcile/capture.py +0 -0
  343. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/reconcile/compare.py +0 -0
  344. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/reconcile/normalize.py +0 -0
  345. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/reconcile/report.py +0 -0
  346. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/scenarios.py +0 -0
  347. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/send.py +0 -0
  348. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/harness/window.py +0 -0
  349. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/.gitignore +0 -0
  350. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/.vscodeignore +0 -0
  351. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/README.md +0 -0
  352. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/esbuild.js +0 -0
  353. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/media/hl7schema.json +0 -0
  354. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/media/icon-amber.svg +0 -0
  355. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/media/icon.png +0 -0
  356. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/media/icon.svg +0 -0
  357. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/package-lock.json +0 -0
  358. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/package.json +0 -0
  359. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/snippets/messagefoundry.code-snippets +0 -0
  360. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/aiPolicy.ts +0 -0
  361. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/alertEditor.ts +0 -0
  362. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/auth.ts +0 -0
  363. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/chat.ts +0 -0
  364. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/cli.ts +0 -0
  365. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/codeSetEditor.ts +0 -0
  366. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/codesetsTree.ts +0 -0
  367. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/completion.ts +0 -0
  368. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/connectionEditor.ts +0 -0
  369. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/editorToolbar.ts +0 -0
  370. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/engineClient.ts +0 -0
  371. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/engineTarget.ts +0 -0
  372. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/extension.ts +0 -0
  373. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/generate.ts +0 -0
  374. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/git.ts +0 -0
  375. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/graphTree.ts +0 -0
  376. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/home.ts +0 -0
  377. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/insertElement.ts +0 -0
  378. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/newRoute.ts +0 -0
  379. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/promote.ts +0 -0
  380. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/promoteTarget.ts +0 -0
  381. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/sourceControl.ts +0 -0
  382. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/test/runTest.ts +0 -0
  383. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/test/suite/ai-policy.test.ts +0 -0
  384. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/test/suite/chat.test.ts +0 -0
  385. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/test/suite/editor-toolbar.test.ts +0 -0
  386. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/test/suite/engine-target.test.ts +0 -0
  387. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/test/suite/extension.test.ts +0 -0
  388. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/test/suite/index.ts +0 -0
  389. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/test/suite/insert-element.test.ts +0 -0
  390. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/test/suite/promote-target.test.ts +0 -0
  391. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/test/suite/pythonpath.test.ts +0 -0
  392. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/test/suite/settings-scope.test.ts +0 -0
  393. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/testBench.ts +0 -0
  394. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/src/validate.ts +0 -0
  395. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/tsconfig.json +0 -0
  396. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/ide/tsconfig.test.json +0 -0
  397. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/mefor.code-workspace +0 -0
  398. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/adr_analyze.py +0 -0
  399. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/anon/__init__.py +0 -0
  400. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/anon/_pools.py +0 -0
  401. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/anon/hl7.py +0 -0
  402. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/anon/keying.py +0 -0
  403. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/anon/leak.py +0 -0
  404. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/anon/rules.py +0 -0
  405. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/anon/surrogates.py +0 -0
  406. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/api/__init__.py +0 -0
  407. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/api/approvals.py +0 -0
  408. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/api/auth_models.py +0 -0
  409. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/api/auth_routes.py +0 -0
  410. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/api/field_authz.py +0 -0
  411. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/api/metrics.py +0 -0
  412. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/api/security.py +0 -0
  413. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/api/tls.py +0 -0
  414. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/__init__.py +0 -0
  415. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
  416. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/data/common_passwords.txt +0 -0
  417. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/identity.py +0 -0
  418. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/ldap.py +0 -0
  419. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/notifications.py +0 -0
  420. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/passwords.py +0 -0
  421. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/policy.py +0 -0
  422. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/ratelimit.py +0 -0
  423. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/service.py +0 -0
  424. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/tokens.py +0 -0
  425. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/auth/totp.py +0 -0
  426. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/__init__.py +0 -0
  427. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/active_environment.py +0 -0
  428. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/ai_policy.py +0 -0
  429. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/alerts_edit.py +0 -0
  430. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/code_sets.py +0 -0
  431. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/codeset_edit.py +0 -0
  432. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/connections_edit.py +0 -0
  433. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/db_lookup.py +0 -0
  434. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/fhir_lookup.py +0 -0
  435. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/fingerprint.py +0 -0
  436. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/ingest_time.py +0 -0
  437. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/reference.py +0 -0
  438. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/response.py +0 -0
  439. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/run_context.py +0 -0
  440. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/state.py +0 -0
  441. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/config/tls_policy.py +0 -0
  442. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/__init__.py +0 -0
  443. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/__main__.py +0 -0
  444. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/_async.py +0 -0
  445. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/alerts_page.py +0 -0
  446. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/change_password.py +0 -0
  447. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/client.py +0 -0
  448. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/dead_letters_page.py +0 -0
  449. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/delegates.py +0 -0
  450. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/event_log_page.py +0 -0
  451. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/icons/alerts.svg +0 -0
  452. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/icons/connections.svg +0 -0
  453. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/icons/dead-letters.svg +0 -0
  454. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/icons/engine-status.svg +0 -0
  455. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/icons/log-search.svg +0 -0
  456. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/icons/logo-lockup.svg +0 -0
  457. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/icons/users.svg +0 -0
  458. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/login.py +0 -0
  459. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/mfa.py +0 -0
  460. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/reauth.py +0 -0
  461. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/resources/README.md +0 -0
  462. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/resources/app.ico +0 -0
  463. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/resources/app.svg +0 -0
  464. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/search.py +0 -0
  465. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/service_control.py +0 -0
  466. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/sessions.py +0 -0
  467. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/shards.py +0 -0
  468. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/shell.py +0 -0
  469. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/status.py +0 -0
  470. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/users_page.py +0 -0
  471. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/console/widgets.py +0 -0
  472. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/README.md +0 -0
  473. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/__init__.py +0 -0
  474. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/_core.py +0 -0
  475. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/_hl7data.py +0 -0
  476. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/adt.py +0 -0
  477. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/all_types.py +0 -0
  478. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/bar.py +0 -0
  479. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/dft.py +0 -0
  480. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/documents.py +0 -0
  481. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/mdm.py +0 -0
  482. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/mfn.py +0 -0
  483. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/oml.py +0 -0
  484. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/orl.py +0 -0
  485. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/orm.py +0 -0
  486. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/oru.py +0 -0
  487. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/ras.py +0 -0
  488. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/rde.py +0 -0
  489. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/siu.py +0 -0
  490. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/generators/vxu.py +0 -0
  491. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/hl7schema.py +0 -0
  492. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/integrity.py +0 -0
  493. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/last_resort.py +0 -0
  494. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/logging_setup.py +0 -0
  495. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/__init__.py +0 -0
  496. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/binary.py +0 -0
  497. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/consistency.py +0 -0
  498. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/__init__.py +0 -0
  499. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/_deps.py +0 -0
  500. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/_util.py +0 -0
  501. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/dataset.py +0 -0
  502. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/errors.py +0 -0
  503. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
  504. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/peek.py +0 -0
  505. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/fhir/__init__.py +0 -0
  506. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/fhir/_deps.py +0 -0
  507. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/fhir/errors.py +0 -0
  508. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/fhir/peek.py +0 -0
  509. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/fhir/resource.py +0 -0
  510. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/groups.py +0 -0
  511. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/split.py +0 -0
  512. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/summary.py +0 -0
  513. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/tree.py +0 -0
  514. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/validate.py +0 -0
  515. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/__init__.py +0 -0
  516. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/_deps.py +0 -0
  517. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/delimiters.py +0 -0
  518. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/errors.py +0 -0
  519. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/interchange.py +0 -0
  520. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/message.py +0 -0
  521. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/peek.py +0 -0
  522. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/validate.py +0 -0
  523. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/xml/__init__.py +0 -0
  524. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/xml/_deps.py +0 -0
  525. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/xml/errors.py +0 -0
  526. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/xml/harden.py +0 -0
  527. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/xml/message.py +0 -0
  528. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/xml/schema.py +0 -0
  529. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/parsing/xml/signature.py +0 -0
  530. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/__init__.py +0 -0
  531. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/cert_expiry.py +0 -0
  532. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/cluster.py +0 -0
  533. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
  534. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/config_convergence.py +0 -0
  535. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/dryrun.py +0 -0
  536. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/leader_tasks.py +0 -0
  537. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/reference_sync.py +0 -0
  538. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/retention.py +0 -0
  539. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/security_notify.py +0 -0
  540. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/sharding.py +0 -0
  541. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/state_convergence.py +0 -0
  542. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/supervisor.py +0 -0
  543. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/pipeline/update_check.py +0 -0
  544. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/py.typed +0 -0
  545. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/redaction.py +0 -0
  546. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/scaffold.py +0 -0
  547. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/secrets_dpapi.py +0 -0
  548. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/store/__init__.py +0 -0
  549. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/store/audit_tee.py +0 -0
  550. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/store/content_search.py +0 -0
  551. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/store/crypto.py +0 -0
  552. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/store/document_strip.py +0 -0
  553. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/store/keyprovider.py +0 -0
  554. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/support/__init__.py +0 -0
  555. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/support/bundle.py +0 -0
  556. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/support/redact.py +0 -0
  557. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/timezone.py +0 -0
  558. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/__init__.py +0 -0
  559. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/base.py +0 -0
  560. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/database.py +0 -0
  561. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/dicom.py +0 -0
  562. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/dicomweb.py +0 -0
  563. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/email.py +0 -0
  564. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/fhir.py +0 -0
  565. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/file.py +0 -0
  566. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/framing.py +0 -0
  567. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/http_listener.py +0 -0
  568. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/loopback.py +0 -0
  569. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/mllp.py +0 -0
  570. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/passthrough.py +0 -0
  571. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/remotefile.py +0 -0
  572. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/rest.py +0 -0
  573. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/signing.py +0 -0
  574. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/smart.py +0 -0
  575. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/soap.py +0 -0
  576. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/tcp.py +0 -0
  577. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/timer.py +0 -0
  578. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/transports/x12.py +0 -0
  579. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/verify/__init__.py +0 -0
  580. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/verify/checks.py +0 -0
  581. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/verify/model.py +0 -0
  582. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/verify/report.py +0 -0
  583. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/verify/runner.py +0 -0
  584. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/messagefoundry/verify/smoke.py +0 -0
  585. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/packaging/messagefoundry-harness/README.md +0 -0
  586. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/packaging/messagefoundry-harness/pyproject.toml +0 -0
  587. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/pyproject.toml +0 -0
  588. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/config/IB_ACME_ADT.py +0 -0
  589. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/config/IB_FHIR_INTAKE.py +0 -0
  590. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
  591. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/config/IB_PARTNER_X12.py +0 -0
  592. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/config/IB_RADIOLOGY_SR.py +0 -0
  593. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
  594. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/config/adt.py +0 -0
  595. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/config/codesets/event_labels.csv +0 -0
  596. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/config/codesets/facility_mnemonics.toml +0 -0
  597. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/config/connections.toml +0 -0
  598. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/consistency/validated_adt.py +0 -0
  599. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/dicom/generate_sr_sample.py +0 -0
  600. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/adt_a01.hl7 +0 -0
  601. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/adt_batch.hl7 +0 -0
  602. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
  603. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/README.md +0 -0
  604. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
  605. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
  606. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
  607. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
  608. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
  609. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
  610. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
  611. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/messages/x12_270_eligibility.edi +0 -0
  612. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/results_relay/README.md +0 -0
  613. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/results_relay/codesets/test_codes.csv +0 -0
  614. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
  615. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/results_relay/messages/oru_results.hl7 +0 -0
  616. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/results_relay/results_relay.py +0 -0
  617. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/samples/send_mllp.py +0 -0
  618. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/console/install-console-shortcut.ps1 +0 -0
  619. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/console/pack_ico.py +0 -0
  620. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
  621. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/dev/postgres.ps1 +0 -0
  622. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/dev/sqlserver-docker.ps1 +0 -0
  623. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/dev/sqlserver.ps1 +0 -0
  624. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
  625. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/publish/check_release_sync.py +0 -0
  626. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/publish/publish-denylist.txt +0 -0
  627. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/publish/publish.ps1 +0 -0
  628. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/publish/scan_forbidden.py +0 -0
  629. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/security/vuln_metrics.py +0 -0
  630. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/service/import-db-ca.ps1 +0 -0
  631. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/service/install-service.ps1 +0 -0
  632. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/service/uninstall-service.ps1 +0 -0
  633. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/trace_icon.py +0 -0
  634. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/worktree/new.ps1 +0 -0
  635. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/worktree/remove.ps1 +0 -0
  636. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/worktree/session-context.ps1 +0 -0
  637. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/scripts/worktree/spawn.ps1 +0 -0
  638. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/__init__.py +0 -0
  639. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/__main__.py +0 -0
  640. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/anon/__init__.py +0 -0
  641. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/anon/_hl7data.py +0 -0
  642. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/anon/_pools.py +0 -0
  643. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/anon/hl7.py +0 -0
  644. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/anon/keying.py +0 -0
  645. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/anon/leak.py +0 -0
  646. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/anon/rules.py +0 -0
  647. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/anon/surrogates.py +0 -0
  648. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/compare.py +0 -0
  649. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/correlate.py +0 -0
  650. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/hl7_fields.py +0 -0
  651. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/mefor_api.py +0 -0
  652. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/mllp.py +0 -0
  653. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/relay.py +0 -0
  654. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/report.py +0 -0
  655. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tee/store.py +0 -0
  656. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/_dicom_sample.py +0 -0
  657. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/_failover_load_support.py +0 -0
  658. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/_fhir_fixtures.py +0 -0
  659. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/conftest.py +0 -0
  660. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_acceptance_framework.py +0 -0
  661. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_ack_capture_runner.py +0 -0
  662. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_ack_sent_store.py +0 -0
  663. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_active_environment.py +0 -0
  664. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_ad_group_scope.py +0 -0
  665. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_admin_new_ip.py +0 -0
  666. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_adr_analyze.py +0 -0
  667. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_ai_policy.py +0 -0
  668. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_alert_rules.py +0 -0
  669. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_alert_sinks.py +0 -0
  670. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_alert_state.py +0 -0
  671. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_alerts_edit.py +0 -0
  672. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_alerts_rules_api.py +0 -0
  673. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_anon_core.py +0 -0
  674. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_anon_integration.py +0 -0
  675. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_anon_parity.py +0 -0
  676. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_api.py +0 -0
  677. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_api_alerts.py +0 -0
  678. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_api_auth.py +0 -0
  679. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_api_reload.py +0 -0
  680. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_api_tls.py +0 -0
  681. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_approvals.py +0 -0
  682. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_asvs_phase0.py +0 -0
  683. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_audit_integrity.py +0 -0
  684. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_audit_offbox_tee.py +0 -0
  685. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_auth_core.py +0 -0
  686. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_auth_entry_hardening.py +0 -0
  687. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_auth_hardening.py +0 -0
  688. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_auth_service.py +0 -0
  689. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_auth_session_lifecycle.py +0 -0
  690. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_auth_store.py +0 -0
  691. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_binary_carriage.py +0 -0
  692. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_bootstrap_admin_perms.py +0 -0
  693. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_cert_expiry.py +0 -0
  694. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_channel_rbac.py +0 -0
  695. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_checks.py +0 -0
  696. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_checks_lint.py +0 -0
  697. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_cli.py +0 -0
  698. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_cluster.py +0 -0
  699. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_cluster_failover_postgres.py +0 -0
  700. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_cluster_failover_sqlserver.py +0 -0
  701. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_cluster_graph_gating.py +0 -0
  702. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_cluster_lease.py +0 -0
  703. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_code_sets.py +0 -0
  704. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_codeset_edit.py +0 -0
  705. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_config_fingerprint.py +0 -0
  706. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_config_source_trust.py +0 -0
  707. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_connection_api.py +0 -0
  708. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_connection_event_api.py +0 -0
  709. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_connection_event_emit.py +0 -0
  710. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_connection_event_outbound.py +0 -0
  711. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_connection_event_scope.py +0 -0
  712. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_connection_event_store.py +0 -0
  713. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_connection_resilience.py +0 -0
  714. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_connections_cli.py +0 -0
  715. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_connections_file.py +0 -0
  716. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_consistency.py +0 -0
  717. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_alerts.py +0 -0
  718. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_auth.py +0 -0
  719. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_client.py +0 -0
  720. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_dead_letters.py +0 -0
  721. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_event_log.py +0 -0
  722. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_hardening.py +0 -0
  723. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_icon.py +0 -0
  724. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_password.py +0 -0
  725. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_sessions.py +0 -0
  726. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_shards.py +0 -0
  727. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_status.py +0 -0
  728. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_step_up.py +0 -0
  729. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_theme.py +0 -0
  730. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_users.py +0 -0
  731. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_console_widgets.py +0 -0
  732. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_content_search.py +0 -0
  733. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_custom_roles.py +0 -0
  734. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_database_connector_integration.py +0 -0
  735. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_database_transport.py +0 -0
  736. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_db_lookup.py +0 -0
  737. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_db_lookup_live_runner.py +0 -0
  738. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_delivery_settings.py +0 -0
  739. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_dependabot_automerge_guardrails.py +0 -0
  740. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_dependency_boundaries.py +0 -0
  741. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_dicom_codec.py +0 -0
  742. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_dicom_scp.py +0 -0
  743. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_dicom_scp_security.py +0 -0
  744. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_dicom_scu.py +0 -0
  745. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_dicom_wiring.py +0 -0
  746. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_dicomweb.py +0 -0
  747. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_docs_runbooks.py +0 -0
  748. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_dryrun.py +0 -0
  749. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_dual_control_reload.py +0 -0
  750. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_ed_documents.py +0 -0
  751. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_ed_documents_e2e.py +0 -0
  752. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_egress_allowlist.py +0 -0
  753. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_email_destination.py +0 -0
  754. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_embedded_document_pruning.py +0 -0
  755. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_enginepoll_aggregate.py +0 -0
  756. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_environments.py +0 -0
  757. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_fhir_lookup.py +0 -0
  758. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_fhir_parsing.py +0 -0
  759. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_fhir_resource.py +0 -0
  760. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_fhir_transport.py +0 -0
  761. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_field_authz.py +0 -0
  762. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_field_authz_metadata.py +0 -0
  763. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_fifo_ordering.py +0 -0
  764. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_generate_cli.py +0 -0
  765. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_generated_adt.py +0 -0
  766. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_generators_core.py +0 -0
  767. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_generators_types.py +0 -0
  768. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_groups.py +0 -0
  769. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_harness.py +0 -0
  770. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_harness_compose.py +0 -0
  771. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_harness_config.py +0 -0
  772. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_harness_faults.py +0 -0
  773. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_harness_file.py +0 -0
  774. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_harness_monitor.py +0 -0
  775. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_harness_scenarios.py +0 -0
  776. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_hl7_core_features.py +0 -0
  777. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_hl7schema.py +0 -0
  778. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_inbound_bind.py +0 -0
  779. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_inbound_http_source.py +0 -0
  780. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_ingest_time.py +0 -0
  781. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_keyprovider.py +0 -0
  782. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_last_admin_guard.py +0 -0
  783. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_last_resort.py +0 -0
  784. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_leader_tasks.py +0 -0
  785. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_listener_tls_exposure.py +0 -0
  786. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_load_config.py +0 -0
  787. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_load_corpus.py +0 -0
  788. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_load_failover_postgres.py +0 -0
  789. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_load_failover_sqlserver.py +0 -0
  790. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_load_failover_unit.py +0 -0
  791. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_load_metrics.py +0 -0
  792. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_load_profile.py +0 -0
  793. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_load_report.py +0 -0
  794. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_load_runner.py +0 -0
  795. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_load_sender.py +0 -0
  796. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_load_sink.py +0 -0
  797. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_logging.py +0 -0
  798. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_message.py +0 -0
  799. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_message_split.py +0 -0
  800. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_message_timestamps.py +0 -0
  801. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_metrics_exporter.py +0 -0
  802. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_mfa.py +0 -0
  803. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_mllp_encoding_override.py +0 -0
  804. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_mllp_tls.py +0 -0
  805. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_nonhl7_ingress_size_cap.py +0 -0
  806. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_operability_config.py +0 -0
  807. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_outbound_signing.py +0 -0
  808. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_outbound_simulate.py +0 -0
  809. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_packaging.py +0 -0
  810. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_parse_tree.py +0 -0
  811. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_parsing.py +0 -0
  812. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_passthrough.py +0 -0
  813. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_passthrough_graph.py +0 -0
  814. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_payload_agnostic_ingress.py +0 -0
  815. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_per_connection_retention.py +0 -0
  816. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_postgres_store.py +0 -0
  817. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_reconcile_capture.py +0 -0
  818. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_reconcile_compare.py +0 -0
  819. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_reconcile_harness.py +0 -0
  820. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_redaction.py +0 -0
  821. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_reference_sets.py +0 -0
  822. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_reingress.py +0 -0
  823. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_remotefile_transport.py +0 -0
  824. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_response_capture.py +0 -0
  825. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_rest_transport.py +0 -0
  826. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_retention.py +0 -0
  827. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_run_context.py +0 -0
  828. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_scaffold.py +0 -0
  829. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_scaffold_requirements.py +0 -0
  830. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_scan_forbidden.py +0 -0
  831. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_secrets_dpapi.py +0 -0
  832. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_security_notify.py +0 -0
  833. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_security_static.py +0 -0
  834. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_service_control.py +0 -0
  835. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_sharding.py +0 -0
  836. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_sibling_helper_finder.py +0 -0
  837. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_smart_backend.py +0 -0
  838. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_soap_transport.py +0 -0
  839. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_soap_wssecurity.py +0 -0
  840. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_sqlserver_coordinator.py +0 -0
  841. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_sqlserver_cursor_close.py +0 -0
  842. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_sqlserver_schema_init.py +0 -0
  843. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_sqlserver_store.py +0 -0
  844. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_staged_pipeline.py +0 -0
  845. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_startup_attestation.py +0 -0
  846. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_startup_fault_isolation.py +0 -0
  847. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_stats_reset.py +0 -0
  848. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_step_up.py +0 -0
  849. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_store.py +0 -0
  850. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_store_backend.py +0 -0
  851. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_store_encryption.py +0 -0
  852. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_store_file_hardening.py +0 -0
  853. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_store_once_deliver_many.py +0 -0
  854. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_store_once_graph.py +0 -0
  855. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_store_read_pool.py +0 -0
  856. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_store_ssl.py +0 -0
  857. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_summary.py +0 -0
  858. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_support_bundle.py +0 -0
  859. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_task_resilience.py +0 -0
  860. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_tcp_transport.py +0 -0
  861. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_tee_cli.py +0 -0
  862. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_tee_compare.py +0 -0
  863. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_tee_correlate.py +0 -0
  864. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_tee_hl7_fields.py +0 -0
  865. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_tee_mefor_api.py +0 -0
  866. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_tee_mllp.py +0 -0
  867. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_tee_relay.py +0 -0
  868. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_tee_report.py +0 -0
  869. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_tee_store.py +0 -0
  870. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_timer_source.py +0 -0
  871. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_timezone.py +0 -0
  872. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_tls_policy.py +0 -0
  873. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_totp.py +0 -0
  874. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_totp_window.py +0 -0
  875. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_transform_offloop.py +0 -0
  876. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_transform_state.py +0 -0
  877. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_transports.py +0 -0
  878. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_update_check.py +0 -0
  879. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_verify.py +0 -0
  880. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_version.py +0 -0
  881. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_win2025_acceptance.py +0 -0
  882. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_wiring.py +0 -0
  883. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_wiring_engine.py +0 -0
  884. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_wiring_reload.py +0 -0
  885. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_wiring_serve.py +0 -0
  886. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_ws_stats_revalidation.py +0 -0
  887. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_x12_parsing.py +0 -0
  888. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_x12_rte.py +0 -0
  889. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_x12_source_ip_allowlist.py +0 -0
  890. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_x12_transport.py +0 -0
  891. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_x12_validate.py +0 -0
  892. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_xml_message.py +0 -0
  893. {messagefoundry-0.2.10 → messagefoundry-0.2.11}/tests/test_xml_schema_signature.py +0 -0
@@ -5,9 +5,27 @@ on:
5
5
  branches: [main]
6
6
  pull_request:
7
7
  workflow_dispatch:
8
+ schedule:
9
+ # Nightly (03:17 UTC — off the top-of-hour rush) run of the long load-smoke legs ONLY. These were
10
+ # previously run on EVERY push to main; main still gets the full functional `test` matrix + the
11
+ # server-DB suites per push, but the multi-minute load runs (serve an engine + drive a load profile,
12
+ # x2 for the SQL Server majors) now run once a night instead of once per commit.
13
+ # IMPORTANT: this cron must NOT drag the rest of the workflow along. Only `load-test` and
14
+ # `load-test-sqlserver` fire on `schedule` (their `if:` is `schedule || workflow_dispatch`). Every
15
+ # OTHER heavy job (test, ide, sqlserver-store, postgres-store, windows-service-smoke, docker-smoke)
16
+ # gates its push/dispatch arm as `push || workflow_dispatch` — deliberately EXCLUDING `schedule` —
17
+ # so the nightly run does not re-execute the full functional matrix + server-DB + 2x-Windows
18
+ # service smoke (which would COST more than the per-push load savings; the original `!= 'pull_request'`
19
+ # form would have swept them all into the cron). Trigger an on-demand load run with
20
+ # `gh workflow run ci.yml --ref main` (workflow_dispatch) — that DOES run everything, by design.
21
+ - cron: "17 3 * * *"
8
22
 
9
23
  concurrency:
10
- group: ci-${{ github.ref }}
24
+ # Per-ref group so a new push/PR-update supersedes its own in-flight run. The nightly `schedule` run
25
+ # gets a SEPARATE group (…-nightly): without this it would share `ci-refs/heads/main` with push-to-main
26
+ # and a routine daytime push would cancel-in-progress the in-flight nightly LOAD run — silently killing
27
+ # the very long-running coverage the cron exists to provide. Scheduled and push runs no longer collide.
28
+ group: ci-${{ github.ref }}${{ github.event_name == 'schedule' && '-nightly' || '' }}
11
29
  cancel-in-progress: true
12
30
 
13
31
  # Least privilege: every job here only reads the repo and runs tests/builds (no gh writes, no git push,
@@ -22,6 +40,12 @@ jobs:
22
40
  # version we ship on the OS we ship it on is worth the minutes.
23
41
  test:
24
42
  name: test (${{ matrix.os }}, py${{ matrix.python-version }})
43
+ # `needs: changes` for the docs-only short-circuit ONLY — this REQUIRED job still RUNS on every PR
44
+ # and ALWAYS reports its context. On a docs-only PR `changes.outputs.code == 'false'` and the
45
+ # expensive steps (install/lint/type/test) are skipped, so the leg goes green in seconds; the
46
+ # required `test (…, py3.14)` context stays present + green. (changes never fails, so this needs
47
+ # edge can't wedge the required context.)
48
+ needs: changes
25
49
  runs-on: ${{ matrix.os }}
26
50
  # Wall-clock backstop: bound each leg so a hung test fails in minutes, not the 6h default. Three
27
51
  # nested watchdogs catch a hang at increasing scope (#55): the pytest-timeout per-test cap (60s,
@@ -48,17 +72,32 @@ jobs:
48
72
  with:
49
73
  python-version: ${{ matrix.python-version }}
50
74
  cache: pip
51
- cache-dependency-path: pyproject.toml
75
+ # Key the pip cache on BOTH the project metadata and the resolved lockfile, so a dep bump (or a
76
+ # re-lock that only moves transitive pins) busts the cache and a no-op change reuses it. The
77
+ # install is `pip install -e ".[...]"` (reads pyproject); requirements.lock tracks the resolved
78
+ # graph CI actually exercises, so hashing it keeps the cache correct across re-locks.
79
+ cache-dependency-path: |
80
+ pyproject.toml
81
+ requirements.lock
82
+
83
+ # Everything below is gated on `code` (docs-only short-circuit) OR a push-to-main / on-demand run
84
+ # (full coverage). On a docs-only PR these steps no-op and the REQUIRED leg reports green in seconds.
85
+ # The job itself (and the Python/cache setup above) still runs, so the required context is always
86
+ # present. NB: the gate is duplicated per-step (a job-level `if` would SKIP the whole job and remove
87
+ # the required context) — keep the condition identical on each. The push/dispatch arm is written
88
+ # `push || workflow_dispatch` (NOT `!= 'pull_request'`) so the nightly `schedule` event does NOT
89
+ # re-run this full functional matrix — the cron is reserved for the long load legs only.
52
90
 
53
91
  # PySide6's offscreen platform plugin needs a few system libraries even
54
92
  # headless. Linux-only; Windows runners need no equivalent.
55
93
  - name: Install Qt offscreen system libraries
56
- if: runner.os == 'Linux'
94
+ if: (needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch') && runner.os == 'Linux'
57
95
  run: |
58
96
  sudo apt-get update
59
97
  sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libdbus-1-3
60
98
 
61
99
  - name: Install project (dev + console + fhir + dicom + x12 + xml extras)
100
+ if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
62
101
  run: |
63
102
  python -m pip install --upgrade pip
64
103
  # [fhir] so the FHIR typed-tier tests (incl. the PHI-no-leak invariant, ADR 0022) actually
@@ -71,12 +110,15 @@ jobs:
71
110
  pip install -e ".[dev,console,fhir,dicom,x12,xml]"
72
111
 
73
112
  - name: Lint (ruff)
113
+ if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
74
114
  run: ruff check messagefoundry tests
75
115
 
76
116
  - name: Format check (ruff)
117
+ if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
77
118
  run: ruff format --check .
78
119
 
79
120
  - name: Type-check (mypy, strict)
121
+ if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
80
122
  run: mypy messagefoundry
81
123
 
82
124
  # Step-level watchdog UNDER the 15-min job cap (#55): the windows-2022 leg intermittently
@@ -95,6 +137,7 @@ jobs:
95
137
  # The step `timeout-minutes: 13` is the outer backstop, well under the job's 15-min cap, so a
96
138
  # hang both watchdogs somehow miss still fails the STEP (not the whole job at the silent cap).
97
139
  - name: Tests (pytest)
140
+ if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
98
141
  timeout-minutes: 13
99
142
  env:
100
143
  QT_QPA_PLATFORM: offscreen
@@ -110,6 +153,13 @@ jobs:
110
153
  # deployment target.
111
154
  ide:
112
155
  name: ide build (${{ matrix.os }})
156
+ # `ide` is NOT a required check, so it may be SKIPPED at the job level on a docs-only PR (saves a
157
+ # Linux + a 2x-billed Windows leg every docs PR). It still runs on push-to-main / on-demand and on
158
+ # any code PR. ci-gate does NOT `needs: ide`, so a job-level skip here can't wedge any required
159
+ # context. The push/dispatch arm is `push || workflow_dispatch` (NOT `!= 'pull_request'`) so the
160
+ # nightly `schedule` event does NOT re-run the IDE build — the cron is reserved for the load legs.
161
+ needs: changes
162
+ if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
113
163
  runs-on: ${{ matrix.os }}
114
164
  strategy:
115
165
  fail-fast: false
@@ -155,18 +205,45 @@ jobs:
155
205
  outputs:
156
206
  serverdb: ${{ steps.f.outputs.serverdb }}
157
207
  docker: ${{ steps.f.outputs.docker }}
208
+ # `code` is the docs-only short-circuit signal: TRUE unless this PR touches ONLY non-code paths
209
+ # (Markdown / docs / licence / editorconfig / git metadata). It gates the EXPENSIVE STEPS of the
210
+ # required `test` legs (and the whole `ide` job) — the jobs still run + report their (required)
211
+ # context, but on a docs-only PR they skip install+lint+type+test and go green in seconds. TRUE on
212
+ # push-to-main / workflow_dispatch (full coverage); FALSE on the nightly `schedule` (load-legs-only
213
+ # cron — the functional matrix must not re-run nightly).
214
+ code: ${{ steps.f.outputs.code }}
158
215
  steps:
159
216
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
160
217
  with:
161
218
  fetch-depth: 0
162
219
  - id: f
220
+ # Hoist the two workflow expressions into env (zizmor: no `${{ }}` interpolated into the run body
221
+ # — a branch name / base sha is attacker-influenceable on a fork PR, so it must arrive as data).
222
+ env:
223
+ EVENT_NAME: ${{ github.event_name }}
224
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
163
225
  run: |
164
- if [ "${{ github.event_name }}" != "pull_request" ]; then
226
+ # Full coverage on a push-to-main or a manual dispatch: force every gate true so the whole
227
+ # workflow runs. The NIGHTLY `schedule` event is deliberately NOT here — on the cron only the
228
+ # two load legs should run, so `changes` reports code/serverdb/docker=FALSE and every job that
229
+ # ORs in one of these outputs (test steps, sqlserver-store, docker-smoke) stays skipped. This is
230
+ # the source-of-truth half of the "cron runs only the load legs" guard (the other half is each
231
+ # heavy job gating its push arm as `push || workflow_dispatch`, never `!= 'pull_request'`).
232
+ if [ "$EVENT_NAME" = "push" ] || [ "$EVENT_NAME" = "workflow_dispatch" ]; then
165
233
  echo "serverdb=true" >> "$GITHUB_OUTPUT"
166
234
  echo "docker=true" >> "$GITHUB_OUTPUT"
235
+ echo "code=true" >> "$GITHUB_OUTPUT"
167
236
  exit 0
168
237
  fi
169
- changed=$(git diff --name-only "${{ github.event.pull_request.base.sha }}...HEAD")
238
+ if [ "$EVENT_NAME" = "schedule" ]; then
239
+ # Nightly load-only run: nothing here should trigger the functional / container legs.
240
+ echo "serverdb=false" >> "$GITHUB_OUTPUT"
241
+ echo "docker=false" >> "$GITHUB_OUTPUT"
242
+ echo "code=false" >> "$GITHUB_OUTPUT"
243
+ exit 0
244
+ fi
245
+ # Remaining case: pull_request. Compute the path-based filters from the PR diff.
246
+ changed=$(git diff --name-only "$BASE_SHA...HEAD")
170
247
  if echo "$changed" | grep -qE '^(messagefoundry/store/|messagefoundry/pipeline/cluster|messagefoundry/transports/database|tests/test_(sqlserver|postgres|cluster|database_connector)|\.github/workflows/ci\.yml)'; then
171
248
  echo "serverdb=true" >> "$GITHUB_OUTPUT"
172
249
  else
@@ -179,6 +256,26 @@ jobs:
179
256
  else
180
257
  echo "docker=false" >> "$GITHUB_OUTPUT"
181
258
  fi
259
+ # `code`: CONSERVATIVE docs-only detector. Default to running everything (code=true), and only
260
+ # short-circuit when EVERY changed path matches the docs/non-code allowlist below. We compute it
261
+ # by inverting: list the files that are NOT docs-only; if that list is empty (and the diff is
262
+ # non-empty), it's a docs-only PR. Anything outside the allowlist — any *.py, ide/**, config,
263
+ # lockfiles, OTHER workflows, scripts, samples, harness — counts as CODE and runs the full suite.
264
+ # A path appears in `changed` even if only deleted/renamed, so a pure doc rename still short-
265
+ # circuits, and a code deletion still runs.
266
+ # Allowlisted (docs-only) paths: any *.md anywhere, docs/**, top-level LICENSE/NOTICE/AUTHORS,
267
+ # .editorconfig, .gitignore/.gitattributes, .github/{ISSUE_TEMPLATE,PULL_REQUEST_TEMPLATE,...}.md.
268
+ # Be conservative: when in doubt a path is CODE. Empty diff (shouldn't happen on a PR) => code=true.
269
+ noncode='(\.md$|^docs/|^LICENSE$|^NOTICE$|^AUTHORS$|^\.editorconfig$|^\.gitignore$|^\.gitattributes$|^\.github/(ISSUE_TEMPLATE/|PULL_REQUEST_TEMPLATE))'
270
+ if [ -z "$changed" ]; then
271
+ echo "code=true" >> "$GITHUB_OUTPUT"
272
+ elif echo "$changed" | grep -qvE "$noncode"; then
273
+ # At least one changed path is NOT docs-only -> run the full suite.
274
+ echo "code=true" >> "$GITHUB_OUTPUT"
275
+ else
276
+ # Every changed path is docs-only -> short-circuit the expensive steps.
277
+ echo "code=false" >> "$GITHUB_OUTPUT"
278
+ fi
182
279
 
183
280
  # SQL Server service-container leg: runs the gated suites that need a real SQL Server (Linux, so 1x
184
281
  # minutes) — the PRODUCTION store backend suite AND the PRODUCTION DATABASE connector round-trip
@@ -190,7 +287,10 @@ jobs:
190
287
  sqlserver-store:
191
288
  name: sql server (store + connector) ${{ matrix.label }}
192
289
  needs: changes
193
- if: github.event_name != 'pull_request' || needs.changes.outputs.serverdb == 'true'
290
+ # push-to-main / on-demand (full coverage), or a PR that touches the server-DB surface. NOT on the
291
+ # nightly `schedule` (the cron is reserved for the load legs only) — so written `push ||
292
+ # workflow_dispatch`, not `!= 'pull_request'`, which would have swept this container leg into the cron.
293
+ if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changes.outputs.serverdb == 'true'
194
294
  runs-on: ubuntu-latest
195
295
  # Matrix the gated suite across every supported SQL Server major (2022 = 16.x, 2025 = 17.x) so a
196
296
  # version-specific T-SQL / engine regression can't merge. fail-fast: false keeps a 2025-only hiccup
@@ -338,7 +438,9 @@ jobs:
338
438
  # LOCKED + advisory-lock concurrency the SQLite tests can't reach.
339
439
  postgres-store:
340
440
  name: postgres store
341
- if: github.event_name != 'pull_request'
441
+ # push-to-main + on-demand only (NOT the nightly `schedule`, which is reserved for the load legs —
442
+ # `push || workflow_dispatch`, not `!= 'pull_request'`, keeps this container leg out of the cron).
443
+ if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
342
444
  runs-on: ubuntu-latest
343
445
  services:
344
446
  postgres:
@@ -411,7 +513,11 @@ jobs:
411
513
  # docs/LOAD-TESTING.md.
412
514
  load-test:
413
515
  name: load test (smoke, sqlite)
414
- if: github.event_name != 'pull_request'
516
+ # Nightly schedule + on-demand only (was: every push to main). The PR gate is the in-process
517
+ # tests/test_load_runner.py in the `test` job; push-to-main keeps full functional + server-DB
518
+ # coverage. This multi-minute serve+load run no longer fires once per commit. NOT a required check,
519
+ # so dropping it from push is safe; ci-gate `needs` it but counts a `skipped` leg as a pass.
520
+ if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
415
521
  runs-on: ubuntu-latest
416
522
  steps:
417
523
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
@@ -467,7 +573,10 @@ jobs:
467
573
  # runs on push to main + on-demand (workflow_dispatch). Heavier SQL Server profiles run manually.
468
574
  load-test-sqlserver:
469
575
  name: load test (smoke, sqlserver) ${{ matrix.label }}
470
- if: github.event_name != 'pull_request'
576
+ # Nightly schedule + on-demand only (was: every push to main); same rationale as `load-test`. The
577
+ # end-to-end SQL Server store path is still smoked nightly (x2 majors) + on demand, and the per-push
578
+ # SQL Server functional coverage stays in `sqlserver-store`. NOT required; ci-gate treats skip as pass.
579
+ if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
471
580
  runs-on: ubuntu-latest
472
581
  # Smoke the end-to-end SQL Server store path on every supported major (2022/2025). Push/dispatch-only,
473
582
  # so no PR cost; fail-fast: false keeps the two legs independent.
@@ -567,7 +676,10 @@ jobs:
567
676
  # minutes; runs on push to main and on-demand (workflow_dispatch).
568
677
  windows-service-smoke:
569
678
  name: windows service smoke (${{ matrix.os }}, py${{ matrix.python-version }})
570
- if: github.event_name != 'pull_request'
679
+ # push-to-main + on-demand only (2x-billed Windows legs). NOT on the nightly `schedule` — the cron
680
+ # is reserved for the load legs, so this is `push || workflow_dispatch`, not `!= 'pull_request'`
681
+ # (which would have run these 2x-Windows legs every night for no added signal).
682
+ if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
571
683
  runs-on: ${{ matrix.os }}
572
684
  strategy:
573
685
  fail-fast: false
@@ -733,7 +845,10 @@ jobs:
733
845
  docker-smoke:
734
846
  name: docker image smoke (slim, linux)
735
847
  needs: changes
736
- if: github.event_name != 'pull_request' || needs.changes.outputs.docker == 'true'
848
+ # push-to-main / on-demand (full coverage), or a PR that touches the image/locks/packaging. NOT on
849
+ # the nightly `schedule` (reserved for the load legs) — `push || workflow_dispatch`, not
850
+ # `!= 'pull_request'`, keeps the image build out of the cron.
851
+ if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changes.outputs.docker == 'true'
737
852
  runs-on: ubuntu-latest
738
853
  steps:
739
854
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
@@ -0,0 +1,114 @@
1
+ # Kubernetes manifest schema + policy lint (ADR 0047 AC-4 / AC-5).
2
+ #
3
+ # Validates the docker/k8s/*.yaml manifests against the upstream Kubernetes JSON schemas (kubeconform)
4
+ # and asserts a few ADR-0047 HA-policy invariants on the multi-replica reference manifest, so the
5
+ # manifests cannot silently drift from the engine's validators / the documented HA shape.
6
+ #
7
+ # GATED SENSIBLY — additive, NOT a required check:
8
+ # * It runs ONLY when a manifest, this workflow, or the docker/ docs change (paths filter), so docs/code
9
+ # PRs that don't touch manifests skip it entirely.
10
+ # * It is a SEPARATE workflow, deliberately not part of ci.yml's required `ci-gate`. The required set
11
+ # stays: the `test` matrix + bandit + pip-audit + cla (see docs/.. main required-checks). Do NOT add
12
+ # "manifest lint" to branch-protection required checks unless the owner decides to promote it.
13
+ # * It is fast + dependency-light (a single static binary + grep assertions), so it is cheap to run.
14
+
15
+ name: manifest lint
16
+
17
+ on:
18
+ push:
19
+ branches: [main]
20
+ paths:
21
+ - "docker/k8s/**.yaml"
22
+ - "docker/README.md"
23
+ - ".github/workflows/manifest-lint.yml"
24
+ pull_request:
25
+ paths:
26
+ - "docker/k8s/**.yaml"
27
+ - "docker/README.md"
28
+ - ".github/workflows/manifest-lint.yml"
29
+ workflow_dispatch:
30
+
31
+ concurrency:
32
+ group: manifest-lint-${{ github.ref }}
33
+ cancel-in-progress: true
34
+
35
+ permissions:
36
+ contents: read
37
+
38
+ jobs:
39
+ kubeconform:
40
+ name: kubeconform + HA policy lint
41
+ runs-on: ubuntu-latest
42
+ timeout-minutes: 10
43
+ steps:
44
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
45
+ with:
46
+ persist-credentials: false # read-only lint job; don't persist the token (zizmor: artipacked)
47
+
48
+ # kubeconform = a fast, offline-capable schema validator for Kubernetes manifests. Pin the release
49
+ # by VERSION, then verify the downloaded tarball against the checksum the release itself publishes
50
+ # (CHECKSUMS file) — reproducible + tamper-evident without hardcoding a hash that would silently
51
+ # break on a version bump. Bump KUBECONFORM_VERSION deliberately.
52
+ - name: Install kubeconform
53
+ env:
54
+ KUBECONFORM_VERSION: "0.6.7"
55
+ run: |
56
+ set -euo pipefail
57
+ base="https://github.com/yannh/kubeconform/releases/download/v${KUBECONFORM_VERSION}"
58
+ # Keep the tarball's canonical name so the CHECKSUMS line ("<sha256> kubeconform-linux-amd64.tar.gz")
59
+ # refers to a file that actually exists in cwd — sha256sum -c verifies by the name in the line.
60
+ curl -fsSL "${base}/kubeconform-linux-amd64.tar.gz" -o kubeconform-linux-amd64.tar.gz
61
+ curl -fsSL "${base}/CHECKSUMS" -o CHECKSUMS
62
+ grep ' kubeconform-linux-amd64.tar.gz$' CHECKSUMS | sha256sum -c -
63
+ tar -xzf kubeconform-linux-amd64.tar.gz kubeconform
64
+ sudo install -m 0755 kubeconform /usr/local/bin/kubeconform
65
+ kubeconform -v
66
+
67
+ # Schema-validate every manifest. -strict rejects unknown fields (catches typos);
68
+ # -summary prints a per-file pass/fail roll-up. The Deployment/StatefulSet/Service/PDB kinds are all
69
+ # in the bundled upstream schemas, so no extra schema location is needed.
70
+ - name: Validate docker/k8s manifests (kubeconform -strict)
71
+ run: |
72
+ set -euo pipefail
73
+ kubeconform -strict -summary -verbose \
74
+ docker/k8s/statefulset.yaml \
75
+ docker/k8s/ha-postgres.yaml
76
+
77
+ # ADR-0047 HA-policy assertions on the multi-replica reference manifest. These are the artifact
78
+ # locks for AC-4 (PDB maxUnavailable:1 + grace > lease TTL) and AC-5 (no HPA, no L7 ingress for
79
+ # MLLP). Lightweight grep checks — they guard against the manifest drifting away from the decision.
80
+ - name: HA policy lint (ADR 0047 AC-4 / AC-5)
81
+ run: |
82
+ set -euo pipefail
83
+ M=docker/k8s/ha-postgres.yaml
84
+ fail=0
85
+ assert_present() { # $1 = regex, $2 = message
86
+ if ! grep -Eq "$1" "$M"; then echo "FAIL: $2 (expected /$1/ in $M)"; fail=1; fi
87
+ }
88
+ assert_absent() { # $1 = regex, $2 = message (ignores commented lines)
89
+ if grep -Ev '^\s*#' "$M" | grep -Eq "$1"; then echo "FAIL: $2 (unexpected /$1/ in $M)"; fail=1; fi
90
+ }
91
+
92
+ assert_present 'replicas:\s*3' "multi-replica HA must declare replicas: 3"
93
+ assert_present 'kind:\s*PodDisruptionBudget' "must ship a PodDisruptionBudget"
94
+ assert_present 'maxUnavailable:\s*1' "PDB must set maxUnavailable: 1 (AC-4)"
95
+ assert_present 'terminationGracePeriodSeconds:\s*[0-9]+' "must set terminationGracePeriodSeconds (> lease TTL, AC-4)"
96
+ assert_present 'MEFOR_CLUSTER_ENABLED' "must enable [cluster] (HA leader election)"
97
+ assert_present 'MEFOR_STORE_BACKEND' "must set a server-DB backend (SQLite is refused under [cluster])"
98
+
99
+ # AC-5 prohibitions: no HPA object, and no L7/HTTP Ingress for MLLP. An UNcommented occurrence fails.
100
+ assert_absent 'kind:\s*HorizontalPodAutoscaler' "no HPA for MLLP (active-passive; FIFO/single-writer) — AC-5"
101
+ assert_absent 'kind:\s*Ingress' "no L7/HTTP Ingress for the MLLP data plane — AC-5"
102
+
103
+ # terminationGracePeriodSeconds must exceed the default leader_lease_ttl (30s) — a numeric check.
104
+ grace=$(grep -Eo 'terminationGracePeriodSeconds:\s*[0-9]+' "$M" | grep -Eo '[0-9]+' | head -1)
105
+ if [ "${grace:-0}" -le 30 ]; then
106
+ echo "FAIL: terminationGracePeriodSeconds=$grace must be > leader_lease_ttl_seconds (30s default) — AC-4"
107
+ fail=1
108
+ fi
109
+
110
+ if [ "$fail" -ne 0 ]; then
111
+ echo "::error::ADR-0047 HA policy lint failed — see FAIL lines above"
112
+ exit 1
113
+ fi
114
+ echo "ADR-0047 HA policy lint: OK"
@@ -244,3 +244,188 @@ jobs:
244
244
  packages-dir: harness-dist/
245
245
  skip-existing: true
246
246
  attestations: true
247
+
248
+ release-console-installer:
249
+ # Build the FOURTH distribution artifact — the frozen, zero-Python Windows admin-console installer
250
+ # (PyInstaller --onedir + Inno Setup, OPTIONALLY Authenticode-signed). ADR 0032 Phase B, BACKLOG #39.
251
+ #
252
+ # This is a job INSIDE release.yml (not a separate workflow) with `needs: release`, mirroring
253
+ # `release-harness`: the engine ships first and `gh release create` (in the `release` job) has run, so
254
+ # the GitHub release provably EXISTS before this job's `gh release upload` attaches the installer to it
255
+ # (a separate workflow on the same tag would race release creation). A failure here is ISOLATED — it
256
+ # never reds the engine wheel/PyPI flow (that all completes in `release` before this starts).
257
+ #
258
+ # The ~150 MB Windows freeze runs only on a tag push (uploads the installer as a release asset) and on
259
+ # workflow_dispatch (builds it as an inspectable artifact, no upload) — NEVER on a PR. The console is
260
+ # frozen from the SAME wheel the `release` job built + smoke-checked (downloaded via the
261
+ # release-artifacts upload), so the frozen console and the PyPI wheel are byte-identical packaging —
262
+ # a source-vs-wheel resource bug can't slip through.
263
+ #
264
+ # Signing is CONDITIONAL: if WINDOWS_SIGN_CERT_BASE64 is present the exe + installer are signed; if not,
265
+ # the leg STILL produces an UNSIGNED installer and does NOT fail (the owner provisions the cert later —
266
+ # ADR 0032 §(c)). Reproducibility: PyInstaller comes from the locked deps; ISCC (Inno Setup) is pinned;
267
+ # signtool (Windows SDK) is the runner-provided external the ADR flags as a residual.
268
+ needs: release
269
+ runs-on: windows-2025 # x64 Windows; the Windows SDK (signtool) + choco are preinstalled
270
+ permissions:
271
+ contents: write # `gh release upload` attaches the installer to the tag's release (tag runs only)
272
+ # Map the signing-cert secret to a job-level boolean env ONCE, then gate the sign step on `env`.
273
+ # The `secrets` context is allowed in a job-level `env:` expression but NOT in a step-level `if:`
274
+ # (the linter/runtime reject `if: secrets.X != ''`), so this is the canonical lint-clean gate:
275
+ # "false" until WINDOWS_SIGN_CERT_BASE64 is provisioned -> the sign step skips, build stays green.
276
+ env:
277
+ SIGN_CONFIGURED: ${{ secrets.WINDOWS_SIGN_CERT_BASE64 != '' }}
278
+ # Pinned Inno Setup version (Chocolatey package `innosetup`). Bump deliberately; keep the installer
279
+ # reproducible alongside the wheel (ADR 0032 §(d) reproducibility hole).
280
+ INNO_SETUP_VERSION: "6.3.3"
281
+ defaults:
282
+ run:
283
+ shell: pwsh
284
+ steps:
285
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
286
+ with:
287
+ persist-credentials: false # gh upload uses GH_TOKEN env, never the persisted git credential
288
+
289
+ - name: Set up Python
290
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
291
+ with:
292
+ python-version: "3.14"
293
+
294
+ - name: Resolve the single-sourced version (messagefoundry.__version__)
295
+ id: ver
296
+ run: |
297
+ # The installer AppVersion is single-sourced from messagefoundry/__init__.py __version__ — never
298
+ # hard-coded in the .iss. Read it WITHOUT importing the package (no deps installed yet) so this
299
+ # step is cheap and import-error-proof: parse the literal from the module file.
300
+ $line = Select-String -Path messagefoundry/__init__.py -Pattern '^__version__\s*=\s*"([^"]+)"' | Select-Object -First 1
301
+ if (-not $line) { throw "could not read __version__ from messagefoundry/__init__.py" }
302
+ $version = $line.Matches[0].Groups[1].Value
303
+ Write-Host "version: $version"
304
+ # On a tag push, the built installer version MUST equal the tag (single-source check, mirrors
305
+ # the wheel smoke in the release job).
306
+ if ($env:GITHUB_REF_TYPE -eq 'tag') {
307
+ $want = $env:GITHUB_REF_NAME.TrimStart('v')
308
+ if ($version -ne $want) { throw "::error::__version__ $version != tag $want" }
309
+ }
310
+ "version=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
311
+
312
+ # Pull the wheel the `release` job built + smoke-checked (release-artifacts, uploaded on always()).
313
+ # Freezing from the SAME wheel that ships to PyPI (not the source tree) keeps the frozen console and
314
+ # the published wheel byte-identical packaging — ADR 0032 §(d) "install … from the just-built wheel".
315
+ - name: Download the just-built wheel (from the release job)
316
+ uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
317
+ with:
318
+ name: release-artifacts
319
+ path: release-artifacts
320
+
321
+ - name: Install the console (+ PyInstaller) from the just-built wheel
322
+ run: |
323
+ python -m pip install --upgrade pip
324
+ # Install the engine wheel with its [console] extra (PySide6 pinned 6.11.1 in requirements.lock,
325
+ # keyring, httpx, truststore), then PyInstaller for the freeze. Installing the package itself
326
+ # makes `messagefoundry.console` importable to PyInstaller's analysis. Resolve the wheel the
327
+ # release job staged under release-artifacts/dist/.
328
+ $wheel = Get-ChildItem release-artifacts -Recurse -Filter "messagefoundry-*.whl" | Select-Object -First 1
329
+ if (-not $wheel) { throw "no messagefoundry wheel found in the release-artifacts download" }
330
+ Write-Host "freezing from wheel: $($wheel.FullName)"
331
+ pip install "$($wheel.FullName)[console]" pyinstaller
332
+
333
+ - name: Freeze the console (PyInstaller --onedir, windowed)
334
+ run: |
335
+ pyinstaller --noconfirm --clean packaging/console-installer/messagefoundry-console.spec
336
+ if (-not (Test-Path "dist/messagefoundry-console/messagefoundry-console.exe")) {
337
+ throw "PyInstaller did not produce dist/messagefoundry-console/messagefoundry-console.exe"
338
+ }
339
+ Get-ChildItem dist/messagefoundry-console | Select-Object -First 20 Name, Length
340
+
341
+ # Exercise the ACTUAL frozen exe (AC-B4 offline-launch + AC-B5 bundled-icon/nav-asset). These tests
342
+ # skip everywhere the freeze is absent, so they run only here, pointed at the bundle dir.
343
+ # -p no:cacheprovider keeps the runner workspace clean; the smoke launches Qt windowed (offscreen)
344
+ # so no display is needed.
345
+ - name: Frozen-exe launch smoke (AC-B4 / AC-B5)
346
+ env:
347
+ MEFOR_FROZEN_CONSOLE_DIR: dist/messagefoundry-console
348
+ QT_QPA_PLATFORM: offscreen
349
+ run: |
350
+ pip install pytest
351
+ python -m pytest tests/test_frozen_launch_smoke.py -v -p no:cacheprovider
352
+
353
+ - name: Install Inno Setup (pinned)
354
+ run: |
355
+ choco install innosetup --version=$env:INNO_SETUP_VERSION --no-progress -y
356
+ # ISCC.exe is not on PATH after a choco install; resolve + export it for the next step.
357
+ $iscc = "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe"
358
+ if (-not (Test-Path $iscc)) { throw "ISCC.exe not found at $iscc after choco install" }
359
+ "ISCC=$iscc" | Out-File -FilePath $env:GITHUB_ENV -Append
360
+
361
+ - name: Build the installer (ISCC, AppVersion injected)
362
+ # Pass the resolved version through the step env (NOT a ${{ }} expansion inside the run script) so
363
+ # the value can never be interpolated into the shell — zizmor template-injection hardening.
364
+ env:
365
+ APP_VERSION: ${{ steps.ver.outputs.version }}
366
+ run: |
367
+ & "$env:ISCC" "/DAppVersion=$env:APP_VERSION" packaging/console-installer/messagefoundry-console.iss
368
+ $setup = "dist/messagefoundry-console-setup-$env:APP_VERSION.exe"
369
+ if (-not (Test-Path $setup)) { throw "Inno Setup did not produce $setup" }
370
+ "SETUP_EXE=$setup" | Out-File -FilePath $env:GITHUB_ENV -Append
371
+
372
+ # Authenticode signing — CONDITIONAL on the cert secret. If WINDOWS_SIGN_CERT_BASE64 is absent the
373
+ # whole step is skipped (the `if:` is false), so the build NEVER fails for lack of a cert; the
374
+ # installer simply ships UNSIGNED until the owner provisions one (ADR 0032 §(c), AC-B3). The cert
375
+ # lives ONLY in CI secrets and is written to a temp file that is deleted in the same step — it
376
+ # never touches the workspace. Pure CI tooling (signtool) — NO Python crypto import, so the ASVS
377
+ # 11.1.3 crypto-inventory gate is not tripped.
378
+ - name: Authenticode-sign the exe + installer (if a cert secret is configured)
379
+ if: ${{ env.SIGN_CONFIGURED == 'true' }}
380
+ env:
381
+ SIGN_CERT_B64: ${{ secrets.WINDOWS_SIGN_CERT_BASE64 }}
382
+ SIGN_CERT_PASSWORD: ${{ secrets.WINDOWS_SIGN_CERT_PASSWORD }}
383
+ run: |
384
+ # signtool ships with the Windows SDK on the windows-2025 image; resolve the newest one by SDK
385
+ # build number (sort the numeric version dir, not the lexical path, so 10.0.26100 > 10.0.9999).
386
+ $signtool = Get-ChildItem "${env:ProgramFiles(x86)}\Windows Kits\10\bin\*\x64\signtool.exe" |
387
+ Sort-Object { [version]($_.Directory.Parent.Name) } | Select-Object -Last 1
388
+ if (-not $signtool) { throw "signtool.exe not found (Windows SDK missing on the runner)" }
389
+ Write-Host "using signtool: $($signtool.FullName)"
390
+ $pfx = Join-Path $env:RUNNER_TEMP "codesign.pfx"
391
+ try {
392
+ [IO.File]::WriteAllBytes($pfx, [Convert]::FromBase64String($env:SIGN_CERT_B64))
393
+ # $signArgs, not $args ($args is a PowerShell automatic variable — avoid the collision).
394
+ $signArgs = @('sign', '/f', $pfx, '/fd', 'SHA256',
395
+ '/tr', 'http://timestamp.digicert.com', '/td', 'SHA256')
396
+ if ($env:SIGN_CERT_PASSWORD) { $signArgs += @('/p', $env:SIGN_CERT_PASSWORD) }
397
+ # Sign the inner frozen exe first, then the installer that wraps it.
398
+ & $signtool.FullName @signArgs "dist/messagefoundry-console/messagefoundry-console.exe"
399
+ if ($LASTEXITCODE -ne 0) { throw "signtool failed on the frozen exe" }
400
+ & $signtool.FullName @signArgs "$env:SETUP_EXE"
401
+ if ($LASTEXITCODE -ne 0) { throw "signtool failed on the installer" }
402
+ Write-Host "Signed the frozen exe + installer (timestamped)."
403
+ } finally {
404
+ if (Test-Path $pfx) { Remove-Item $pfx -Force } # never leave the cert on disk
405
+ }
406
+
407
+ - name: Note signing status
408
+ run: |
409
+ if ($env:SIGN_CONFIGURED -eq 'true') {
410
+ Write-Host "Installer is SIGNED."
411
+ } else {
412
+ Write-Warning "No signing cert secret configured — the installer is UNSIGNED (SmartScreen may warn). Provision WINDOWS_SIGN_CERT_BASE64 to sign (ADR 0032 Phase B)."
413
+ }
414
+
415
+ # Always upload the installer as a workflow artifact (inspectable on workflow_dispatch dry-runs).
416
+ - name: Upload the installer artifact (dry-run / always)
417
+ if: always()
418
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
419
+ with:
420
+ name: console-installer
421
+ path: dist/messagefoundry-console-setup-*.exe
422
+ if-no-files-found: warn
423
+
424
+ # Attach to the GitHub release — TAG-GATED only (a workflow_dispatch dry-run skips this). `needs:
425
+ # release` guarantees `release`'s `gh release create` already ran, so the release exists; --clobber
426
+ # lets a re-run replace the asset.
427
+ - name: Attach the installer to the GitHub release
428
+ if: startsWith(github.ref, 'refs/tags/')
429
+ env:
430
+ GH_TOKEN: ${{ github.token }}
431
+ run: gh release upload "$env:GITHUB_REF_NAME" "$env:SETUP_EXE" --clobber
@@ -0,0 +1,85 @@
1
+ # Real-hardware CI leg (BACKLOG #40, PLAN-6 lane L3): the SQL Server store / coordinator / failover /
2
+ # DATABASE-connector suites against a REAL local SQL Server 2025 on REAL Windows Server 2025, via a
3
+ # self-hosted runner. This is the one production-shaped combination GitHub's hosted runners cannot reach
4
+ # (they exercise SQL Server only on a Linux service container). It is the companion to ci.yml's
5
+ # `sql server (store + connector)` legs — the SAME suites, run on the real OS + driver stack.
6
+ #
7
+ # SECURITY (a self-hosted runner executes repository code):
8
+ # * Gated to `workflow_dispatch` ONLY — never `pull_request`, never a fork, no schedule. The repo is
9
+ # private, so untrusted fork code never reaches this runner. Run it ON DEMAND when the VM is up.
10
+ # * NOT a required check, and there is NO scheduled trigger — so the VM never has to be on. Nothing
11
+ # queues or fails while it is off; a manual run just waits for the runner (and expires after ~24h if
12
+ # the VM never comes up). It never blocks a PR or a merge.
13
+ # * The runner (label `mefor-win2025-sql`) lives in a dedicated, isolated Windows Server 2025 VM.
14
+ #
15
+ # CREDENTIALS: the SQL connection comes from the RUNNER's machine environment (set on the box, never in
16
+ # this repo). This workflow sets only the NON-SECRET posture + the agreed instance values; the password
17
+ # (`MEFOR_STORE_PASSWORD`) is inherited from the runner's machine env and never appears here.
18
+
19
+ name: self-hosted win2025 + sql server 2025
20
+
21
+ on:
22
+ workflow_dispatch: # on-demand only — run it when the VM runner is up; no schedule, so the VM is never required to be on
23
+
24
+ concurrency:
25
+ # ONE shared local DB on the runner — never run two of these at once. Queue, don't cancel.
26
+ group: selfhosted-win2025-sql
27
+ cancel-in-progress: false
28
+
29
+ permissions:
30
+ contents: read
31
+
32
+ jobs:
33
+ sqlserver-real:
34
+ name: SQL Server 2025 suites (real hardware)
35
+ runs-on: [self-hosted, windows, mefor-win2025-sql]
36
+ timeout-minutes: 30
37
+ env:
38
+ # The exact contract the suites read (load_settings(environ=os.environ).store). Non-secret values +
39
+ # the agreed instance; MEFOR_STORE_PASSWORD is inherited from the runner's machine env.
40
+ MEFOR_TEST_SQLSERVER: "1"
41
+ MEFOR_STORE_BACKEND: sqlserver
42
+ MEFOR_STORE_SERVER: localhost
43
+ MEFOR_STORE_PORT: "1433"
44
+ MEFOR_STORE_DATABASE: mefor_ci
45
+ MEFOR_STORE_USERNAME: mefor_ci
46
+ MEFOR_STORE_AUTH: sql
47
+ MEFOR_STORE_TRUST_SERVER_CERTIFICATE: "true" # local SQL self-signed cert
48
+ MEFOR_ALLOW_INSECURE_TLS: "1" # trusted-network test box only (mirrors the hosted sqlserver leg)
49
+ steps:
50
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
51
+ with:
52
+ persist-credentials: false # read-only test job; don't persist the token
53
+
54
+ - name: Toolchain (runner-provided Python 3.14 + ODBC Driver 18)
55
+ shell: powershell
56
+ run: |
57
+ python --version
58
+ python -m pip --version
59
+ $drv = Get-OdbcDriver -Name "ODBC Driver 18 for SQL Server" -ErrorAction SilentlyContinue
60
+ if (-not $drv) { throw "ODBC Driver 18 for SQL Server is not installed on the runner" }
61
+ if (-not $env:MEFOR_STORE_PASSWORD) { throw "MEFOR_STORE_PASSWORD must be set in the runner's machine environment (it is never committed)" }
62
+
63
+ - name: Install the project (dev + sqlserver extras)
64
+ shell: powershell
65
+ run: |
66
+ python -m pip install --upgrade pip
67
+ python -m pip install -e ".[dev,sqlserver]"
68
+
69
+ - name: SQL Server store / coordinator / connector suites (against the real DB)
70
+ shell: powershell
71
+ run: |
72
+ # `python -m pytest`, not bare `pytest` — the console-script isn't reliably on PATH in the
73
+ # runner's PowerShell, but the module always is via the same Python we installed into.
74
+ #
75
+ # tests/test_cluster_failover_sqlserver.py is intentionally NOT run on this self-hosted leg.
76
+ # Its 2-coordinator lease/takeover *lifecycle* is timing-sensitive and hangs on this VM (slower
77
+ # I/O than the hosted Linux SQL service leg, where it already runs and passes). The goal of this
78
+ # leg is real-Windows-hardware coverage of the store, the coordinator lease primitives, and the
79
+ # production DB connector; whole-lifecycle failover stays covered by the hosted
80
+ # `sql server (store + connector)` leg. Follow-up: give that suite a longer timeout / diagnose
81
+ # the VM hang, then add it back here.
82
+ python -m pytest -v `
83
+ tests/test_sqlserver_store.py `
84
+ tests/test_sqlserver_coordinator.py `
85
+ tests/test_database_connector_integration.py