messagefoundry 0.2.10__tar.gz → 0.2.12__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 (930) hide show
  1. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/ci.yml +200 -11
  2. messagefoundry-0.2.12/.github/workflows/manifest-lint.yml +114 -0
  3. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/release.yml +189 -0
  4. messagefoundry-0.2.12/.github/workflows/selfhosted-win2025-sql.yml +85 -0
  5. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.gitignore +4 -0
  6. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/CHANGELOG.md +148 -0
  7. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/PKG-INFO +1 -1
  8. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/README.md +17 -6
  9. messagefoundry-0.2.12/docker/compose.yaml +201 -0
  10. messagefoundry-0.2.12/docker/k8s/ha-postgres.yaml +242 -0
  11. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/k8s/secret.example.yaml +12 -2
  12. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/k8s/statefulset.yaml +4 -2
  13. messagefoundry-0.2.12/docs/ANTIVIRUS-FIREWALL.md +219 -0
  14. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/BACKLOG.md +1039 -65
  15. messagefoundry-0.2.12/docs/BRAND.md +103 -0
  16. messagefoundry-0.2.12/docs/CLOUD-DEPLOYMENT.md +306 -0
  17. messagefoundry-0.2.12/docs/CLOUD-PHI-HIPAA.md +185 -0
  18. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CLUSTERING.md +7 -0
  19. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CONFIGURATION.md +5 -0
  20. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CONTAINER-EXPOSURE-EVALUATION.md +5 -0
  21. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/DEPLOYMENT.md +24 -7
  22. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/FEATURE-MAP.md +2 -2
  23. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/PHI.md +1 -0
  24. messagefoundry-0.2.12/docs/POSITIONING.md +70 -0
  25. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/SERVICE.md +14 -0
  26. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/THROUGHPUT-IMPROVEMENTS.md +68 -15
  27. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0001-staged-pipeline-architecture.md +6 -1
  28. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0023-inbound-http-listener.md +1 -1
  29. messagefoundry-0.2.12/docs/adr/0032-console-desktop-launch.md +347 -0
  30. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0040-free-threaded-engine-support.md +9 -6
  31. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0044-operator-alert-state.md +1 -1
  32. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0045-custom-rbac-roles.md +1 -1
  33. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0046-message-content-search.md +1 -1
  34. messagefoundry-0.2.12/docs/adr/0047-cloud-kubernetes-ha-deployment-packaging.md +325 -0
  35. messagefoundry-0.2.12/docs/adr/0048-third-tier-disaster-recovery-standby.md +648 -0
  36. messagefoundry-0.2.12/docs/adr/0049-turnkey-dr-backup-restore-verify.md +525 -0
  37. messagefoundry-0.2.12/docs/adr/0050-single-project-root-config-anchoring.md +404 -0
  38. messagefoundry-0.2.12/docs/adr/0051-corepoint-throughput-parity-strategy.md +183 -0
  39. messagefoundry-0.2.12/docs/adr/0052-enterprise-scale-target.md +101 -0
  40. messagefoundry-0.2.12/docs/adr/0053-free-threaded-multicore-engine.md +249 -0
  41. messagefoundry-0.2.12/docs/adr/0054-low-allocation-builtins-hl7-parser.md +221 -0
  42. messagefoundry-0.2.12/docs/adr/0055-group-commit-durable-write.md +152 -0
  43. messagefoundry-0.2.12/docs/adr/0056-engine-managed-vip-failover.md +643 -0
  44. messagefoundry-0.2.12/docs/adr/0057-inline-step-a-fast-path.md +184 -0
  45. messagefoundry-0.2.12/docs/adr/0058-batch-claim-fifo-prefix.md +251 -0
  46. messagefoundry-0.2.12/docs/adr/0059-seq-only-fifo-ordering.md +55 -0
  47. messagefoundry-0.2.12/docs/adr/0060-rename-based-fifo-index-migration.md +78 -0
  48. messagefoundry-0.2.12/docs/adr/0061-per-lane-wake-events.md +106 -0
  49. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/README.md +18 -10
  50. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/step-b-write-amplification.md +16 -2
  51. messagefoundry-0.2.12/docs/design/freethread-spike.md +177 -0
  52. messagefoundry-0.2.12/docs/releases/MULTISESSION-PLAN-6.md +258 -0
  53. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/research/cloud-deployment-research-2026-06.md +10 -4
  54. messagefoundry-0.2.12/docs/throughput-build-plan.md +102 -0
  55. messagefoundry-0.2.12/docs/throughput-roadmap.md +361 -0
  56. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/__main__.py +76 -2
  57. messagefoundry-0.2.12/harness/config/connscale/__init__.py +4 -0
  58. messagefoundry-0.2.12/harness/config/connscale/_shape.py +111 -0
  59. messagefoundry-0.2.12/harness/config/connscale/gen_toml.py +106 -0
  60. messagefoundry-0.2.12/harness/config/connscale/graph.py +91 -0
  61. messagefoundry-0.2.12/harness/load/connscale/__init__.py +14 -0
  62. messagefoundry-0.2.12/harness/load/connscale/driver.py +135 -0
  63. messagefoundry-0.2.12/harness/load/connscale/probe.py +113 -0
  64. messagefoundry-0.2.12/harness/load/connscale/profile.py +364 -0
  65. messagefoundry-0.2.12/harness/load/connscale/report.py +300 -0
  66. messagefoundry-0.2.12/harness/load/connscale/runner.py +622 -0
  67. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/enginepoll.py +99 -3
  68. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/failover.py +6 -0
  69. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profile.py +5 -1
  70. messagefoundry-0.2.12/harness/load/profiles/connscale-smoke.toml +31 -0
  71. messagefoundry-0.2.12/harness/load/profiles/connscale.toml +35 -0
  72. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/report.py +10 -2
  73. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/__init__.py +1 -1
  74. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/__main__.py +538 -17
  75. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/app.py +195 -11
  76. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/models.py +82 -2
  77. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/permissions.py +4 -2
  78. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/checks.py +35 -4
  79. messagefoundry-0.2.12/messagefoundry/config/anchor.py +169 -0
  80. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/connections_file.py +9 -0
  81. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/environments.py +20 -2
  82. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/ingest_time.py +8 -1
  83. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/models.py +25 -0
  84. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/settings.py +357 -1
  85. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/wiring.py +47 -3
  86. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/connections.py +9 -4
  87. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/status.py +12 -1
  88. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/theme.py +3 -1
  89. messagefoundry-0.2.12/messagefoundry/parsing/_backend.py +47 -0
  90. messagefoundry-0.2.12/messagefoundry/parsing/_builtin_hl7.py +687 -0
  91. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/message.py +91 -7
  92. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/peek.py +56 -5
  93. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/alert_sinks.py +6 -0
  94. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/alerts.py +15 -0
  95. messagefoundry-0.2.12/messagefoundry/pipeline/connscale_shim.py +115 -0
  96. messagefoundry-0.2.12/messagefoundry/pipeline/dr.py +459 -0
  97. messagefoundry-0.2.12/messagefoundry/pipeline/dr_backup.py +872 -0
  98. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/engine.py +205 -0
  99. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/wiring_runner.py +711 -243
  100. messagefoundry-0.2.12/messagefoundry/store/backup_codec.py +290 -0
  101. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/base.py +273 -3
  102. messagefoundry-0.2.12/messagefoundry/store/pool_metrics.py +145 -0
  103. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/postgres.py +286 -96
  104. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/sqlserver.py +271 -52
  105. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/store.py +811 -306
  106. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/support/bundle.py +1 -0
  107. messagefoundry-0.2.12/packaging/console-installer/README.md +126 -0
  108. messagefoundry-0.2.12/packaging/console-installer/THIRD-PARTY-NOTICES.md +102 -0
  109. messagefoundry-0.2.12/packaging/console-installer/THIRD-PARTY-NOTICES.txt +131 -0
  110. messagefoundry-0.2.12/packaging/console-installer/console_launcher.py +31 -0
  111. messagefoundry-0.2.12/packaging/console-installer/licenses/GPL-3.0.txt +674 -0
  112. messagefoundry-0.2.12/packaging/console-installer/licenses/LGPL-3.0.txt +165 -0
  113. messagefoundry-0.2.12/packaging/console-installer/messagefoundry-console.iss +120 -0
  114. messagefoundry-0.2.12/packaging/console-installer/messagefoundry-console.spec +188 -0
  115. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/requirements.lock +19 -19
  116. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/security/crypto_inventory_check.py +9 -0
  117. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/worktree/new.ps1 +4 -4
  118. messagefoundry-0.2.12/tests/test_backup_crypto.py +144 -0
  119. messagefoundry-0.2.12/tests/test_backup_restore_atleastonce.py +76 -0
  120. messagefoundry-0.2.12/tests/test_backup_runner.py +373 -0
  121. messagefoundry-0.2.12/tests/test_batch_claim_fifo.py +371 -0
  122. messagefoundry-0.2.12/tests/test_batch_claim_locking.py +208 -0
  123. messagefoundry-0.2.12/tests/test_batch_claim_worker.py +154 -0
  124. messagefoundry-0.2.12/tests/test_builtin_hl7_parity.py +620 -0
  125. messagefoundry-0.2.12/tests/test_cli_offline_resolution.py +250 -0
  126. messagefoundry-0.2.12/tests/test_config_anchoring.py +481 -0
  127. messagefoundry-0.2.12/tests/test_connscale_config.py +85 -0
  128. messagefoundry-0.2.12/tests/test_connscale_driver.py +105 -0
  129. messagefoundry-0.2.12/tests/test_connscale_postgres.py +110 -0
  130. messagefoundry-0.2.12/tests/test_connscale_profile.py +107 -0
  131. messagefoundry-0.2.12/tests/test_connscale_report.py +150 -0
  132. messagefoundry-0.2.12/tests/test_connscale_smoke.py +143 -0
  133. messagefoundry-0.2.12/tests/test_dr_activation.py +187 -0
  134. messagefoundry-0.2.12/tests/test_dr_api_status.py +94 -0
  135. messagefoundry-0.2.12/tests/test_dr_failback.py +114 -0
  136. messagefoundry-0.2.12/tests/test_dr_rbac.py +143 -0
  137. messagefoundry-0.2.12/tests/test_dr_run_profile.py +183 -0
  138. messagefoundry-0.2.12/tests/test_dr_seeding.py +216 -0
  139. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_enginepoll_aggregate.py +2 -0
  140. messagefoundry-0.2.12/tests/test_fifo_index_migration.py +426 -0
  141. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_fifo_ordering.py +2 -1
  142. messagefoundry-0.2.12/tests/test_frozen_launch_smoke.py +115 -0
  143. messagefoundry-0.2.12/tests/test_group_commit.py +625 -0
  144. messagefoundry-0.2.12/tests/test_inline_fast_path.py +525 -0
  145. messagefoundry-0.2.12/tests/test_license_notice.py +76 -0
  146. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_config.py +7 -3
  147. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_report.py +17 -3
  148. messagefoundry-0.2.12/tests/test_per_lane_wake.py +322 -0
  149. messagefoundry-0.2.12/tests/test_pool_warm.py +395 -0
  150. messagefoundry-0.2.12/tests/test_priority_resolution.py +128 -0
  151. messagefoundry-0.2.12/tests/test_release_console_installer.py +195 -0
  152. messagefoundry-0.2.12/tests/test_restore_verify.py +102 -0
  153. messagefoundry-0.2.12/tests/test_seq_only_fifo.py +463 -0
  154. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_settings.py +115 -0
  155. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sqlserver_cursor_close.py +5 -1
  156. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sqlserver_schema_init.py +44 -0
  157. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_staged_pipeline.py +21 -21
  158. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_supervisor.py +51 -0
  159. messagefoundry-0.2.12/tests/test_synchronous_baseline.py +190 -0
  160. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/uv.lock +21 -21
  161. messagefoundry-0.2.10/docker/compose.yaml +0 -84
  162. messagefoundry-0.2.10/docs/adr/0032-console-desktop-launch.md +0 -86
  163. messagefoundry-0.2.10/docs/adr/0048-third-tier-disaster-recovery-standby.md +0 -216
  164. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.claude/settings.json +0 -0
  165. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.dockerignore +0 -0
  166. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.gitattributes +0 -0
  167. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/CODEOWNERS +0 -0
  168. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  169. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  170. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  171. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  172. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/SECURITY.md +0 -0
  173. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/dependabot.yml +0 -0
  174. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/benchmark.yml +0 -0
  175. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/cla.yml +0 -0
  176. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/codeql.yml +0 -0
  177. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/dependabot-auto-merge.yml +0 -0
  178. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/dependabot-lock-resync.yml +0 -0
  179. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/freethread-smoke.yml +0 -0
  180. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/release-sync-check.yml +0 -0
  181. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/scorecard.yml +0 -0
  182. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/security.yml +0 -0
  183. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/vuln-metrics.yml +0 -0
  184. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/zizmor.yml +0 -0
  185. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.gitleaks.toml +0 -0
  186. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.mefor-hooks/pre-commit +0 -0
  187. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.pre-commit-config.yaml +0 -0
  188. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.semgrep/messagefoundry.yml +0 -0
  189. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/CLA.md +0 -0
  190. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/CLAUDE.md +0 -0
  191. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/CODE_OF_CONDUCT.md +0 -0
  192. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/COMMERCIAL-LICENSE.md +0 -0
  193. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/CONTRIBUTING.md +0 -0
  194. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/GOVERNANCE.md +0 -0
  195. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/LICENSE +0 -0
  196. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/MAINTAINERS.md +0 -0
  197. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/NOTICE +0 -0
  198. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/README.md +0 -0
  199. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/Dockerfile +0 -0
  200. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/locks/requirements-core.lock +0 -0
  201. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/locks/requirements-sqlserver.lock +0 -0
  202. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/secrets.env.example +0 -0
  203. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/smoke/Dockerfile +0 -0
  204. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/smoke/config/IB_Test_ADT.py +0 -0
  205. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/smoke/send_adt.py +0 -0
  206. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/ADOPTER-CI.md +0 -0
  207. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/AI.md +0 -0
  208. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/ARCHITECTURE.md +0 -0
  209. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CI-QUALITY.md +0 -0
  210. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CODESETS.md +0 -0
  211. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CONNECTIONS.md +0 -0
  212. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
  213. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
  214. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
  215. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/DEPLOY-SERVER-DB.md +0 -0
  216. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/DICOM.md +0 -0
  217. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/DUAL_LICENSING_PLAN.md +0 -0
  218. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
  219. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/HL7-VALIDATION.md +0 -0
  220. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/INSTALL-GUIDE.md +0 -0
  221. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/LOAD-TESTING.md +0 -0
  222. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/MENTAL-MODEL.md +0 -0
  223. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/MessageFoundry-Mental-Model.docx +0 -0
  224. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
  225. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/REMOTE-CONSOLE.md +0 -0
  226. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/SECURITY-REMEDIATION-LEDGER.md +0 -0
  227. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/SECURITY.md +0 -0
  228. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/SUPPORT-POLICY.md +0 -0
  229. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/SYSTEM-REQUIREMENTS.md +0 -0
  230. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/Secure_AI_Development_Standards.md +0 -0
  231. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/Secure_Development_Standards.md +0 -0
  232. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/TEE-RELAY.md +0 -0
  233. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/USER-GUIDE.md +0 -0
  234. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/WORKTREES.md +0 -0
  235. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
  236. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
  237. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
  238. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0005-transform-accessible-state.md +0 -0
  239. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0006-external-data-lookups.md +0 -0
  240. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
  241. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0008-cluster-observability-api.md +0 -0
  242. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0009-run-scoped-context-providers.md +0 -0
  243. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
  244. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0011-timer-scheduled-source.md +0 -0
  245. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0012-x12-edi-codec.md +0 -0
  246. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0013-increment-2-reingress-design.md +0 -0
  247. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0013-query-response-orchestration.md +0 -0
  248. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0014-alerting-rules-engine.md +0 -0
  249. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
  250. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
  251. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0017-consumer-deployment-model.md +0 -0
  252. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
  253. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
  254. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
  255. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
  256. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
  257. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
  258. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
  259. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0026-off-box-egress-update-check.md +0 -0
  260. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0027-per-connection-retention.md +0 -0
  261. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
  262. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0029-email-smtp-destination.md +0 -0
  263. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
  264. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
  265. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0033-gui-manageable-code-sets.md +0 -0
  266. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0034-static-analysis-triage-policy-accepted-risk-register.md +0 -0
  267. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0035-ide-extension-workspace-trust-and-scope.md +0 -0
  268. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0036-windows-config-source-trust.md +0 -0
  269. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0037-multi-process-sharding-l3.md +0 -0
  270. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0038-internal-pass-through-connector.md +0 -0
  271. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0039-database-tier-sharding-l5.md +0 -0
  272. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0041-load-path-attestation-and-change-attribution.md +0 -0
  273. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0042-embedded-document-pruning.md +0 -0
  274. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0043-fhir-read-lookup.md +0 -0
  275. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/TEMPLATE.md +0 -0
  276. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-components.png +0 -0
  277. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-components.svg +0 -0
  278. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-config-graph.png +0 -0
  279. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-config-graph.svg +0 -0
  280. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-diagram.md +0 -0
  281. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-message-flow.png +0 -0
  282. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-message-flow.svg +0 -0
  283. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-topology.png +0 -0
  284. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-topology.svg +0 -0
  285. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/TUNING-BASELINE.md +0 -0
  286. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
  287. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
  288. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
  289. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
  290. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
  291. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
  292. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/design/dbshard.md +0 -0
  293. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/design/freethread.md +0 -0
  294. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/design/multiproc.md +0 -0
  295. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/hl7-message-ordering-reference.md +0 -0
  296. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/message-ordering-design.md +0 -0
  297. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
  298. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
  299. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
  300. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
  301. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/MULTISESSION-PLAN-4.md +0 -0
  302. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/MULTISESSION-PLAN-5.md +0 -0
  303. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
  304. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/MULTISESSION-PLAN.md +0 -0
  305. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
  306. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
  307. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
  308. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/v0.1-PLAN.md +0 -0
  309. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
  310. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/research/config-ux-review.md +0 -0
  311. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/research/non-hl7-transform-components.md +0 -0
  312. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
  313. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
  314. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ADVISORY-PROCESS.md +0 -0
  315. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
  316. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
  317. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
  318. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
  319. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
  320. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-L3-STATUS.md +0 -0
  321. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
  322. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
  323. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
  324. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/BEYOND-ASVS-L3.md +0 -0
  325. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
  326. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/DEPENDENCY-METRICS.md +0 -0
  327. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
  328. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/PHASE-8C-RBAC.md +0 -0
  329. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/PUBLISHING.md +0 -0
  330. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/RCA-TEMPLATE.md +0 -0
  331. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/RELEASE-GATE.md +0 -0
  332. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/REMEDIATION-PLAN.md +0 -0
  333. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/REVIEW-2026-06-07.md +0 -0
  334. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
  335. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
  336. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SECURITY-POSTURE.md +0 -0
  337. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
  338. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
  339. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
  340. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/THREAT-MODEL.md +0 -0
  341. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/testing/VERIFY.md +0 -0
  342. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
  343. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
  344. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
  345. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/environments/dev.toml +0 -0
  346. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/environments/prod.toml +0 -0
  347. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/README.md +0 -0
  348. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/__init__.py +0 -0
  349. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/__main__.py +0 -0
  350. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/matrix.py +0 -0
  351. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/probes.py +0 -0
  352. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/report.py +0 -0
  353. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/runner.py +0 -0
  354. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/compose.py +0 -0
  355. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/config/coverage.py +0 -0
  356. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/config/load/_shape.py +0 -0
  357. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/config/load/graph.py +0 -0
  358. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/config/passthrough/graph.py +0 -0
  359. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/config/store_once/graph.py +0 -0
  360. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/file_panel.py +0 -0
  361. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/file_transport.py +0 -0
  362. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/__init__.py +0 -0
  363. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/corpus.py +0 -0
  364. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/correlator.py +0 -0
  365. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/failover_track.py +0 -0
  366. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/governor.py +0 -0
  367. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/ids.py +0 -0
  368. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/metrics.py +0 -0
  369. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/README.md +0 -0
  370. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/adt-fanout-stress.toml +0 -0
  371. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/closed-loop.toml +0 -0
  372. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/failover.toml +0 -0
  373. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/fanout-baseline.toml +0 -0
  374. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/malformed-load.toml +0 -0
  375. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/reference.toml +0 -0
  376. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/smoke-sqlserver.toml +0 -0
  377. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/smoke.toml +0 -0
  378. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/soak.toml +0 -0
  379. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/spike-burst.toml +0 -0
  380. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/sustained-overload.toml +0 -0
  381. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/writeamp.toml +0 -0
  382. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/runner.py +0 -0
  383. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/sender.py +0 -0
  384. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/sink.py +0 -0
  385. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/mllp.py +0 -0
  386. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/monitor.py +0 -0
  387. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/receive.py +0 -0
  388. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/__init__.py +0 -0
  389. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/__main__.py +0 -0
  390. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/capture.py +0 -0
  391. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/compare.py +0 -0
  392. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/normalize.py +0 -0
  393. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/report.py +0 -0
  394. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/scenarios.py +0 -0
  395. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/send.py +0 -0
  396. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/window.py +0 -0
  397. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/.gitignore +0 -0
  398. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/.vscodeignore +0 -0
  399. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/README.md +0 -0
  400. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/esbuild.js +0 -0
  401. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/media/hl7schema.json +0 -0
  402. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/media/icon-amber.svg +0 -0
  403. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/media/icon.png +0 -0
  404. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/media/icon.svg +0 -0
  405. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/package-lock.json +0 -0
  406. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/package.json +0 -0
  407. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/snippets/messagefoundry.code-snippets +0 -0
  408. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/aiPolicy.ts +0 -0
  409. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/alertEditor.ts +0 -0
  410. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/auth.ts +0 -0
  411. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/chat.ts +0 -0
  412. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/cli.ts +0 -0
  413. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/codeSetEditor.ts +0 -0
  414. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/codesetsTree.ts +0 -0
  415. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/completion.ts +0 -0
  416. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/connectionEditor.ts +0 -0
  417. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/editorToolbar.ts +0 -0
  418. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/engineClient.ts +0 -0
  419. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/engineTarget.ts +0 -0
  420. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/extension.ts +0 -0
  421. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/generate.ts +0 -0
  422. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/git.ts +0 -0
  423. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/graphTree.ts +0 -0
  424. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/home.ts +0 -0
  425. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/insertElement.ts +0 -0
  426. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/newRoute.ts +0 -0
  427. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/promote.ts +0 -0
  428. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/promoteTarget.ts +0 -0
  429. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/sourceControl.ts +0 -0
  430. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/runTest.ts +0 -0
  431. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/ai-policy.test.ts +0 -0
  432. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/chat.test.ts +0 -0
  433. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/editor-toolbar.test.ts +0 -0
  434. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/engine-target.test.ts +0 -0
  435. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/extension.test.ts +0 -0
  436. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/index.ts +0 -0
  437. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/insert-element.test.ts +0 -0
  438. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/promote-target.test.ts +0 -0
  439. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/pythonpath.test.ts +0 -0
  440. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/settings-scope.test.ts +0 -0
  441. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/testBench.ts +0 -0
  442. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/validate.ts +0 -0
  443. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/tsconfig.json +0 -0
  444. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/tsconfig.test.json +0 -0
  445. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/mefor.code-workspace +0 -0
  446. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/adr_analyze.py +0 -0
  447. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/__init__.py +0 -0
  448. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/_pools.py +0 -0
  449. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/hl7.py +0 -0
  450. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/keying.py +0 -0
  451. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/leak.py +0 -0
  452. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/rules.py +0 -0
  453. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/surrogates.py +0 -0
  454. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/__init__.py +0 -0
  455. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/approvals.py +0 -0
  456. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/auth_models.py +0 -0
  457. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/auth_routes.py +0 -0
  458. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/field_authz.py +0 -0
  459. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/metrics.py +0 -0
  460. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/security.py +0 -0
  461. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/tls.py +0 -0
  462. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/__init__.py +0 -0
  463. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
  464. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/data/common_passwords.txt +0 -0
  465. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/identity.py +0 -0
  466. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/ldap.py +0 -0
  467. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/notifications.py +0 -0
  468. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/passwords.py +0 -0
  469. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/policy.py +0 -0
  470. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/ratelimit.py +0 -0
  471. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/service.py +0 -0
  472. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/tokens.py +0 -0
  473. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/totp.py +0 -0
  474. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/__init__.py +0 -0
  475. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/active_environment.py +0 -0
  476. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/ai_policy.py +0 -0
  477. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/alerts_edit.py +0 -0
  478. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/code_sets.py +0 -0
  479. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/codeset_edit.py +0 -0
  480. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/connections_edit.py +0 -0
  481. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/db_lookup.py +0 -0
  482. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/fhir_lookup.py +0 -0
  483. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/fingerprint.py +0 -0
  484. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/reference.py +0 -0
  485. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/response.py +0 -0
  486. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/run_context.py +0 -0
  487. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/state.py +0 -0
  488. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/tls_policy.py +0 -0
  489. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/__init__.py +0 -0
  490. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/__main__.py +0 -0
  491. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/_async.py +0 -0
  492. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/alerts_page.py +0 -0
  493. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/change_password.py +0 -0
  494. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/client.py +0 -0
  495. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/dead_letters_page.py +0 -0
  496. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/delegates.py +0 -0
  497. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/event_log_page.py +0 -0
  498. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/alerts.svg +0 -0
  499. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/connections.svg +0 -0
  500. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/dead-letters.svg +0 -0
  501. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/engine-status.svg +0 -0
  502. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/log-search.svg +0 -0
  503. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/logo-lockup.svg +0 -0
  504. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/users.svg +0 -0
  505. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/login.py +0 -0
  506. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/mfa.py +0 -0
  507. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/reauth.py +0 -0
  508. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/resources/README.md +0 -0
  509. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/resources/app.ico +0 -0
  510. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/resources/app.svg +0 -0
  511. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/search.py +0 -0
  512. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/service_control.py +0 -0
  513. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/sessions.py +0 -0
  514. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/shards.py +0 -0
  515. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/shell.py +0 -0
  516. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/users_page.py +0 -0
  517. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/widgets.py +0 -0
  518. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/README.md +0 -0
  519. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/__init__.py +0 -0
  520. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/_core.py +0 -0
  521. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/_hl7data.py +0 -0
  522. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/adt.py +0 -0
  523. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/all_types.py +0 -0
  524. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/bar.py +0 -0
  525. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/dft.py +0 -0
  526. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/documents.py +0 -0
  527. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/mdm.py +0 -0
  528. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/mfn.py +0 -0
  529. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/oml.py +0 -0
  530. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/orl.py +0 -0
  531. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/orm.py +0 -0
  532. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/oru.py +0 -0
  533. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/ras.py +0 -0
  534. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/rde.py +0 -0
  535. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/siu.py +0 -0
  536. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/vxu.py +0 -0
  537. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/hl7schema.py +0 -0
  538. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/integrity.py +0 -0
  539. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/last_resort.py +0 -0
  540. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/logging_setup.py +0 -0
  541. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/__init__.py +0 -0
  542. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/binary.py +0 -0
  543. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/consistency.py +0 -0
  544. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/__init__.py +0 -0
  545. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/_deps.py +0 -0
  546. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/_util.py +0 -0
  547. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/dataset.py +0 -0
  548. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/errors.py +0 -0
  549. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
  550. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/peek.py +0 -0
  551. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/fhir/__init__.py +0 -0
  552. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/fhir/_deps.py +0 -0
  553. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/fhir/errors.py +0 -0
  554. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/fhir/peek.py +0 -0
  555. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/fhir/resource.py +0 -0
  556. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/groups.py +0 -0
  557. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/split.py +0 -0
  558. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/summary.py +0 -0
  559. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/tree.py +0 -0
  560. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/validate.py +0 -0
  561. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/__init__.py +0 -0
  562. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/_deps.py +0 -0
  563. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/delimiters.py +0 -0
  564. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/errors.py +0 -0
  565. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/interchange.py +0 -0
  566. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/message.py +0 -0
  567. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/peek.py +0 -0
  568. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/validate.py +0 -0
  569. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/__init__.py +0 -0
  570. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/_deps.py +0 -0
  571. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/errors.py +0 -0
  572. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/harden.py +0 -0
  573. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/message.py +0 -0
  574. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/schema.py +0 -0
  575. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/signature.py +0 -0
  576. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/__init__.py +0 -0
  577. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/cert_expiry.py +0 -0
  578. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/cluster.py +0 -0
  579. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
  580. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/config_convergence.py +0 -0
  581. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/dryrun.py +0 -0
  582. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/leader_tasks.py +0 -0
  583. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/reference_sync.py +0 -0
  584. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/retention.py +0 -0
  585. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/security_notify.py +0 -0
  586. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/sharding.py +0 -0
  587. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/state_convergence.py +0 -0
  588. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/supervisor.py +0 -0
  589. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/update_check.py +0 -0
  590. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/py.typed +0 -0
  591. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/redaction.py +0 -0
  592. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/scaffold.py +0 -0
  593. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/secrets_dpapi.py +0 -0
  594. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/__init__.py +0 -0
  595. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/audit_tee.py +0 -0
  596. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/content_search.py +0 -0
  597. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/crypto.py +0 -0
  598. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/document_strip.py +0 -0
  599. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/keyprovider.py +0 -0
  600. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/support/__init__.py +0 -0
  601. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/support/redact.py +0 -0
  602. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/timezone.py +0 -0
  603. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/__init__.py +0 -0
  604. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/base.py +0 -0
  605. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/database.py +0 -0
  606. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/dicom.py +0 -0
  607. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/dicomweb.py +0 -0
  608. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/email.py +0 -0
  609. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/fhir.py +0 -0
  610. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/file.py +0 -0
  611. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/framing.py +0 -0
  612. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/http_listener.py +0 -0
  613. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/loopback.py +0 -0
  614. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/mllp.py +0 -0
  615. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/passthrough.py +0 -0
  616. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/remotefile.py +0 -0
  617. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/rest.py +0 -0
  618. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/signing.py +0 -0
  619. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/smart.py +0 -0
  620. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/soap.py +0 -0
  621. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/tcp.py +0 -0
  622. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/timer.py +0 -0
  623. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/x12.py +0 -0
  624. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/__init__.py +0 -0
  625. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/checks.py +0 -0
  626. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/model.py +0 -0
  627. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/report.py +0 -0
  628. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/runner.py +0 -0
  629. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/smoke.py +0 -0
  630. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/packaging/messagefoundry-harness/README.md +0 -0
  631. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/packaging/messagefoundry-harness/pyproject.toml +0 -0
  632. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/pyproject.toml +0 -0
  633. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_ACME_ADT.py +0 -0
  634. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_FHIR_INTAKE.py +0 -0
  635. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
  636. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_PARTNER_X12.py +0 -0
  637. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_RADIOLOGY_SR.py +0 -0
  638. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
  639. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/adt.py +0 -0
  640. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/codesets/event_labels.csv +0 -0
  641. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/codesets/facility_mnemonics.toml +0 -0
  642. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/connections.toml +0 -0
  643. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/consistency/validated_adt.py +0 -0
  644. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/dicom/generate_sr_sample.py +0 -0
  645. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/adt_a01.hl7 +0 -0
  646. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/adt_batch.hl7 +0 -0
  647. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
  648. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/README.md +0 -0
  649. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
  650. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
  651. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
  652. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
  653. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
  654. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
  655. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
  656. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/x12_270_eligibility.edi +0 -0
  657. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/results_relay/README.md +0 -0
  658. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/results_relay/codesets/test_codes.csv +0 -0
  659. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
  660. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/results_relay/messages/oru_results.hl7 +0 -0
  661. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/results_relay/results_relay.py +0 -0
  662. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/send_mllp.py +0 -0
  663. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/console/install-console-shortcut.ps1 +0 -0
  664. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/console/pack_ico.py +0 -0
  665. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
  666. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/dev/postgres.ps1 +0 -0
  667. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/dev/sqlserver-docker.ps1 +0 -0
  668. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/dev/sqlserver.ps1 +0 -0
  669. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
  670. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/publish/check_release_sync.py +0 -0
  671. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/publish/publish-denylist.txt +0 -0
  672. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/publish/publish.ps1 +0 -0
  673. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/publish/scan_forbidden.py +0 -0
  674. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/security/vuln_metrics.py +0 -0
  675. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/service/import-db-ca.ps1 +0 -0
  676. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/service/install-service.ps1 +0 -0
  677. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/service/uninstall-service.ps1 +0 -0
  678. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/trace_icon.py +0 -0
  679. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/worktree/remove.ps1 +0 -0
  680. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/worktree/session-context.ps1 +0 -0
  681. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/worktree/spawn.ps1 +0 -0
  682. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/__init__.py +0 -0
  683. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/__main__.py +0 -0
  684. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/__init__.py +0 -0
  685. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/_hl7data.py +0 -0
  686. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/_pools.py +0 -0
  687. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/hl7.py +0 -0
  688. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/keying.py +0 -0
  689. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/leak.py +0 -0
  690. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/rules.py +0 -0
  691. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/surrogates.py +0 -0
  692. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/compare.py +0 -0
  693. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/correlate.py +0 -0
  694. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/hl7_fields.py +0 -0
  695. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/mefor_api.py +0 -0
  696. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/mllp.py +0 -0
  697. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/relay.py +0 -0
  698. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/report.py +0 -0
  699. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/store.py +0 -0
  700. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/_dicom_sample.py +0 -0
  701. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/_failover_load_support.py +0 -0
  702. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/_fhir_fixtures.py +0 -0
  703. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/conftest.py +0 -0
  704. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_acceptance_framework.py +0 -0
  705. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ack_capture_runner.py +0 -0
  706. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ack_sent_store.py +0 -0
  707. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_active_environment.py +0 -0
  708. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ad_group_scope.py +0 -0
  709. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_admin_new_ip.py +0 -0
  710. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_adr_analyze.py +0 -0
  711. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ai_policy.py +0 -0
  712. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_alert_rules.py +0 -0
  713. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_alert_sinks.py +0 -0
  714. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_alert_state.py +0 -0
  715. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_alerts_edit.py +0 -0
  716. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_alerts_rules_api.py +0 -0
  717. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_anon_core.py +0 -0
  718. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_anon_integration.py +0 -0
  719. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_anon_parity.py +0 -0
  720. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_api.py +0 -0
  721. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_api_alerts.py +0 -0
  722. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_api_auth.py +0 -0
  723. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_api_reload.py +0 -0
  724. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_api_tls.py +0 -0
  725. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_approvals.py +0 -0
  726. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_asvs_phase0.py +0 -0
  727. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_audit_integrity.py +0 -0
  728. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_audit_offbox_tee.py +0 -0
  729. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_core.py +0 -0
  730. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_entry_hardening.py +0 -0
  731. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_hardening.py +0 -0
  732. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_service.py +0 -0
  733. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_session_lifecycle.py +0 -0
  734. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_store.py +0 -0
  735. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_binary_carriage.py +0 -0
  736. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_bootstrap_admin_perms.py +0 -0
  737. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cert_expiry.py +0 -0
  738. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_channel_rbac.py +0 -0
  739. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_checks.py +0 -0
  740. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_checks_lint.py +0 -0
  741. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cli.py +0 -0
  742. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cluster.py +0 -0
  743. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cluster_failover_postgres.py +0 -0
  744. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cluster_failover_sqlserver.py +0 -0
  745. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cluster_graph_gating.py +0 -0
  746. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cluster_lease.py +0 -0
  747. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_code_sets.py +0 -0
  748. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_codeset_edit.py +0 -0
  749. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_config_fingerprint.py +0 -0
  750. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_config_source_trust.py +0 -0
  751. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_api.py +0 -0
  752. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_event_api.py +0 -0
  753. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_event_emit.py +0 -0
  754. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_event_outbound.py +0 -0
  755. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_event_scope.py +0 -0
  756. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_event_store.py +0 -0
  757. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_resilience.py +0 -0
  758. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connections_cli.py +0 -0
  759. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connections_file.py +0 -0
  760. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_consistency.py +0 -0
  761. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_alerts.py +0 -0
  762. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_auth.py +0 -0
  763. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_client.py +0 -0
  764. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_dead_letters.py +0 -0
  765. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_event_log.py +0 -0
  766. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_hardening.py +0 -0
  767. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_icon.py +0 -0
  768. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_password.py +0 -0
  769. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_sessions.py +0 -0
  770. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_shards.py +0 -0
  771. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_status.py +0 -0
  772. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_step_up.py +0 -0
  773. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_theme.py +0 -0
  774. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_users.py +0 -0
  775. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_widgets.py +0 -0
  776. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_content_search.py +0 -0
  777. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_custom_roles.py +0 -0
  778. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_database_connector_integration.py +0 -0
  779. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_database_transport.py +0 -0
  780. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_db_lookup.py +0 -0
  781. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_db_lookup_live_runner.py +0 -0
  782. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_delivery_settings.py +0 -0
  783. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dependabot_automerge_guardrails.py +0 -0
  784. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dependency_boundaries.py +0 -0
  785. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicom_codec.py +0 -0
  786. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicom_scp.py +0 -0
  787. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicom_scp_security.py +0 -0
  788. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicom_scu.py +0 -0
  789. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicom_wiring.py +0 -0
  790. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicomweb.py +0 -0
  791. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_docs_runbooks.py +0 -0
  792. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dryrun.py +0 -0
  793. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dual_control_reload.py +0 -0
  794. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ed_documents.py +0 -0
  795. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ed_documents_e2e.py +0 -0
  796. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_egress_allowlist.py +0 -0
  797. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_email_destination.py +0 -0
  798. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_embedded_document_pruning.py +0 -0
  799. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_environments.py +0 -0
  800. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_fhir_lookup.py +0 -0
  801. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_fhir_parsing.py +0 -0
  802. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_fhir_resource.py +0 -0
  803. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_fhir_transport.py +0 -0
  804. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_field_authz.py +0 -0
  805. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_field_authz_metadata.py +0 -0
  806. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_generate_cli.py +0 -0
  807. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_generated_adt.py +0 -0
  808. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_generators_core.py +0 -0
  809. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_generators_types.py +0 -0
  810. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_groups.py +0 -0
  811. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness.py +0 -0
  812. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_compose.py +0 -0
  813. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_config.py +0 -0
  814. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_faults.py +0 -0
  815. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_file.py +0 -0
  816. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_monitor.py +0 -0
  817. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_scenarios.py +0 -0
  818. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_hl7_core_features.py +0 -0
  819. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_hl7schema.py +0 -0
  820. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_inbound_bind.py +0 -0
  821. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_inbound_http_source.py +0 -0
  822. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ingest_time.py +0 -0
  823. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_keyprovider.py +0 -0
  824. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_last_admin_guard.py +0 -0
  825. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_last_resort.py +0 -0
  826. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_leader_tasks.py +0 -0
  827. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_listener_tls_exposure.py +0 -0
  828. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_corpus.py +0 -0
  829. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_failover_postgres.py +0 -0
  830. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_failover_sqlserver.py +0 -0
  831. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_failover_unit.py +0 -0
  832. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_metrics.py +0 -0
  833. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_profile.py +0 -0
  834. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_runner.py +0 -0
  835. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_sender.py +0 -0
  836. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_sink.py +0 -0
  837. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_logging.py +0 -0
  838. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_message.py +0 -0
  839. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_message_split.py +0 -0
  840. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_message_timestamps.py +0 -0
  841. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_metrics_exporter.py +0 -0
  842. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_mfa.py +0 -0
  843. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_mllp_encoding_override.py +0 -0
  844. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_mllp_tls.py +0 -0
  845. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_nonhl7_ingress_size_cap.py +0 -0
  846. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_operability_config.py +0 -0
  847. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_outbound_signing.py +0 -0
  848. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_outbound_simulate.py +0 -0
  849. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_packaging.py +0 -0
  850. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_parse_tree.py +0 -0
  851. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_parsing.py +0 -0
  852. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_passthrough.py +0 -0
  853. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_passthrough_graph.py +0 -0
  854. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_payload_agnostic_ingress.py +0 -0
  855. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_per_connection_retention.py +0 -0
  856. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_postgres_store.py +0 -0
  857. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_reconcile_capture.py +0 -0
  858. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_reconcile_compare.py +0 -0
  859. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_reconcile_harness.py +0 -0
  860. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_redaction.py +0 -0
  861. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_reference_sets.py +0 -0
  862. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_reingress.py +0 -0
  863. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_remotefile_transport.py +0 -0
  864. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_response_capture.py +0 -0
  865. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_rest_transport.py +0 -0
  866. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_retention.py +0 -0
  867. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_run_context.py +0 -0
  868. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_scaffold.py +0 -0
  869. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_scaffold_requirements.py +0 -0
  870. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_scan_forbidden.py +0 -0
  871. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_secrets_dpapi.py +0 -0
  872. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_security_notify.py +0 -0
  873. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_security_static.py +0 -0
  874. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_service_control.py +0 -0
  875. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sharding.py +0 -0
  876. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sibling_helper_finder.py +0 -0
  877. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_smart_backend.py +0 -0
  878. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_soap_transport.py +0 -0
  879. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_soap_wssecurity.py +0 -0
  880. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sqlserver_coordinator.py +0 -0
  881. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sqlserver_store.py +0 -0
  882. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_startup_attestation.py +0 -0
  883. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_startup_fault_isolation.py +0 -0
  884. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_stats_reset.py +0 -0
  885. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_step_up.py +0 -0
  886. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store.py +0 -0
  887. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_backend.py +0 -0
  888. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_encryption.py +0 -0
  889. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_file_hardening.py +0 -0
  890. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_once_deliver_many.py +0 -0
  891. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_once_graph.py +0 -0
  892. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_read_pool.py +0 -0
  893. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_ssl.py +0 -0
  894. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_summary.py +0 -0
  895. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_support_bundle.py +0 -0
  896. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_task_resilience.py +0 -0
  897. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tcp_transport.py +0 -0
  898. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_cli.py +0 -0
  899. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_compare.py +0 -0
  900. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_correlate.py +0 -0
  901. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_hl7_fields.py +0 -0
  902. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_mefor_api.py +0 -0
  903. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_mllp.py +0 -0
  904. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_relay.py +0 -0
  905. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_report.py +0 -0
  906. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_store.py +0 -0
  907. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_timer_source.py +0 -0
  908. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_timezone.py +0 -0
  909. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tls_policy.py +0 -0
  910. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_totp.py +0 -0
  911. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_totp_window.py +0 -0
  912. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_transform_offloop.py +0 -0
  913. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_transform_state.py +0 -0
  914. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_transports.py +0 -0
  915. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_update_check.py +0 -0
  916. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_verify.py +0 -0
  917. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_version.py +0 -0
  918. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_win2025_acceptance.py +0 -0
  919. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_wiring.py +0 -0
  920. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_wiring_engine.py +0 -0
  921. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_wiring_reload.py +0 -0
  922. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_wiring_serve.py +0 -0
  923. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ws_stats_revalidation.py +0 -0
  924. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_x12_parsing.py +0 -0
  925. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_x12_rte.py +0 -0
  926. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_x12_source_ip_allowlist.py +0 -0
  927. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_x12_transport.py +0 -0
  928. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_x12_validate.py +0 -0
  929. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_xml_message.py +0 -0
  930. {messagefoundry-0.2.10 → messagefoundry-0.2.12}/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
