messagefoundry 0.2.0__tar.gz → 0.2.2__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.
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/SECURITY.md +8 -3
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/workflows/benchmark.yml +3 -3
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/workflows/ci.yml +27 -62
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/workflows/dependabot-lock-resync.yml +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/workflows/release-sync-check.yml +7 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/workflows/release.yml +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/workflows/security.yml +20 -10
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/workflows/vuln-metrics.yml +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/CHANGELOG.md +69 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/CLAUDE.md +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/CONTRIBUTING.md +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/PKG-INFO +37 -36
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/README.md +35 -34
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docker/Dockerfile +2 -2
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docker/README.md +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docker/locks/requirements-core.lock +4 -267
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docker/locks/requirements-sqlserver.lock +5 -295
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/BACKLOG.md +101 -3
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/CLUSTERING.md +17 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/CONFIGURATION.md +2 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/CONNECTIONS.md +7 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/DEPLOY-SERVER-DB.md +86 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/EARLY-ADOPTER-GUIDE.md +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/INSTALL-GUIDE.md +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/MENTAL-MODEL.md +2 -2
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/PHI.md +110 -29
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/SECURITY.md +6 -6
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/SERVICE.md +10 -5
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/SYSTEM-REQUIREMENTS.md +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/Secure_AI_Development_Standards.md +10 -5
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/Secure_Development_Standards.md +4 -11
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/USER-GUIDE.md +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0001-staged-pipeline-architecture.md +14 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +19 -7
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0025-dicom-codec-store-connectors.md +5 -6
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/testing/VERIFY.md +19 -2
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/testing/WIN2025-TEST-MATRIX.md +1 -1
- messagefoundry-0.2.2/docs/testing/WIN2025-TEST-PLAN.md +1550 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/acceptance/matrix.py +6 -3
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/acceptance/probes.py +3 -3
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/failover.py +45 -10
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/failover_track.py +37 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/profiles/README.md +4 -0
- messagefoundry-0.2.2/harness/load/profiles/malformed-load.toml +44 -0
- messagefoundry-0.2.2/harness/load/profiles/spike-burst.toml +50 -0
- messagefoundry-0.2.2/harness/load/profiles/sustained-overload.toml +51 -0
- messagefoundry-0.2.2/harness/load/profiles/writeamp.toml +41 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/__init__.py +1 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/__main__.py +95 -30
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/api/app.py +135 -3
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/api/models.py +51 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/settings.py +36 -4
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/__init__.py +16 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/client.py +19 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/connections.py +39 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/cluster.py +90 -7
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/cluster_sqlserver.py +68 -22
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/engine.py +101 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/retention.py +20 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/wiring_runner.py +21 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/scaffold.py +3 -3
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/secrets_dpapi.py +3 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/store/base.py +24 -1
- messagefoundry-0.2.2/messagefoundry/store/crypto.py +271 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/store/postgres.py +198 -17
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/store/sqlserver.py +310 -51
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/store/store.py +221 -19
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/verify/checks.py +12 -6
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/verify/runner.py +73 -2
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/verify/smoke.py +110 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/pyproject.toml +21 -22
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/requirements.lock +9 -493
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/publish/scan_forbidden.py +8 -0
- messagefoundry-0.2.2/scripts/service/import-db-ca.ps1 +97 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/anon/leak.py +3 -0
- messagefoundry-0.2.2/tests/conftest.py +171 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_anon_core.py +13 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_anon_parity.py +5 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_api_auth.py +109 -1
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_cli.py +120 -7
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_cluster.py +24 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_cluster_failover_postgres.py +65 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_cluster_failover_sqlserver.py +59 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_cluster_graph_gating.py +51 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_cluster_lease.py +96 -6
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_icon.py +1 -5
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_status.py +15 -2
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_widgets.py +75 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_db_lookup.py +49 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_dicom_scp.py +77 -1
- messagefoundry-0.2.2/tests/test_docs_runbooks.py +102 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_fifo_ordering.py +20 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_harness_scenarios.py +36 -18
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_load_config.py +20 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_load_failover_postgres.py +6 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_load_failover_sqlserver.py +6 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_load_failover_unit.py +73 -2
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_logging.py +3 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_postgres_store.py +181 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_response_capture.py +35 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_retention.py +43 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_scan_forbidden.py +19 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_smart_backend.py +60 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_sqlserver_store.py +353 -2
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_startup_fault_isolation.py +20 -4
- messagefoundry-0.2.2/tests/test_stats_reset.py +238 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_store.py +201 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_store_encryption.py +262 -0
- messagefoundry-0.2.2/tests/test_store_ssl.py +76 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_verify.py +113 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_wiring_engine.py +102 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/uv.lock +2 -510
- messagefoundry-0.2.0/messagefoundry/store/crypto.py +0 -166
- messagefoundry-0.2.0/scripts/soak/store_soak.py +0 -92
- messagefoundry-0.2.0/tests/conftest.py +0 -279
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.claude/settings.json +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.dockerignore +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.gitattributes +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/CODEOWNERS +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/dependabot.yml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/workflows/cla.yml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.github/workflows/dependabot-auto-merge.yml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.gitignore +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.gitleaks.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.pre-commit-config.yaml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/.semgrep/messagefoundry.yml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/CLA.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/CODE_OF_CONDUCT.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/COMMERCIAL-LICENSE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/GOVERNANCE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/LICENSE +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/MAINTAINERS.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/NOTICE +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docker/compose.yaml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docker/k8s/secret.example.yaml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docker/k8s/statefulset.yaml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docker/secrets.env.example +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docker/smoke/Dockerfile +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docker/smoke/config/IB_Test_ADT.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docker/smoke/send_adt.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/ADOPTER-CI.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/AI.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/ARCHITECTURE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/CI-QUALITY.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/CONTAINER-EXPOSURE-EVALUATION.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/DEPLOYMENT.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/DICOM.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/DUAL_LICENSING_PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/FEATURE-MAP.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/HL7-VALIDATION.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/LOAD-TESTING.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/MessageFoundry-Mental-Model.docx +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/REMOTE-CONSOLE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/SUPPORT-POLICY.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/TEE-RELAY.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/THROUGHPUT-IMPROVEMENTS.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/WORKTREES.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0005-transform-accessible-state.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0006-external-data-lookups.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0008-cluster-observability-api.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0009-run-scoped-context-providers.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0011-timer-scheduled-source.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0012-x12-edi-codec.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0013-increment-2-reingress-design.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0013-query-response-orchestration.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0014-alerting-rules-engine.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0017-consumer-deployment-model.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0026-off-box-egress-update-check.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/0032-console-desktop-launch.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/README.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/adr/TEMPLATE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/architecture-components.png +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/architecture-components.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/architecture-config-graph.png +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/architecture-config-graph.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/architecture-diagram.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/architecture-message-flow.png +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/architecture-message-flow.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/architecture-topology.png +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/architecture-topology.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/benchmarks/TUNING-BASELINE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/benchmarks/step-b-write-amplification.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/hl7-message-ordering-reference.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/message-ordering-design.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/releases/MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/releases/v0.1-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/research/cloud-deployment-research-2026-06.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/research/config-ux-review.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/research/non-hl7-transform-components.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/ADVISORY-PROCESS.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/ASVS-L3-STATUS.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/BEYOND-ASVS-L3.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/DEPENDENCY-METRICS.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/PHASE-8C-RBAC.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/PUBLISHING.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/RCA-TEMPLATE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/RELEASE-GATE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/REVIEW-2026-06-07.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/SECURITY-POSTURE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/security/THREAT-MODEL.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/environments/dev.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/environments/prod.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/README.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/__main__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/acceptance/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/acceptance/__main__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/acceptance/report.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/acceptance/runner.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/compose.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/config/coverage.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/config/load/_shape.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/config/load/graph.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/file_panel.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/file_transport.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/corpus.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/correlator.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/enginepoll.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/governor.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/ids.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/metrics.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/profile.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/profiles/closed-loop.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/profiles/failover.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/profiles/fanout-baseline.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/profiles/reference.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/profiles/smoke-sqlserver.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/profiles/smoke.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/profiles/soak.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/report.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/runner.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/sender.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/load/sink.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/mllp.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/monitor.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/receive.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/reconcile/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/reconcile/__main__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/reconcile/capture.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/reconcile/compare.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/reconcile/normalize.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/reconcile/report.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/scenarios.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/send.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/harness/window.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/.gitignore +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/.vscodeignore +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/README.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/esbuild.js +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/media/hl7schema.json +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/media/icon.png +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/media/icon.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/package-lock.json +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/package.json +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/snippets/messagefoundry.code-snippets +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/aiPolicy.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/alertEditor.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/auth.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/chat.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/cli.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/completion.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/connectionEditor.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/engineClient.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/extension.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/generate.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/git.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/graphTree.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/home.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/newRoute.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/promote.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/sourceControl.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/test/runTest.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/test/suite/chat.test.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/test/suite/extension.test.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/test/suite/index.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/testBench.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/src/validate.ts +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/tsconfig.json +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/ide/tsconfig.test.json +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/mefor.code-workspace +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/adr_analyze.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/anon/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/anon/_pools.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/anon/hl7.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/anon/keying.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/anon/leak.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/anon/rules.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/anon/surrogates.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/api/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/api/approvals.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/api/auth_models.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/api/auth_routes.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/api/field_authz.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/api/metrics.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/api/security.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/api/tls.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/data/common_passwords.txt +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/identity.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/ldap.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/notifications.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/passwords.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/permissions.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/policy.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/ratelimit.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/service.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/tokens.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/auth/totp.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/checks.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/active_environment.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/ai_policy.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/alerts_edit.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/code_sets.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/connections_edit.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/connections_file.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/db_lookup.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/environments.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/ingest_time.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/models.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/reference.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/response.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/run_context.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/state.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/tls_policy.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/config/wiring.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/__main__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/_async.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/alerts_page.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/change_password.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/dead_letters_page.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/delegates.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/icons/alerts.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/icons/connections.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/icons/dead-letters.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/icons/engine-status.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/icons/log-search.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/icons/logo-lockup.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/icons/users.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/login.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/mfa.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/reauth.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/resources/README.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/resources/app.ico +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/resources/app.svg +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/search.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/service_control.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/sessions.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/shell.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/status.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/theme.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/users_page.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/console/widgets.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/README.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/_core.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/_hl7data.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/adt.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/all_types.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/bar.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/dft.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/documents.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/mdm.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/mfn.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/oml.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/orl.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/orm.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/oru.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/ras.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/rde.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/siu.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/generators/vxu.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/hl7schema.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/last_resort.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/logging_setup.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/binary.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/consistency.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/_deps.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/_util.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/dataset.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/errors.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/dicom/peek.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/fhir/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/fhir/_deps.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/fhir/errors.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/fhir/peek.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/fhir/resource.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/groups.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/message.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/peek.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/split.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/summary.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/tree.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/validate.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/delimiters.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/errors.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/interchange.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/message.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/parsing/x12/peek.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/alert_sinks.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/alerts.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/cert_expiry.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/config_convergence.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/dryrun.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/leader_tasks.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/reference_sync.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/security_notify.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/pipeline/state_convergence.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/py.typed +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/redaction.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/store/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/store/audit_tee.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/store/keyprovider.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/timezone.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/base.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/database.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/dicom.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/dicomweb.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/fhir.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/file.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/framing.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/loopback.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/mllp.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/remotefile.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/rest.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/signing.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/smart.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/soap.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/tcp.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/timer.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/transports/x12.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/verify/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/verify/model.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/messagefoundry/verify/report.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/config/IB_ACME_ADT.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/config/IB_FHIR_INTAKE.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/config/IB_PARTNER_X12.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/config/IB_RADIOLOGY_SR.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/config/adt.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/config/codesets/event_labels.csv +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/config/codesets/facility_mnemonics.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/config/connections.toml +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/consistency/validated_adt.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/dicom/generate_sr_sample.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/adt_a01.hl7 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/adt_batch.hl7 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/README.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/messages/x12_270_eligibility.edi +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/results_relay/README.md +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/results_relay/codesets/test_codes.csv +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/results_relay/messages/oru_results.hl7 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/results_relay/results_relay.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/samples/send_mllp.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/console/install-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/console/pack_ico.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/dev/postgres.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/dev/sqlserver-docker.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/dev/sqlserver.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/publish/check_release_sync.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/publish/publish-denylist.txt +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/publish/publish.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/security/crypto_inventory_check.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/security/vuln_metrics.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/service/install-service.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/service/uninstall-service.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/trace_icon.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/worktree/new.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/worktree/remove.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/worktree/session-context.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/scripts/worktree/spawn.ps1 +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/__main__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/anon/__init__.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/anon/_hl7data.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/anon/_pools.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/anon/hl7.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/anon/keying.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/anon/rules.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/anon/surrogates.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/compare.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/correlate.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/hl7_fields.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/mefor_api.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/mllp.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/relay.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/report.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tee/store.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/_dicom_sample.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/_failover_load_support.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/_fhir_fixtures.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_acceptance_framework.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_active_environment.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_ad_group_scope.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_admin_new_ip.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_adr_analyze.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_ai_policy.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_alert_rules.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_alert_sinks.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_alerts_edit.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_alerts_rules_api.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_anon_integration.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_api.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_api_reload.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_api_tls.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_approvals.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_asvs_phase0.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_audit_integrity.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_audit_offbox_tee.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_auth_core.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_auth_entry_hardening.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_auth_hardening.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_auth_service.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_auth_session_lifecycle.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_auth_store.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_binary_carriage.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_cert_expiry.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_channel_rbac.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_checks.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_code_sets.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_connection_api.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_connection_resilience.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_connections_cli.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_connections_file.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_consistency.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_alerts.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_auth.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_client.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_dead_letters.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_hardening.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_password.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_sessions.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_step_up.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_theme.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_console_users.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_database_connector_integration.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_database_transport.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_db_lookup_live_runner.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_delivery_settings.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_dependency_boundaries.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_dicom_codec.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_dicom_scu.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_dicom_wiring.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_dicomweb.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_dryrun.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_ed_documents.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_ed_documents_e2e.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_egress_allowlist.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_environments.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_fhir_parsing.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_fhir_resource.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_fhir_transport.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_field_authz.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_generate_cli.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_generated_adt.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_generators_core.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_generators_types.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_groups.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_harness.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_harness_compose.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_harness_config.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_harness_faults.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_harness_file.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_harness_monitor.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_hl7_core_features.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_hl7schema.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_inbound_bind.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_ingest_time.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_keyprovider.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_last_resort.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_leader_tasks.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_load_corpus.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_load_metrics.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_load_profile.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_load_report.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_load_runner.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_load_sender.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_load_sink.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_message.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_message_split.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_metrics_exporter.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_mfa.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_mllp_encoding_override.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_mllp_tls.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_operability_config.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_outbound_signing.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_outbound_simulate.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_packaging.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_parse_tree.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_parsing.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_payload_agnostic_ingress.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_reconcile_capture.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_reconcile_compare.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_reconcile_harness.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_redaction.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_reference_sets.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_reingress.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_remotefile_transport.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_rest_transport.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_run_context.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_scaffold.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_secrets_dpapi.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_security_notify.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_security_static.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_service_control.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_settings.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_soap_transport.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_soap_wssecurity.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_sqlserver_coordinator.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_staged_pipeline.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_step_up.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_store_backend.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_store_file_hardening.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_store_read_pool.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_summary.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_task_resilience.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_tcp_transport.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_tee_cli.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_tee_compare.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_tee_correlate.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_tee_hl7_fields.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_tee_mefor_api.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_tee_mllp.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_tee_relay.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_tee_report.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_tee_store.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_timer_source.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_timezone.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_tls_policy.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_totp.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_transform_state.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_transports.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_version.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_win2025_acceptance.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_wiring.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_wiring_reload.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_wiring_serve.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_x12_parsing.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_x12_rte.py +0 -0
- {messagefoundry-0.2.0 → messagefoundry-0.2.2}/tests/test_x12_transport.py +0 -0
|
@@ -12,9 +12,14 @@ verify a report against current `main` before filing.
|
|
|
12
12
|
|
|
13
13
|
**Do not open a public issue for a vulnerability.** Instead, report it privately:
|
|
14
14
|
|
|
15
|
-
- Preferred
|
|
16
|
-
("Report a vulnerability")
|
|
17
|
-
|
|
15
|
+
- **Preferred (always available, fully private):** open a [GitHub private security advisory](https://github.com/wshallwshall/MessageFoundry/security/advisories/new)
|
|
16
|
+
("Report a vulnerability") — GitHub keeps it private to the maintainers until coordinated disclosure.
|
|
17
|
+
This is the recommended channel on both this repository and the public mirror.
|
|
18
|
+
- Alternatively, email the maintainer at the address on the GitHub profile.
|
|
19
|
+
|
|
20
|
+
If you cannot reach a maintainer privately within a few business days, you may request a contact via a
|
|
21
|
+
**non-detail** public issue (title only, e.g. "requesting a private security contact") — **never** put
|
|
22
|
+
vulnerability details, reproduction steps, or any message content in a public issue.
|
|
18
23
|
|
|
19
24
|
Please include: affected component (e.g. MLLP/file transport, store, API/auth, console),
|
|
20
25
|
a description and impact, and reproduction steps or a proof of concept. Do **not** include
|
|
@@ -31,7 +31,7 @@ jobs:
|
|
|
31
31
|
- name: Set up Python
|
|
32
32
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
33
33
|
with:
|
|
34
|
-
python-version: "3.
|
|
34
|
+
python-version: "3.14"
|
|
35
35
|
- name: Install project (dev)
|
|
36
36
|
run: |
|
|
37
37
|
python -m pip install --upgrade pip
|
|
@@ -92,7 +92,7 @@ jobs:
|
|
|
92
92
|
- name: Set up Python
|
|
93
93
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
94
94
|
with:
|
|
95
|
-
python-version: "3.
|
|
95
|
+
python-version: "3.14"
|
|
96
96
|
- name: Install project (dev + postgres)
|
|
97
97
|
run: |
|
|
98
98
|
python -m pip install --upgrade pip
|
|
@@ -159,7 +159,7 @@ jobs:
|
|
|
159
159
|
- name: Set up Python
|
|
160
160
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
161
161
|
with:
|
|
162
|
-
python-version: "3.
|
|
162
|
+
python-version: "3.14"
|
|
163
163
|
- name: Install Microsoft ODBC Driver 18 + sqlcmd
|
|
164
164
|
run: |
|
|
165
165
|
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc \
|
|
@@ -11,37 +11,23 @@ concurrency:
|
|
|
11
11
|
cancel-in-progress: true
|
|
12
12
|
|
|
13
13
|
jobs:
|
|
14
|
-
# Lint + type-check + unit tests.
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
# though Windows bills at 2x — testing the version we ship on the OS we ship it
|
|
19
|
-
# on is worth the minutes.
|
|
14
|
+
# Lint + type-check + unit tests. The project supports a single Python — 3.14 — so every leg runs it.
|
|
15
|
+
# Linux carries the cheap breadth (1x minutes); Windows Server 2022 + 2025 is the primary deployment
|
|
16
|
+
# target, so 3.14 is also exercised on both Server SKUs even though Windows bills at 2x — testing the
|
|
17
|
+
# version we ship on the OS we ship it on is worth the minutes.
|
|
20
18
|
test:
|
|
21
19
|
name: test (${{ matrix.os }}, py${{ matrix.python-version }})
|
|
22
20
|
runs-on: ${{ matrix.os }}
|
|
23
|
-
# py3.11 is a REQUIRED gate again (BACKLOG #17 RESOLVED in PR #448). The intermittent py3.11-only hang
|
|
24
|
-
# was root-caused — and reproduced on a Docker py3.11 box — as a CPython 3.11 asyncio cancellation race:
|
|
25
|
-
# cancelling a task parked in asyncio.Queue.get() can intermittently never complete (fixed in CPython
|
|
26
|
-
# 3.12, hence py3.13 was always clean and production — one long-lived loop — never hit it). TeeRelay.stop()
|
|
27
|
-
# tripped it; fixed via a sentinel shutdown in tee/relay.py, validated at 0 hangs across 24 full-suite +
|
|
28
|
-
# 40 isolated runs in the repro container and green on CI. So the advisory `continue-on-error` is removed
|
|
29
|
-
# and a py3.11 failure reds the build again. (The dormant `MEFOR_PY311_QUARANTINE` conftest lever stays as
|
|
30
|
-
# an off-by-default safety net; it is no longer needed.)
|
|
31
21
|
# Wall-clock backstop: bound each leg so a hung test fails in minutes, not the 6h default. The
|
|
32
22
|
# pytest-timeout watchdog (60s/test) should catch a culprit first; this is the belt-and-suspenders cap
|
|
33
|
-
# if a whole process ever deadlocks below pytest
|
|
23
|
+
# if a whole process ever deadlocks below pytest.
|
|
34
24
|
timeout-minutes: 15
|
|
35
25
|
strategy:
|
|
36
26
|
fail-fast: false
|
|
37
27
|
matrix:
|
|
38
28
|
include:
|
|
39
|
-
- { os: ubuntu-latest, python-version: "3.11" }
|
|
40
|
-
- { os: ubuntu-latest, python-version: "3.13" }
|
|
41
29
|
- { os: ubuntu-latest, python-version: "3.14" }
|
|
42
|
-
- { os: windows-2022, python-version: "3.13" }
|
|
43
30
|
- { os: windows-2022, python-version: "3.14" }
|
|
44
|
-
- { os: windows-2025, python-version: "3.13" }
|
|
45
31
|
- { os: windows-2025, python-version: "3.14" }
|
|
46
32
|
defaults:
|
|
47
33
|
run:
|
|
@@ -89,36 +75,6 @@ jobs:
|
|
|
89
75
|
QT_QPA_PLATFORM: offscreen
|
|
90
76
|
run: pytest -q
|
|
91
77
|
|
|
92
|
-
# BACKLOG #17 production-bug check. The intermittent py3.11 asyncio<->aiosqlite lost-wakeup hang has
|
|
93
|
-
# only ever surfaced under pytest (per-test event-loop churn + log-capture teardown are the suspected
|
|
94
|
-
# triggers). This job runs the store the way the engine does in PRODUCTION — one asyncio.run() loop,
|
|
95
|
-
# no pytest — and hammers aiosqlite with concurrent DB ops on py3.11. A clean pass is evidence the
|
|
96
|
-
# hang is a test-lifecycle artifact, not a product defect; a hang here (caught by the per-run
|
|
97
|
-
# `timeout`, exit 124) would be a real, pytest-free repro that flips it to a confirmed product bug.
|
|
98
|
-
py311-store-soak:
|
|
99
|
-
name: py3.11 store soak (BACKLOG #17)
|
|
100
|
-
runs-on: ubuntu-latest
|
|
101
|
-
timeout-minutes: 10
|
|
102
|
-
steps:
|
|
103
|
-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
104
|
-
- name: Set up Python 3.11
|
|
105
|
-
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
106
|
-
with:
|
|
107
|
-
python-version: "3.11"
|
|
108
|
-
cache: pip
|
|
109
|
-
cache-dependency-path: pyproject.toml
|
|
110
|
-
- name: Install project (base — no pytest, no console)
|
|
111
|
-
run: |
|
|
112
|
-
python -m pip install --upgrade pip
|
|
113
|
-
pip install -e .
|
|
114
|
-
- name: Soak the aiosqlite store on one long-lived loop (5x)
|
|
115
|
-
run: |
|
|
116
|
-
for run in $(seq 1 5); do
|
|
117
|
-
echo "::group::soak run $run"
|
|
118
|
-
timeout 150 python scripts/soak/store_soak.py 64 300
|
|
119
|
-
echo "::endgroup::"
|
|
120
|
-
done
|
|
121
|
-
|
|
122
78
|
# Build + type-check the VS Code extension, and run its integration tests. The Python jobs never
|
|
123
79
|
# touch ide/, so a dep bump or IDE code change that breaks the bundle or the types would otherwise
|
|
124
80
|
# pass CI unbuilt (this job exists because an esbuild bump merged "green" without anything having
|
|
@@ -235,7 +191,7 @@ jobs:
|
|
|
235
191
|
- name: Set up Python
|
|
236
192
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
237
193
|
with:
|
|
238
|
-
python-version: "3.
|
|
194
|
+
python-version: "3.14"
|
|
239
195
|
|
|
240
196
|
- name: Install Microsoft ODBC Driver 18 + sqlcmd
|
|
241
197
|
run: |
|
|
@@ -379,7 +335,7 @@ jobs:
|
|
|
379
335
|
- name: Set up Python
|
|
380
336
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
381
337
|
with:
|
|
382
|
-
python-version: "3.
|
|
338
|
+
python-version: "3.14"
|
|
383
339
|
|
|
384
340
|
- name: Install project (dev + postgres extras)
|
|
385
341
|
run: |
|
|
@@ -437,7 +393,7 @@ jobs:
|
|
|
437
393
|
- name: Set up Python
|
|
438
394
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
439
395
|
with:
|
|
440
|
-
python-version: "3.
|
|
396
|
+
python-version: "3.14"
|
|
441
397
|
|
|
442
398
|
- name: Install project (dev — engine + httpx client; no Qt needed for the headless load path)
|
|
443
399
|
run: |
|
|
@@ -509,7 +465,7 @@ jobs:
|
|
|
509
465
|
- name: Set up Python
|
|
510
466
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
511
467
|
with:
|
|
512
|
-
python-version: "3.
|
|
468
|
+
python-version: "3.14"
|
|
513
469
|
|
|
514
470
|
- name: Install Microsoft ODBC Driver 18 + sqlcmd
|
|
515
471
|
run: |
|
|
@@ -590,12 +546,11 @@ jobs:
|
|
|
590
546
|
strategy:
|
|
591
547
|
fail-fast: false
|
|
592
548
|
matrix:
|
|
593
|
-
# Windows Server 2022 + 2025 on the
|
|
594
|
-
#
|
|
595
|
-
#
|
|
549
|
+
# Windows Server 2022 + 2025 on the supported deploy Python (3.14), so the real NSSM
|
|
550
|
+
# install->serve->MLLP path is validated on the version we ship, on each Server SKU. This job
|
|
551
|
+
# is push/dispatch-only, so the Windows minutes cost no PR time.
|
|
596
552
|
include:
|
|
597
|
-
- { os: windows-2022, python-version: "3.
|
|
598
|
-
- { os: windows-2025, python-version: "3.13" }
|
|
553
|
+
- { os: windows-2022, python-version: "3.14" }
|
|
599
554
|
- { os: windows-2025, python-version: "3.14" }
|
|
600
555
|
defaults:
|
|
601
556
|
run:
|
|
@@ -802,9 +757,19 @@ jobs:
|
|
|
802
757
|
# A fully graceful shutdown exits 0 (uvicorn handles SIGTERM, runs the lifespan, returns); 143
|
|
803
758
|
# (128+SIGTERM) is acceptable too. 137 = SIGKILL after the grace expired = ungraceful.
|
|
804
759
|
if [ "$code" = "137" ]; then echo "FAIL: ungraceful shutdown (SIGKILL after grace)"; exit 1; fi
|
|
805
|
-
docker
|
|
806
|
-
|
|
807
|
-
|
|
760
|
+
# Poll for the marker: `docker stop` returns the instant the container exits, but the final
|
|
761
|
+
# buffered log line ("Application shutdown complete") can land in `docker logs` a beat later, so
|
|
762
|
+
# grepping once immediately is racy (a clean 143 shutdown then read as a missing marker). Retry
|
|
763
|
+
# for ~10s so a slow log flush is not misread as an incomplete lifespan shutdown.
|
|
764
|
+
for _ in $(seq 1 20); do
|
|
765
|
+
if docker logs mefor 2>&1 | grep -q "Application shutdown complete"; then
|
|
766
|
+
echo "graceful shutdown verified"; exit 0
|
|
767
|
+
fi
|
|
768
|
+
sleep 0.5
|
|
769
|
+
done
|
|
770
|
+
echo "FAIL: no clean-shutdown marker (lifespan shutdown did not complete)"
|
|
771
|
+
docker logs mefor 2>&1 | tail -20
|
|
772
|
+
exit 1
|
|
808
773
|
|
|
809
774
|
- name: Engine log (always)
|
|
810
775
|
if: always()
|
|
@@ -820,7 +785,7 @@ jobs:
|
|
|
820
785
|
# `windows-service-smoke`) report `skipped` on every PR — never the required context a PR waits
|
|
821
786
|
# on — so requiring them either no-ops or wedges; and
|
|
822
787
|
# * the matrix legs report an UNEXPANDED name when skipped (`... ${{ matrix.label }}`) but
|
|
823
|
-
# EXPANDED names when they run (`... 2022`/`2025`, `(windows-2022, py3.
|
|
788
|
+
# EXPANDED names when they run (`... 2022`/`2025`, `(windows-2022, py3.14)`), so no single
|
|
824
789
|
# context string matches both the skipped and the run state.
|
|
825
790
|
# This gate ALWAYS runs (if: always()), so it reports ONE fixed context ("CI gate") regardless of
|
|
826
791
|
# which legs ran, and fails iff a gated leg actually FAILED or was cancelled — a `skipped` leg
|
|
@@ -60,7 +60,7 @@ jobs:
|
|
|
60
60
|
# code runs in this job (uv lock --check + uv export only).
|
|
61
61
|
|
|
62
62
|
- name: Set up uv
|
|
63
|
-
uses: astral-sh/setup-uv@
|
|
63
|
+
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
64
64
|
|
|
65
65
|
- name: Re-export the lock files (DEP-1 — byte-for-byte identical flags/paths)
|
|
66
66
|
run: |
|
|
@@ -29,9 +29,15 @@ jobs:
|
|
|
29
29
|
fetch-depth: 0 # need the vX.Y.Z tags (the private-tag side of the check)
|
|
30
30
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
31
31
|
with:
|
|
32
|
-
python-version: "3.
|
|
32
|
+
python-version: "3.14"
|
|
33
33
|
- name: Check tag / PyPI / mirror are in sync
|
|
34
34
|
run: |
|
|
35
|
+
# The script lives under the deny-listed scripts/publish/, so it is ABSENT on the OSS mirror;
|
|
36
|
+
# the sync check only runs on the private repo (the publish source). Skip where it's absent.
|
|
37
|
+
if [ ! -f scripts/publish/check_release_sync.py ]; then
|
|
38
|
+
echo "scripts/publish/check_release_sync.py absent (OSS mirror) — skipping the release-sync check."
|
|
39
|
+
exit 0
|
|
40
|
+
fi
|
|
35
41
|
# `packaging` gives canonical version normalization (so a "0.1.0-rc1" tag and PyPI's
|
|
36
42
|
# "0.1.0rc1" compare equal); the script falls back to a naive form if it's absent.
|
|
37
43
|
python -m pip install --upgrade pip packaging
|
|
@@ -32,7 +32,7 @@ jobs:
|
|
|
32
32
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
33
33
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
34
34
|
with:
|
|
35
|
-
python-version: "3.
|
|
35
|
+
python-version: "3.14"
|
|
36
36
|
- name: Check the lockfile is in sync with pyproject (DEP-1)
|
|
37
37
|
run: |
|
|
38
38
|
python -m pip install --upgrade pip uv
|
|
@@ -94,11 +94,14 @@ jobs:
|
|
|
94
94
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
95
95
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
96
96
|
with:
|
|
97
|
-
python-version: "3.
|
|
97
|
+
python-version: "3.14"
|
|
98
98
|
- name: Generate a CycloneDX SBOM from the lockfile
|
|
99
99
|
run: |
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
# cyclonedx-bom~=7.3 (was ~=4.6): the 4.x line drags cyclonedx-python-lib 7.x → lxml<6, which
|
|
101
|
+
# has no cp314 wheel, so on the 3.14 runner pip source-builds lxml and fails. 7.3 → lxml 6.x
|
|
102
|
+
# (cp314 wheels). The 7.x `requirements` CLI renamed `--outfile` → `--output-file`.
|
|
103
|
+
python -m pip install --upgrade pip "cyclonedx-bom~=7.3"
|
|
104
|
+
cyclonedx-py requirements requirements.lock --output-format JSON --output-file sbom.cdx.json
|
|
102
105
|
- name: Upload the SBOM artifact
|
|
103
106
|
# SHA-pinned for supply-chain integrity, matching ci.yml's upload-artifact pin.
|
|
104
107
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
@@ -115,7 +118,7 @@ jobs:
|
|
|
115
118
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
116
119
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
117
120
|
with:
|
|
118
|
-
python-version: "3.
|
|
121
|
+
python-version: "3.14"
|
|
119
122
|
- name: Scan source for insecure patterns
|
|
120
123
|
run: |
|
|
121
124
|
# Pin bandit: an unpinned upgrade once silently changed `# nosec` parsing (1.9.x requires
|
|
@@ -162,7 +165,7 @@ jobs:
|
|
|
162
165
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
163
166
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
164
167
|
with:
|
|
165
|
-
python-version: "3.
|
|
168
|
+
python-version: "3.14"
|
|
166
169
|
- name: Run the MessageFoundry rules
|
|
167
170
|
run: |
|
|
168
171
|
python -m pip install --upgrade pip "semgrep~=1.90"
|
|
@@ -182,7 +185,7 @@ jobs:
|
|
|
182
185
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
183
186
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
184
187
|
with:
|
|
185
|
-
python-version: "3.
|
|
188
|
+
python-version: "3.14"
|
|
186
189
|
- name: Diff crypto call sites against the inventory
|
|
187
190
|
# Stdlib-only (no install). Exits non-zero — failing the build — on any drift.
|
|
188
191
|
run: python scripts/security/crypto_inventory_check.py
|
|
@@ -200,7 +203,14 @@ jobs:
|
|
|
200
203
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
201
204
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
202
205
|
with:
|
|
203
|
-
python-version: "3.
|
|
206
|
+
python-version: "3.14"
|
|
204
207
|
- name: Scan the publishable subset for forbidden content
|
|
205
|
-
# Stdlib-only scanner (no install). Exits non-zero — failing the build — on any hit.
|
|
206
|
-
|
|
208
|
+
# Stdlib-only scanner (no install). Exits non-zero — failing the build — on any hit. The scanner
|
|
209
|
+
# lives under the deny-listed scripts/publish/, so it is ABSENT on the OSS mirror — there's
|
|
210
|
+
# nothing to gate there (everything is already the published subset); skip rather than error.
|
|
211
|
+
run: |
|
|
212
|
+
if [ -f scripts/publish/scan_forbidden.py ]; then
|
|
213
|
+
python scripts/publish/scan_forbidden.py --published
|
|
214
|
+
else
|
|
215
|
+
echo "scripts/publish/scan_forbidden.py absent (OSS mirror) — skipping the publish leak-gate."
|
|
216
|
+
fi
|
|
@@ -25,7 +25,7 @@ jobs:
|
|
|
25
25
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
|
|
26
26
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
27
27
|
with:
|
|
28
|
-
python-version: "3.
|
|
28
|
+
python-version: "3.14"
|
|
29
29
|
- name: Compute the metrics (real Dependabot PRs + CISA KEV + FIRST EPSS)
|
|
30
30
|
env:
|
|
31
31
|
GH_TOKEN: ${{ github.token }} # gh auth for the read-only Dependabot-PR query
|
|
@@ -6,6 +6,72 @@ All notable changes to MessageFoundry are documented here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.2.2] — 2026-06-24 — Early Access
|
|
10
|
+
|
|
11
|
+
A security-hardening release: PHI-at-rest encryption is closed across every backend, the active-passive
|
|
12
|
+
cluster gains a store-checked split-brain fence, outbound delivery is effectively-once, and the at-rest
|
|
13
|
+
cipher becomes crypto-agile — all additive, with the on-disk `mfenc:v1` format byte-identical.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- **BREAKING — Python 3.14 is now the only supported runtime.** `requires-python` is raised to `>=3.14`
|
|
17
|
+
(was `>=3.11`), and the ruff/mypy targets, CI matrix (Linux + Windows Server 2022/2025, all on 3.14),
|
|
18
|
+
Docker base image, lockfiles, and adopter scaffold move with it. **Adopters and engine hosts must be on
|
|
19
|
+
Python 3.14** — a 3.11/3.12/3.13 host will refuse to install the wheel. The 3.11/3.12/3.13-specific test
|
|
20
|
+
apparatus is retired with this change (the `MEFOR_PY311_QUARANTINE` conftest lever, the `py3.11 store
|
|
21
|
+
soak` CI job, and `scripts/soak/store_soak.py`; the underlying BACKLOG #17 asyncio↔aiosqlite concern is
|
|
22
|
+
still mitigated by the shared session loop in `pyproject.toml`).
|
|
23
|
+
|
|
24
|
+
### Security
|
|
25
|
+
- **PHI-at-rest encryption closed across all three backends.** The patient `summary` (MRN + name) and
|
|
26
|
+
`metadata` columns are now encrypted at rest (previously cleartext even with encryption enabled), and the
|
|
27
|
+
SQL Server `error` / `last_error` / `message_events.detail` columns are brought to parity with SQLite and
|
|
28
|
+
Postgres — every cipher column is now AES-256-GCM at rest. Coverage is surfaced by a new authenticated,
|
|
29
|
+
audited `GET /security/posture` route (reports the active-key fingerprint + per-backend column coverage;
|
|
30
|
+
never key bytes).
|
|
31
|
+
- **Fail-closed for PHI without a key.** An instance declared `data_class = phi` now **refuses to start**
|
|
32
|
+
without an encryption key (previously it started in cleartext with a warning), unless explicitly overridden
|
|
33
|
+
by the new, audited `[store].allow_unencrypted_phi`.
|
|
34
|
+
- **Crypto-agility marker (additive).** The at-rest cipher marker is now version/algorithm-aware
|
|
35
|
+
(`mfenc:v2:<alg>:…`) so a future algorithm can be introduced without a data migration. The `mfenc:v1`
|
|
36
|
+
format is byte-identical and AES-256-GCM remains the only algorithm; decryption fails closed on an unknown
|
|
37
|
+
marker version or algorithm.
|
|
38
|
+
- **Database-TLS hardening.** A new `[store].ssl_root_cert` pins a private database CA (Postgres), with
|
|
39
|
+
machine-store CA-import and certificate-rotation operator runbooks. The DPAPI key file's ACL now grants the
|
|
40
|
+
service account read access without broadening exposure.
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
- **Active-passive split-brain fence.** A monotonic leader-epoch fencing token on the leadership lease,
|
|
44
|
+
validated inside the FIFO claim transaction, so a superseded or paused ex-leader that resumes is fenced out
|
|
45
|
+
(it claims nothing) — backed by continuous "at most one leader" SLO checks and a real-handover failover
|
|
46
|
+
test. SQLite (single-node) behavior is unchanged.
|
|
47
|
+
- **Effectively-once outbound delivery.** A same-transaction idempotency ledger skips re-delivery of an
|
|
48
|
+
already-delivered message after a failover or crash-recovery re-claim, without re-ordering a lane; an
|
|
49
|
+
operator-initiated replay still re-sends.
|
|
50
|
+
- **Pre-side-effect leadership re-checks** so a node that loses leadership between claiming and sending
|
|
51
|
+
re-queues the work rather than emitting it as a stale leader.
|
|
52
|
+
- `messagefoundry verify --check-disposition` for post-deploy disposition validation.
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
- CycloneDX SBOM generation on Python 3.14.
|
|
56
|
+
- PyPI long-description rendering (version pins, links).
|
|
57
|
+
- De-flaked several intermittent CI tests (failover-load timeouts, a harness server port-bind race, the
|
|
58
|
+
startup fault-isolation recovery assertion, and the docker-smoke shutdown-marker check).
|
|
59
|
+
|
|
60
|
+
## [0.2.1] — 2026-06-23 — Early Access
|
|
61
|
+
|
|
62
|
+
### Fixed
|
|
63
|
+
- **Windows: `messagefoundry --help` crashed on a legacy codepage** — the top-level help rendered a
|
|
64
|
+
non-cp1252 character (a `->` arrow in the `adr-analyze` subcommand help, new in 0.2.0), so `--help`
|
|
65
|
+
aborted with `UnicodeEncodeError` on a cp1252/charmap console (cmd, PowerShell, or any redirected
|
|
66
|
+
stdout). `main()` now reconfigures stdout/stderr with `errors="replace"` and the help text is ASCII;
|
|
67
|
+
the machine-read JSON introspection subcommands are unaffected (`json.dumps(ensure_ascii=True)`).
|
|
68
|
+
- **`verify --section host` crashed without the `[console]` extra** — `check_console_no_window()`
|
|
69
|
+
resolved a console submodule via `find_spec`, which imported the console package and its eager `httpx`
|
|
70
|
+
dependency, so a `[sqlserver]`-only install aborted with `ModuleNotFoundError: No module named 'httpx'`
|
|
71
|
+
instead of skipping the console check. The console package now imports its API client lazily (PEP 562
|
|
72
|
+
`__getattr__`), so resolving a submodule no longer requires `httpx`, and the check degrades to SKIP if a
|
|
73
|
+
console dependency is absent.
|
|
74
|
+
|
|
9
75
|
## [0.2.0] — 2026-06-23 — Early Access
|
|
10
76
|
|
|
11
77
|
### Added
|
|
@@ -75,5 +141,7 @@ tests, but the external code review + penetration test (the bar for a security-c
|
|
|
75
141
|
- Releases are built, SBOM'd (CycloneDX), and signed with [Sigstore](https://www.sigstore.dev/) — see the
|
|
76
142
|
`release` workflow.
|
|
77
143
|
|
|
78
|
-
[Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.1
|
|
144
|
+
[Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.1...HEAD
|
|
145
|
+
[0.2.1]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.0...v0.2.1
|
|
146
|
+
[0.2.0]: https://github.com/wshallwshall/MessageFoundry/compare/v0.1.0...v0.2.0
|
|
79
147
|
[0.1.0]: https://github.com/wshallwshall/MessageFoundry/releases/tag/v0.1.0
|
|
@@ -242,7 +242,7 @@ diverge enough to warrant it; keep this root file general.
|
|
|
242
242
|
|
|
243
243
|
## 6. Python Code Standards
|
|
244
244
|
|
|
245
|
-
- Target **Python 3.
|
|
245
|
+
- Target **Python 3.14+** (the project requires `>=3.14`). Type-hint all public functions/attributes — **mypy runs in strict
|
|
246
246
|
mode**.
|
|
247
247
|
- **asyncio core:** never block the event loop; use `aiosqlite` and async connectors. Long
|
|
248
248
|
loops/workers must be **cooperatively cancellable** (respond to the connection's stop signal)
|
|
@@ -41,7 +41,7 @@ maintainer.)
|
|
|
41
41
|
to `main` are blocked. Keep commits coherent (one logical layer per commit) with clear messages.
|
|
42
42
|
2. **Set up the environment** (Windows/PowerShell shown; adapt for your OS):
|
|
43
43
|
```powershell
|
|
44
|
-
py -3.
|
|
44
|
+
py -3.14 -m venv .venv
|
|
45
45
|
.\.venv\Scripts\Activate.ps1
|
|
46
46
|
pip install -e ".[dev,console]"
|
|
47
47
|
```
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: messagefoundry
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Open-source healthcare integration engine — route, transform, and validate messages across many formats and connection types
|
|
5
5
|
License-Expression: AGPL-3.0-or-later
|
|
6
6
|
License-File: LICENSE
|
|
7
7
|
License-File: NOTICE
|
|
8
|
-
Requires-Python: >=3.
|
|
8
|
+
Requires-Python: >=3.14
|
|
9
9
|
Requires-Dist: aiosqlite>=0.20
|
|
10
10
|
Requires-Dist: argon2-cffi>=23.1
|
|
11
11
|
Requires-Dist: cryptography>=48.0.1
|
|
@@ -55,14 +55,15 @@ Description-Content-Type: text/markdown
|
|
|
55
55
|
|
|
56
56
|
[](https://github.com/wshallwshall/MessageFoundry/actions/workflows/ci.yml)
|
|
57
57
|
[](https://github.com/wshallwshall/MessageFoundry/actions/workflows/security.yml)
|
|
58
|
-
[](LICENSE)
|
|
59
|
-
[](https://github.com/wshallwshall/MessageFoundry/blob/main/LICENSE)
|
|
59
|
+
[](https://github.com/wshallwshall/MessageFoundry/blob/main/pyproject.toml)
|
|
60
60
|
|
|
61
|
-
MessageFoundry is an **open-source integration engine
|
|
62
|
-
business systems
|
|
63
|
-
XML/SOAP, X12, database records) and connection types
|
|
64
|
-
|
|
65
|
-
|
|
61
|
+
MessageFoundry is an **open-source healthcare integration engine** — a modern, Python-native HL7
|
|
62
|
+
interface engine. It connects clinical and business systems by routing, transforming, and validating
|
|
63
|
+
messages across many formats (HL7 v2, JSON, XML/SOAP, X12, database records) and connection types
|
|
64
|
+
(MLLP, MLLP-over-TLS, TCP, HTTP/REST, SOAP, FHIR, DICOM, database, files, SFTP/FTP). Configure it with
|
|
65
|
+
guided tooling or extend it in Python; it runs on SQLite, PostgreSQL, or SQL Server with
|
|
66
|
+
authentication, RBAC, audit logging, and encryption-at-rest built in.
|
|
66
67
|
|
|
67
68
|
> Python import package: `messagefoundry`. Built with **hl7apy** + **python-hl7** (HL7 parsing/
|
|
68
69
|
> validation), **FastAPI** (engine API), and **PySide6** (admin console).
|
|
@@ -82,10 +83,10 @@ The PySide6 console talks to it over a localhost HTTP + WebSocket API — the sa
|
|
|
82
83
|
whether the engine runs in-process, as a local daemon, or (later) on a remote host.
|
|
83
84
|
No hand-rolled IPC; the deployment split is a config choice, not an architectural fork.
|
|
84
85
|
|
|
85
|
-
See **[docs/architecture-diagram.md](docs/architecture-diagram.md)** for the rendered diagrams —
|
|
86
|
+
See **[docs/architecture-diagram.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/architecture-diagram.md)** for the rendered diagrams —
|
|
86
87
|
system topology, runtime message flow through the staged queue, and the config wiring graph (Mermaid,
|
|
87
88
|
renders on GitHub and in the VS Code preview). The prose source of truth is
|
|
88
|
-
[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
|
|
89
|
+
[docs/ARCHITECTURE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/ARCHITECTURE.md).
|
|
89
90
|
|
|
90
91
|
### Key decisions
|
|
91
92
|
- **Reliable by default.** A durable, transactional pipeline gives at-least-once delivery,
|
|
@@ -97,9 +98,9 @@ renders on GitHub and in the VS Code preview). The prose source of truth is
|
|
|
97
98
|
Python (`inbound`/`outbound`/`@router`/`@handler`) for full control — always version-controlled.
|
|
98
99
|
The database holds runtime state and messages only, never configuration.
|
|
99
100
|
- **PHI is first-class.** Authentication, RBAC, a user-attributed audit log of message
|
|
100
|
-
views/replays,
|
|
101
|
-
|
|
102
|
-
data-protection map.
|
|
101
|
+
views/replays, **encryption-at-rest** for message bodies (AES-256-GCM), **global PHI log redaction**,
|
|
102
|
+
and **transport TLS** (HTTPS/WSS for the API plus MLLP-over-TLS) are **built**; MFA and off-box log
|
|
103
|
+
shipping remain on the roadmap. See [docs/PHI.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/PHI.md) for the full data-protection map.
|
|
103
104
|
|
|
104
105
|
## Roadmap
|
|
105
106
|
|
|
@@ -132,26 +133,26 @@ renders on GitHub and in the VS Code preview). The prose source of truth is
|
|
|
132
133
|
failover-load test harness (kill-the-primary-under-load), on **both** PostgreSQL and SQL Server
|
|
133
134
|
- [x] **Native transport TLS** — in-process API TLS (HTTPS/WSS) and MLLP-over-TLS, with an off-loopback
|
|
134
135
|
bind guard and a certificate-expiry monitor
|
|
135
|
-
- [x] Published throughput + active-passive failover **baseline** ([docs/benchmarks/TUNING-BASELINE.md](docs/benchmarks/TUNING-BASELINE.md))
|
|
136
|
+
- [x] Published throughput + active-passive failover **baseline** ([docs/benchmarks/TUNING-BASELINE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/benchmarks/TUNING-BASELINE.md))
|
|
136
137
|
- [x] **SMART Backend Services token provider** — OAuth2 `client_credentials` + signed-JWT
|
|
137
138
|
`client_assertion` (RS384/ES384) authenticating the FHIR/REST outbound against real SMART-secured
|
|
138
139
|
servers (Epic, Oracle Health); a `with_smart_backend()` composer over `FHIR()`/`Rest()` that mints,
|
|
139
140
|
caches, and re-mints (on 401) a short-lived bearer, token endpoint gated by `[egress].allowed_http`
|
|
140
|
-
([ADR 0024](docs/adr/0024-smart-backend-services-token-provider.md))
|
|
141
|
+
([ADR 0024](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0024-smart-backend-services-token-provider.md))
|
|
141
142
|
- [x] **base64 binary-carriage codec** — an `mfb64:v1:` marker carries arbitrary NUL-safe **bytes** over
|
|
142
143
|
the str/TEXT ingress + store (`RawMessage.from_bytes()`/`.raw_bytes`/`.binary()`/`.is_binary`), plus
|
|
143
|
-
HL7 OBX-5 ED (Encapsulated Data) embedding helpers ([ADR 0028](docs/adr/0028-base64-binary-carriage-codec.md))
|
|
144
|
+
HL7 OBX-5 ED (Encapsulated Data) embedding helpers ([ADR 0028](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0028-base64-binary-carriage-codec.md))
|
|
144
145
|
- [x] **DICOM codec + C-STORE SCP** (Phase 1) — a pure codec (routing peek, headers/Structured Report,
|
|
145
146
|
code-first SR→HL7 mapping helpers; **headers + SR only, no pixel data**) on `content_type=dicom`
|
|
146
|
-
payload-agnostic ingress, plus an inbound C-STORE SCP listener (`DICOM()`) ([ADR 0025](docs/adr/0025-dicom-codec-store-connectors.md))
|
|
147
|
+
payload-agnostic ingress, plus an inbound C-STORE SCP listener (`DICOM()`) ([ADR 0025](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0025-dicom-codec-store-connectors.md))
|
|
147
148
|
- [x] **Anonymizer / de-identification** — builds PHI-free test datasets from real traffic with
|
|
148
149
|
deterministic secret-per-dataset pseudonymization, field-anchored site-code scrub, and fail-closed
|
|
149
150
|
emission (never an un-scrubbed body), via a `tee anonymize-captures` subcommand and test-harness
|
|
150
|
-
hooks ([ADR 0030](docs/adr/0030-anonymization-test-harness-tee.md))
|
|
151
|
+
hooks ([ADR 0030](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0030-anonymization-test-harness-tee.md))
|
|
151
152
|
|
|
152
153
|
**Later** — higher-throughput delivery (a pooled/persistent MLLP connector); a read-only **component
|
|
153
154
|
SDK** (fork-to-customize); DICOM Phase 2 (C-STORE SCU + C-ECHO + DICOMweb STOW-RS, designed); MFA and
|
|
154
|
-
off-box log shipping. See [docs/EARLY-ADOPTER-GUIDE.md](docs/EARLY-ADOPTER-GUIDE.md) §2 for the current
|
|
155
|
+
off-box log shipping. See [docs/EARLY-ADOPTER-GUIDE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/EARLY-ADOPTER-GUIDE.md) §2 for the current
|
|
155
156
|
built-vs-experimental map.
|
|
156
157
|
|
|
157
158
|
Horizontal **active-active** scale-out (the multi-node cluster path) was **dropped on 2026-06-18 and
|
|
@@ -163,24 +164,24 @@ supported HA model.
|
|
|
163
164
|
**The recommended way to deploy MessageFoundry is to install the published package from
|
|
164
165
|
[PyPI](https://pypi.org/project/messagefoundry/)** — a signed, version-pinned wheel is the
|
|
165
166
|
supported production artifact, with no source checkout required. Install it as a **pinned
|
|
166
|
-
dependency**, then scaffold your own config repo ([ADR 0017](docs/adr/0017-consumer-deployment-model.md)):
|
|
167
|
+
dependency**, then scaffold your own config repo ([ADR 0017](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0017-consumer-deployment-model.md)):
|
|
167
168
|
|
|
168
169
|
```bash
|
|
169
|
-
pip install "messagefoundry==0.2.
|
|
170
|
+
pip install "messagefoundry==0.2.1" # pin the exact engine version (core runtime, SQLite store)
|
|
170
171
|
messagefoundry init ./my-config-repo # scaffold a standalone config repo
|
|
171
172
|
cd ./my-config-repo
|
|
172
173
|
messagefoundry serve --config config --env dev
|
|
173
174
|
```
|
|
174
175
|
|
|
175
|
-
`0.2.
|
|
176
|
+
`0.2.1` is the current **Early Access** release on PyPI. Always **pin the exact version** so
|
|
176
177
|
upgrades stay deliberate. Add the extras your deployment needs (each is opt-in and lazy-imported):
|
|
177
178
|
|
|
178
179
|
```bash
|
|
179
|
-
pip install "messagefoundry[postgres]==0.2.
|
|
180
|
-
pip install "messagefoundry[sqlserver]==0.2.
|
|
181
|
-
pip install "messagefoundry[console]==0.2.
|
|
182
|
-
pip install "messagefoundry[sftp]==0.2.
|
|
183
|
-
pip install "messagefoundry[dicom]==0.2.
|
|
180
|
+
pip install "messagefoundry[postgres]==0.2.1" # PostgreSQL store backend (production server DB)
|
|
181
|
+
pip install "messagefoundry[sqlserver]==0.2.1" # SQL Server store backend (+ OS-level ODBC Driver 18)
|
|
182
|
+
pip install "messagefoundry[console]==0.2.1" # PySide6 admin console
|
|
183
|
+
pip install "messagefoundry[sftp]==0.2.1" # SFTP transport for the REMOTEFILE connector
|
|
184
|
+
pip install "messagefoundry[dicom]==0.2.1" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
|
|
184
185
|
```
|
|
185
186
|
|
|
186
187
|
> **Verify before you install (supply chain).** Every release is built by a GitHub Actions workflow,
|
|
@@ -192,7 +193,7 @@ pip install "messagefoundry[dicom]==0.2.0" # DICOM codec + C-STORE SCP (py
|
|
|
192
193
|
>
|
|
193
194
|
> *(Engine developers install from a checkout instead — see [Development](#development).)*
|
|
194
195
|
|
|
195
|
-
Piloting MessageFoundry? The **[Early-Adopter Installation & Rollout Guide](docs/EARLY-ADOPTER-GUIDE.md)**
|
|
196
|
+
Piloting MessageFoundry? The **[Early-Adopter Installation & Rollout Guide](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/EARLY-ADOPTER-GUIDE.md)**
|
|
196
197
|
takes you from first install through a staged, go/no-go-gated path to full production
|
|
197
198
|
(Lab → Shadow/Parallel → Limited → Full). It leads with an honest built-vs-experimental
|
|
198
199
|
maturity map and covers prerequisites, install, security/PHI hardening, reliability
|
|
@@ -224,24 +225,24 @@ python -m messagefoundry.console --url http://127.0.0.1:8765
|
|
|
224
225
|
|
|
225
226
|
### VS Code extension & test harness
|
|
226
227
|
|
|
227
|
-
- **VS Code extension** ([`ide/`](ide/)) — author and test interfaces in your editor: a New Route
|
|
228
|
+
- **VS Code extension** ([`ide/`](https://github.com/wshallwshall/MessageFoundry/tree/main/ide/)) — author and test interfaces in your editor: a New Route
|
|
228
229
|
Wizard, validate-on-save, a Test Bench (dry-run `.hl7` files with before/after diffs), Stage →
|
|
229
230
|
Promote to a running engine, and an HL7-aware `@messagefoundry` chat participant. Open the `ide/`
|
|
230
|
-
folder in VS Code and press **F5**, or see [ide/README.md](ide/README.md).
|
|
231
|
+
folder in VS Code and press **F5**, or see [ide/README.md](https://github.com/wshallwshall/MessageFoundry/blob/main/ide/README.md).
|
|
231
232
|
- **Test harness** — a standalone PySide6 send/receive MLLP tool for exercising the engine with
|
|
232
233
|
synthetic, PHI-free traffic: `python -m harness`.
|
|
233
234
|
|
|
234
235
|
## License
|
|
235
236
|
|
|
236
237
|
MessageFoundry is licensed under the **GNU Affero General Public License v3.0 or later**
|
|
237
|
-
(`AGPL-3.0-or-later`) — see [LICENSE](LICENSE). Running a modified version as a network service
|
|
238
|
+
(`AGPL-3.0-or-later`) — see [LICENSE](https://github.com/wshallwshall/MessageFoundry/blob/main/LICENSE). Running a modified version as a network service
|
|
238
239
|
triggers the AGPL's §13 source-offer obligation. A separately-licensed commercial edition is planned
|
|
239
240
|
by **MessageFoundry Organization** under the standard open-core model — see
|
|
240
|
-
[COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md) (terms pending legal review). See [NOTICE](NOTICE)
|
|
241
|
+
[COMMERCIAL-LICENSE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/COMMERCIAL-LICENSE.md) (terms pending legal review). See [NOTICE](https://github.com/wshallwshall/MessageFoundry/blob/main/NOTICE)
|
|
241
242
|
for copyright and attribution.
|
|
242
243
|
|
|
243
244
|
## Contributing
|
|
244
245
|
|
|
245
|
-
Contributions are welcome — see [CONTRIBUTING.md](CONTRIBUTING.md), our
|
|
246
|
-
[Code of Conduct](CODE_OF_CONDUCT.md), and how the project is governed in [GOVERNANCE.md](GOVERNANCE.md).
|
|
247
|
-
A signed [Contributor License Agreement](CLA.md) is required before a pull request can be merged.
|
|
246
|
+
Contributions are welcome — see [CONTRIBUTING.md](https://github.com/wshallwshall/MessageFoundry/blob/main/CONTRIBUTING.md), our
|
|
247
|
+
[Code of Conduct](https://github.com/wshallwshall/MessageFoundry/blob/main/CODE_OF_CONDUCT.md), and how the project is governed in [GOVERNANCE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/GOVERNANCE.md).
|
|
248
|
+
A signed [Contributor License Agreement](https://github.com/wshallwshall/MessageFoundry/blob/main/CLA.md) is required before a pull request can be merged.
|