@@ -331,6 +431,33 @@ jobs:
331
431
  MEFOR_ALLOW_INSECURE_TLS: "1"
332
432
  run: pytest tests/test_load_failover_sqlserver.py -v
333
433
 
434
+ - name: Run the throughput-lever backend invariants on real SQL Server (B1 inline, B2 batch-claim, ...)
435
+ env:
436
+ MEFOR_TEST_SQLSERVER: "1"
437
+ MEFOR_STORE_BACKEND: sqlserver
438
+ MEFOR_STORE_SERVER: localhost
439
+ MEFOR_STORE_PORT: "1433"
440
+ MEFOR_STORE_DATABASE: MessageFoundry
441
+ MEFOR_STORE_AUTH: sql
442
+ MEFOR_STORE_USERNAME: sa
443
+ MEFOR_STORE_PASSWORD: "Str0ng_P@ssw0rd!"
444
+ MEFOR_STORE_TRUST_SERVER_CERTIFICATE: "true"
445
+ MEFOR_ALLOW_INSECURE_TLS: "1"
446
+ # The staged-pipeline throughput levers (ADR 0057 inline fast-path, ADR 0058 batch-claim, ...) carry
447
+ # reliability-core invariant tests — crash-replay, poison-bound, and the per-lane-FIFO locked-head-
448
+ # BLOCKS (#285) gate — that are MEFOR_TEST_SQLSERVER-gated but live in their OWN files, so the named
449
+ # suites above never picked them up and they ran only on SQLite. Run them here against the real
450
+ # backend. APPEND each new lever's test file per docs/throughput-build-plan.md.
451
+ run: >-
452
+ pytest -v
453
+ tests/test_inline_fast_path.py
454
+ tests/test_batch_claim_fifo.py
455
+ tests/test_batch_claim_worker.py
456
+ tests/test_batch_claim_locking.py
457
+ tests/test_seq_only_fifo.py
458
+ tests/test_fifo_index_migration.py
459
+ tests/test_per_lane_wake.py
460
+
334
461
  # Postgres store backend (Track B): run the gated store suite against a real PostgreSQL service
335
462
  # container (Linux, so 1x minutes). Skipped on PRs like the other server-DB job to save spend; runs
336
463
  # on push to main and on-demand (workflow_dispatch — use `gh workflow run ci.yml --ref <branch>` to
@@ -338,7 +465,9 @@ jobs:
338
465
  # LOCKED + advisory-lock concurrency the SQLite tests can't reach.
339
466
  postgres-store:
340
467
  name: postgres store
341
- if: github.event_name != 'pull_request'
468
+ # push-to-main + on-demand only (NOT the nightly `schedule`, which is reserved for the load legs —
469
+ # `push || workflow_dispatch`, not `!= 'pull_request'`, keeps this container leg out of the cron).
470
+ if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
342
471
  runs-on: ubuntu-latest
343
472
  services:
344
473
  postgres:
@@ -402,6 +531,53 @@ jobs:
402
531
  MEFOR_ALLOW_INSECURE_TLS: "1"
403
532
  run: pytest tests/test_load_failover_postgres.py -v
404
533
 
534
+ - name: Run the throughput-lever backend invariants on real Postgres (B1 inline, B2 batch-claim, ...)
535
+ env:
536
+ MEFOR_TEST_POSTGRES: "1"
537
+ MEFOR_STORE_BACKEND: postgres
538
+ MEFOR_STORE_SERVER: localhost
539
+ MEFOR_STORE_PORT: "5432"
540
+ MEFOR_STORE_DATABASE: messagefoundry
541
+ MEFOR_STORE_USERNAME: postgres
542
+ MEFOR_STORE_PASSWORD: mefor
543
+ MEFOR_STORE_ENCRYPT: "false"
544
+ MEFOR_ALLOW_INSECURE_TLS: "1"
545
+ # The throughput levers' MEFOR_TEST_POSTGRES-gated invariants (esp. the FOR-UPDATE no-SKIP-LOCKED
546
+ # locked-head-BLOCKS twin of #285, and the batch FIFO/crash tests) live in their own files. APPEND
547
+ # each new lever's test file per docs/throughput-build-plan.md.
548
+ run: >-
549
+ pytest -v
550
+ tests/test_inline_fast_path.py
551
+ tests/test_batch_claim_fifo.py
552
+ tests/test_batch_claim_worker.py
553
+ tests/test_batch_claim_locking.py
554
+ tests/test_seq_only_fifo.py
555
+ tests/test_fifo_index_migration.py
556
+ tests/test_per_lane_wake.py
557
+
558
+ - name: Run the connection-scale pool-wait smoke on real Postgres (B11 wall #2, tiny pool)
559
+ env:
560
+ MEFOR_TEST_POSTGRES: "1"
561
+ MEFOR_STORE_BACKEND: postgres
562
+ MEFOR_STORE_SERVER: localhost
563
+ MEFOR_STORE_PORT: "5432"
564
+ MEFOR_STORE_DATABASE: messagefoundry
565
+ MEFOR_STORE_USERNAME: postgres
566
+ MEFOR_STORE_PASSWORD: mefor
567
+ MEFOR_STORE_ENCRYPT: "false"
568
+ MEFOR_ALLOW_INSECURE_TLS: "1"
569
+ # FORCE a below-default pool (4 connections) so the perf_counter-measured acquire-WAIT
570
+ # histogram (the PRIMARY pool-wait signal) is non-trivial even at small N: ~3N inbound workers
571
+ # contend for 4 connections, so acquires actually queue and the percentiles populate. The
572
+ # default pool (5+) would mask the wall. 4 (not 1-2) is deliberate: GET /status runs
573
+ # db_status()'s four sequential COUNT(*) queries on every poll, and an extremely tiny pool
574
+ # starves those acquires past the poller's HTTP timeout under the empty-claim herd on a slow
575
+ # runner — every poll then fails and the drain loops burn the test budget (the PR #675 hang).
576
+ # This still gives the B11 pool-wait instrumentation real regression coverage SQLite (no pool)
577
+ # cannot — the connscale harness OWNS the engine subprocess and inherits this env.
578
+ MEFOR_STORE_POOL_SIZE: "4"
579
+ run: pytest tests/test_connscale_postgres.py -v
580
+
405
581
  # Headless load test (Track B / throughput): serve the synthetic high-fan-out load config (auth
406
582
  # off, small fan-out) and drive the smoke profile through the real `python -m harness --load` CLI,
407
583
  # asserting zero message loss + all SLOs (exit 0) and uploading the JSON/CSV report. Skipped on PRs
@@ -411,7 +587,11 @@ jobs:
411
587
  # docs/LOAD-TESTING.md.
412
588
  load-test:
413
589
  name: load test (smoke, sqlite)
414
- if: github.event_name != 'pull_request'
590
+ # Nightly schedule + on-demand only (was: every push to main). The PR gate is the in-process
591
+ # tests/test_load_runner.py in the `test` job; push-to-main keeps full functional + server-DB
592
+ # coverage. This multi-minute serve+load run no longer fires once per commit. NOT a required check,
593
+ # so dropping it from push is safe; ci-gate `needs` it but counts a `skipped` leg as a pass.
594
+ if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
415
595
  runs-on: ubuntu-latest
416
596
  steps:
417
597
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
@@ -467,7 +647,10 @@ jobs:
467
647
  # runs on push to main + on-demand (workflow_dispatch). Heavier SQL Server profiles run manually.
468
648
  load-test-sqlserver:
469
649
  name: load test (smoke, sqlserver) ${{ matrix.label }}
470
- if: github.event_name != 'pull_request'
650
+ # Nightly schedule + on-demand only (was: every push to main); same rationale as `load-test`. The
651
+ # end-to-end SQL Server store path is still smoked nightly (x2 majors) + on demand, and the per-push
652
+ # SQL Server functional coverage stays in `sqlserver-store`. NOT required; ci-gate treats skip as pass.
653
+ if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
471
654
  runs-on: ubuntu-latest
472
655
  # Smoke the end-to-end SQL Server store path on every supported major (2022/2025). Push/dispatch-only,
473
656
  # so no PR cost; fail-fast: false keeps the two legs independent.
@@ -567,7 +750,10 @@ jobs:
567
750
  # minutes; runs on push to main and on-demand (workflow_dispatch).
568
751
  windows-service-smoke:
569
752
  name: windows service smoke (${{ matrix.os }}, py${{ matrix.python-version }})
570
- if: github.event_name != 'pull_request'
753
+ # push-to-main + on-demand only (2x-billed Windows legs). NOT on the nightly `schedule` — the cron
754
+ # is reserved for the load legs, so this is `push || workflow_dispatch`, not `!= 'pull_request'`
755
+ # (which would have run these 2x-Windows legs every night for no added signal).
756
+ if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
571
757
  runs-on: ${{ matrix.os }}
572
758
  strategy:
573
759
  fail-fast: false
@@ -733,7 +919,10 @@ jobs:
733
919
  docker-smoke:
734
920
  name: docker image smoke (slim, linux)
735
921
  needs: changes
736
- if: github.event_name != 'pull_request' || needs.changes.outputs.docker == 'true'
922
+ # push-to-main / on-demand (full coverage), or a PR that touches the image/locks/packaging. NOT on
923
+ # the nightly `schedule` (reserved for the load legs) — `push || workflow_dispatch`, not
924
+ # `!= 'pull_request'`, keeps the image build out of the cron.
925
+ if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changes.outputs.docker == 'true'
737
926
  runs-on: ubuntu-latest
738
927
  steps:
739
928
  - 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,192 @@ 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
+ # pytest-timeout is required: the repo's pyproject `addopts` sets `--timeout=60
351
+ # --timeout-method=thread`, so a bare `pip install pytest` aborts the run with
352
+ # "unrecognized arguments: --timeout" before the smoke ever executes (it leaves the per-test
353
+ # watchdog intact instead of stripping addopts).
354
+ pip install pytest pytest-timeout
355
+ python -m pytest tests/test_frozen_launch_smoke.py -v -p no:cacheprovider
356
+
357
+ - name: Install Inno Setup (pinned)
358
+ run: |
359
+ choco install innosetup --version=$env:INNO_SETUP_VERSION --no-progress -y
360
+ # ISCC.exe is not on PATH after a choco install; resolve + export it for the next step.
361
+ $iscc = "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe"
362
+ if (-not (Test-Path $iscc)) { throw "ISCC.exe not found at $iscc after choco install" }
363
+ "ISCC=$iscc" | Out-File -FilePath $env:GITHUB_ENV -Append
364
+
365
+ - name: Build the installer (ISCC, AppVersion injected)
366
+ # Pass the resolved version through the step env (NOT a ${{ }} expansion inside the run script) so
367
+ # the value can never be interpolated into the shell — zizmor template-injection hardening.
368
+ env:
369
+ APP_VERSION: ${{ steps.ver.outputs.version }}
370
+ run: |
371
+ & "$env:ISCC" "/DAppVersion=$env:APP_VERSION" packaging/console-installer/messagefoundry-console.iss
372
+ $setup = "dist/messagefoundry-console-setup-$env:APP_VERSION.exe"
373
+ if (-not (Test-Path $setup)) { throw "Inno Setup did not produce $setup" }
374
+ "SETUP_EXE=$setup" | Out-File -FilePath $env:GITHUB_ENV -Append
375
+
376
+ # Authenticode signing — CONDITIONAL on the cert secret. If WINDOWS_SIGN_CERT_BASE64 is absent the
377
+ # whole step is skipped (the `if:` is false), so the build NEVER fails for lack of a cert; the
378
+ # installer simply ships UNSIGNED until the owner provisions one (ADR 0032 §(c), AC-B3). The cert
379
+ # lives ONLY in CI secrets and is written to a temp file that is deleted in the same step — it
380
+ # never touches the workspace. Pure CI tooling (signtool) — NO Python crypto import, so the ASVS
381
+ # 11.1.3 crypto-inventory gate is not tripped.
382
+ - name: Authenticode-sign the exe + installer (if a cert secret is configured)
383
+ if: ${{ env.SIGN_CONFIGURED == 'true' }}
384
+ env:
385
+ SIGN_CERT_B64: ${{ secrets.WINDOWS_SIGN_CERT_BASE64 }}
386
+ SIGN_CERT_PASSWORD: ${{ secrets.WINDOWS_SIGN_CERT_PASSWORD }}
387
+ run: |
388
+ # signtool ships with the Windows SDK on the windows-2025 image; resolve the newest one by SDK
389
+ # build number (sort the numeric version dir, not the lexical path, so 10.0.26100 > 10.0.9999).
390
+ $signtool = Get-ChildItem "${env:ProgramFiles(x86)}\Windows Kits\10\bin\*\x64\signtool.exe" |
391
+ Sort-Object { [version]($_.Directory.Parent.Name) } | Select-Object -Last 1
392
+ if (-not $signtool) { throw "signtool.exe not found (Windows SDK missing on the runner)" }
393
+ Write-Host "using signtool: $($signtool.FullName)"
394
+ $pfx = Join-Path $env:RUNNER_TEMP "codesign.pfx"
395
+ try {
396
+ [IO.File]::WriteAllBytes($pfx, [Convert]::FromBase64String($env:SIGN_CERT_B64))
397
+ # $signArgs, not $args ($args is a PowerShell automatic variable — avoid the collision).
398
+ $signArgs = @('sign', '/f', $pfx, '/fd', 'SHA256',
399
+ '/tr', 'http://timestamp.digicert.com', '/td', 'SHA256')
400
+ if ($env:SIGN_CERT_PASSWORD) { $signArgs += @('/p', $env:SIGN_CERT_PASSWORD) }
401
+ # Sign the inner frozen exe first, then the installer that wraps it.
402
+ & $signtool.FullName @signArgs "dist/messagefoundry-console/messagefoundry-console.exe"
403
+ if ($LASTEXITCODE -ne 0) { throw "signtool failed on the frozen exe" }
404
+ & $signtool.FullName @signArgs "$env:SETUP_EXE"
405
+ if ($LASTEXITCODE -ne 0) { throw "signtool failed on the installer" }
406
+ Write-Host "Signed the frozen exe + installer (timestamped)."
407
+ } finally {
408
+ if (Test-Path $pfx) { Remove-Item $pfx -Force } # never leave the cert on disk
409
+ }
410
+
411
+ - name: Note signing status
412
+ run: |
413
+ if ($env:SIGN_CONFIGURED -eq 'true') {
414
+ Write-Host "Installer is SIGNED."
415
+ } else {
416
+ 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)."
417
+ }
418
+
419
+ # Always upload the installer as a workflow artifact (inspectable on workflow_dispatch dry-runs).
420
+ - name: Upload the installer artifact (dry-run / always)
421
+ if: always()
422
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
423
+ with:
424
+ name: console-installer
425
+ path: dist/messagefoundry-console-setup-*.exe
426
+ if-no-files-found: warn
427
+
428
+ # Attach to the GitHub release — TAG-GATED only (a workflow_dispatch dry-run skips this). `needs:
429
+ # release` guarantees `release`'s `gh release create` already ran, so the release exists; --clobber
430
+ # lets a re-run replace the asset.
431
+ - name: Attach the installer to the GitHub release
432
+ if: startsWith(github.ref, 'refs/tags/')
433
+ env:
434
+ GH_TOKEN: ${{ github.token }}
435
+ run: gh release upload "$env:GITHUB_REF_NAME" "$env:SETUP_EXE" --clobber