messagefoundry 0.2.12__tar.gz → 0.2.13__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.12 → messagefoundry-0.2.13}/.github/workflows/benchmark.yml +2 -2
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/ci.yml +1 -1
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/CHANGELOG.md +40 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/PKG-INFO +1 -1
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/compose.yaml +1 -1
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/BACKLOG.md +86 -3
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/CLOUD-DEPLOYMENT.md +1 -1
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/CLUSTERING.md +1 -1
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/CONFIGURATION.md +2 -2
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/DEPLOY-SERVER-DB.md +34 -1
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/MENTAL-MODEL.md +1 -1
- messagefoundry-0.2.13/docs/THROUGHPUT.md +304 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0037-multi-process-sharding-l3.md +6 -0
- messagefoundry-0.2.13/docs/adr/0062-default-store-pool-size.md +137 -0
- messagefoundry-0.2.13/docs/adr/0063-no-split-store-unified-store-for-sharding.md +101 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/throughput-build-plan.md +3 -3
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/throughput-roadmap.md +2 -2
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/__init__.py +1 -1
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/__main__.py +17 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/settings.py +3 -2
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/sharding.py +37 -2
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/supervisor.py +10 -2
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/wiring_runner.py +11 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/base.py +41 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connscale_postgres.py +1 -1
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_settings.py +66 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_sharding.py +39 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.claude/settings.json +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.dockerignore +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.gitattributes +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/CODEOWNERS +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/SECURITY.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/dependabot.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/cla.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/codeql.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/dependabot-auto-merge.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/dependabot-lock-resync.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/freethread-smoke.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/manifest-lint.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/release-sync-check.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/release.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/scorecard.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/security.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/selfhosted-win2025-sql.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/workflows/vuln-metrics.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.github/zizmor.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.gitignore +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.gitleaks.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.mefor-hooks/pre-commit +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.pre-commit-config.yaml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/.semgrep/messagefoundry.yml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/CLA.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/CLAUDE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/CODE_OF_CONDUCT.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/COMMERCIAL-LICENSE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/CONTRIBUTING.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/GOVERNANCE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/LICENSE +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/MAINTAINERS.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/NOTICE +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/Dockerfile +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/k8s/ha-postgres.yaml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/k8s/secret.example.yaml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/k8s/statefulset.yaml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/locks/requirements-core.lock +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/locks/requirements-sqlserver.lock +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/secrets.env.example +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/smoke/Dockerfile +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/smoke/config/IB_Test_ADT.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docker/smoke/send_adt.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/ADOPTER-CI.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/AI.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/ANTIVIRUS-FIREWALL.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/ARCHITECTURE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/BRAND.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/CI-QUALITY.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/CLOUD-PHI-HIPAA.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/CODESETS.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/CONNECTIONS.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/CONTAINER-EXPOSURE-EVALUATION.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/DEPLOYMENT.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/DICOM.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/DUAL_LICENSING_PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/FEATURE-MAP.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/HL7-VALIDATION.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/INSTALL-GUIDE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/LOAD-TESTING.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/MessageFoundry-Mental-Model.docx +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/PHI.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/POSITIONING.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/REMOTE-CONSOLE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/SECURITY-REMEDIATION-LEDGER.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/SECURITY.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/SERVICE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/SUPPORT-POLICY.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/SYSTEM-REQUIREMENTS.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/Secure_AI_Development_Standards.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/Secure_Development_Standards.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/TEE-RELAY.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/THROUGHPUT-IMPROVEMENTS.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/USER-GUIDE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/WORKTREES.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0001-staged-pipeline-architecture.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0005-transform-accessible-state.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0006-external-data-lookups.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0008-cluster-observability-api.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0009-run-scoped-context-providers.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0011-timer-scheduled-source.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0012-x12-edi-codec.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0013-increment-2-reingress-design.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0013-query-response-orchestration.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0014-alerting-rules-engine.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0017-consumer-deployment-model.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0023-inbound-http-listener.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0026-off-box-egress-update-check.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0027-per-connection-retention.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0029-email-smtp-destination.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0032-console-desktop-launch.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0033-gui-manageable-code-sets.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0034-static-analysis-triage-policy-accepted-risk-register.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0035-ide-extension-workspace-trust-and-scope.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0036-windows-config-source-trust.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0038-internal-pass-through-connector.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0039-database-tier-sharding-l5.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0040-free-threaded-engine-support.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0041-load-path-attestation-and-change-attribution.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0042-embedded-document-pruning.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0043-fhir-read-lookup.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0044-operator-alert-state.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0045-custom-rbac-roles.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0046-message-content-search.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0047-cloud-kubernetes-ha-deployment-packaging.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0048-third-tier-disaster-recovery-standby.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0049-turnkey-dr-backup-restore-verify.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0050-single-project-root-config-anchoring.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0051-corepoint-throughput-parity-strategy.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0052-enterprise-scale-target.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0053-free-threaded-multicore-engine.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0054-low-allocation-builtins-hl7-parser.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0055-group-commit-durable-write.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0056-engine-managed-vip-failover.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0057-inline-step-a-fast-path.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0058-batch-claim-fifo-prefix.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0059-seq-only-fifo-ordering.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0060-rename-based-fifo-index-migration.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/0061-per-lane-wake-events.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/adr/TEMPLATE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/architecture-components.png +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/architecture-components.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/architecture-config-graph.png +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/architecture-config-graph.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/architecture-diagram.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/architecture-message-flow.png +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/architecture-message-flow.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/architecture-topology.png +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/architecture-topology.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/benchmarks/TUNING-BASELINE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/benchmarks/step-b-write-amplification.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/design/dbshard.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/design/freethread-spike.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/design/freethread.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/design/multiproc.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/hl7-message-ordering-reference.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/message-ordering-design.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN-4.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN-5.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN-6.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/v0.1-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/research/cloud-deployment-research-2026-06.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/research/config-ux-review.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/research/non-hl7-transform-components.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/ADVISORY-PROCESS.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/ASVS-L3-STATUS.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/BEYOND-ASVS-L3.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/DEPENDENCY-METRICS.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/PHASE-8C-RBAC.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/PUBLISHING.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/RCA-TEMPLATE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/RELEASE-GATE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/REVIEW-2026-06-07.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/SECURITY-POSTURE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/security/THREAT-MODEL.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/testing/VERIFY.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/environments/dev.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/environments/prod.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/__main__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/acceptance/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/acceptance/__main__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/acceptance/matrix.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/acceptance/probes.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/acceptance/report.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/acceptance/runner.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/compose.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/config/connscale/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/config/connscale/_shape.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/config/connscale/gen_toml.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/config/connscale/graph.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/config/coverage.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/config/load/_shape.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/config/load/graph.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/config/passthrough/graph.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/config/store_once/graph.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/file_panel.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/file_transport.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/connscale/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/connscale/driver.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/connscale/probe.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/connscale/profile.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/connscale/report.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/connscale/runner.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/corpus.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/correlator.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/enginepoll.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/failover.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/failover_track.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/governor.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/ids.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/metrics.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profile.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/adt-fanout-stress.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/closed-loop.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/connscale-smoke.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/connscale.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/failover.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/fanout-baseline.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/malformed-load.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/reference.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/smoke-sqlserver.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/smoke.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/soak.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/spike-burst.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/sustained-overload.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/profiles/writeamp.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/report.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/runner.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/sender.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/load/sink.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/mllp.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/monitor.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/receive.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/reconcile/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/reconcile/__main__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/reconcile/capture.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/reconcile/compare.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/reconcile/normalize.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/reconcile/report.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/scenarios.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/send.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/harness/window.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/.gitignore +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/.vscodeignore +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/esbuild.js +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/media/hl7schema.json +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/media/icon-amber.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/media/icon.png +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/media/icon.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/package-lock.json +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/package.json +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/snippets/messagefoundry.code-snippets +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/aiPolicy.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/alertEditor.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/auth.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/chat.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/cli.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/codeSetEditor.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/codesetsTree.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/completion.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/connectionEditor.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/editorToolbar.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/engineClient.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/engineTarget.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/extension.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/generate.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/git.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/graphTree.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/home.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/insertElement.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/newRoute.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/promote.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/promoteTarget.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/sourceControl.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/test/runTest.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/test/suite/ai-policy.test.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/test/suite/chat.test.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/test/suite/editor-toolbar.test.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/test/suite/engine-target.test.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/test/suite/extension.test.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/test/suite/index.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/test/suite/insert-element.test.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/test/suite/promote-target.test.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/test/suite/pythonpath.test.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/test/suite/settings-scope.test.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/testBench.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/src/validate.ts +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/tsconfig.json +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/ide/tsconfig.test.json +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/mefor.code-workspace +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/adr_analyze.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/anon/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/anon/_pools.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/anon/hl7.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/anon/keying.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/anon/leak.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/anon/rules.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/anon/surrogates.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/api/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/api/app.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/api/approvals.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/api/auth_models.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/api/auth_routes.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/api/field_authz.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/api/metrics.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/api/models.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/api/security.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/api/tls.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/data/common_passwords.txt +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/identity.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/ldap.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/notifications.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/passwords.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/permissions.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/policy.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/ratelimit.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/service.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/tokens.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/auth/totp.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/checks.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/active_environment.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/ai_policy.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/alerts_edit.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/anchor.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/code_sets.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/codeset_edit.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/connections_edit.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/connections_file.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/db_lookup.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/environments.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/fhir_lookup.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/fingerprint.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/ingest_time.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/models.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/reference.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/response.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/run_context.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/state.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/tls_policy.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/config/wiring.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/__main__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/_async.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/alerts_page.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/change_password.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/client.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/connections.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/dead_letters_page.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/delegates.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/event_log_page.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/icons/alerts.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/icons/connections.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/icons/dead-letters.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/icons/engine-status.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/icons/log-search.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/icons/logo-lockup.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/icons/users.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/login.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/mfa.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/reauth.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/resources/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/resources/app.ico +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/resources/app.svg +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/search.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/service_control.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/sessions.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/shards.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/shell.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/status.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/theme.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/users_page.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/console/widgets.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/_core.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/_hl7data.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/adt.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/all_types.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/bar.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/dft.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/documents.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/mdm.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/mfn.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/oml.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/orl.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/orm.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/oru.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/ras.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/rde.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/siu.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/generators/vxu.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/hl7schema.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/integrity.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/last_resort.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/logging_setup.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/_backend.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/_builtin_hl7.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/binary.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/consistency.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/_deps.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/_util.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/dataset.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/errors.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/peek.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/fhir/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/fhir/_deps.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/fhir/errors.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/fhir/peek.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/fhir/resource.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/groups.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/message.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/peek.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/split.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/summary.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/tree.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/validate.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/_deps.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/delimiters.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/errors.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/interchange.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/message.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/peek.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/validate.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/_deps.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/errors.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/harden.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/message.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/schema.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/signature.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/alert_sinks.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/alerts.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/cert_expiry.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/cluster.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/config_convergence.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/connscale_shim.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/dr.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/dr_backup.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/dryrun.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/engine.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/leader_tasks.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/reference_sync.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/retention.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/security_notify.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/state_convergence.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/pipeline/update_check.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/py.typed +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/redaction.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/scaffold.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/secrets_dpapi.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/audit_tee.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/backup_codec.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/content_search.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/crypto.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/document_strip.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/keyprovider.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/pool_metrics.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/postgres.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/sqlserver.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/store/store.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/support/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/support/bundle.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/support/redact.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/timezone.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/base.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/database.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/dicom.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/dicomweb.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/email.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/fhir.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/file.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/framing.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/http_listener.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/loopback.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/mllp.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/passthrough.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/remotefile.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/rest.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/signing.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/smart.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/soap.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/tcp.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/timer.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/transports/x12.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/verify/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/verify/checks.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/verify/model.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/verify/report.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/verify/runner.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/messagefoundry/verify/smoke.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/packaging/console-installer/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/packaging/console-installer/THIRD-PARTY-NOTICES.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/packaging/console-installer/THIRD-PARTY-NOTICES.txt +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/packaging/console-installer/console_launcher.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/packaging/console-installer/licenses/GPL-3.0.txt +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/packaging/console-installer/licenses/LGPL-3.0.txt +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/packaging/console-installer/messagefoundry-console.iss +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/packaging/console-installer/messagefoundry-console.spec +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/packaging/messagefoundry-harness/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/packaging/messagefoundry-harness/pyproject.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/pyproject.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/requirements.lock +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/config/IB_ACME_ADT.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/config/IB_FHIR_INTAKE.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/config/IB_PARTNER_X12.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/config/IB_RADIOLOGY_SR.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/config/adt.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/config/codesets/event_labels.csv +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/config/codesets/facility_mnemonics.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/config/connections.toml +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/consistency/validated_adt.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/dicom/generate_sr_sample.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/adt_a01.hl7 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/adt_batch.hl7 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/messages/x12_270_eligibility.edi +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/results_relay/README.md +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/results_relay/codesets/test_codes.csv +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/results_relay/messages/oru_results.hl7 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/results_relay/results_relay.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/samples/send_mllp.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/console/install-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/console/pack_ico.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/dev/postgres.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/dev/sqlserver-docker.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/dev/sqlserver.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/publish/check_release_sync.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/publish/publish-denylist.txt +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/publish/publish.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/publish/scan_forbidden.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/security/crypto_inventory_check.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/security/vuln_metrics.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/service/import-db-ca.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/service/install-service.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/service/uninstall-service.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/trace_icon.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/worktree/new.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/worktree/remove.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/worktree/session-context.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/scripts/worktree/spawn.ps1 +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/__main__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/anon/__init__.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/anon/_hl7data.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/anon/_pools.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/anon/hl7.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/anon/keying.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/anon/leak.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/anon/rules.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/anon/surrogates.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/compare.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/correlate.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/hl7_fields.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/mefor_api.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/mllp.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/relay.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/report.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tee/store.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/_dicom_sample.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/_failover_load_support.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/_fhir_fixtures.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/conftest.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_acceptance_framework.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_ack_capture_runner.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_ack_sent_store.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_active_environment.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_ad_group_scope.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_admin_new_ip.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_adr_analyze.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_ai_policy.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_alert_rules.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_alert_sinks.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_alert_state.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_alerts_edit.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_alerts_rules_api.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_anon_core.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_anon_integration.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_anon_parity.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_api.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_api_alerts.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_api_auth.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_api_reload.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_api_tls.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_approvals.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_asvs_phase0.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_audit_integrity.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_audit_offbox_tee.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_auth_core.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_auth_entry_hardening.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_auth_hardening.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_auth_service.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_auth_session_lifecycle.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_auth_store.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_backup_crypto.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_backup_restore_atleastonce.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_backup_runner.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_batch_claim_fifo.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_batch_claim_locking.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_batch_claim_worker.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_binary_carriage.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_bootstrap_admin_perms.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_builtin_hl7_parity.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_cert_expiry.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_channel_rbac.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_checks.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_checks_lint.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_cli.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_cli_offline_resolution.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_cluster.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_cluster_failover_postgres.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_cluster_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_cluster_graph_gating.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_cluster_lease.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_code_sets.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_codeset_edit.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_config_anchoring.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_config_fingerprint.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_config_source_trust.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connection_api.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connection_event_api.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connection_event_emit.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connection_event_outbound.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connection_event_scope.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connection_event_store.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connection_resilience.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connections_cli.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connections_file.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connscale_config.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connscale_driver.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connscale_profile.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connscale_report.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_connscale_smoke.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_consistency.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_alerts.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_auth.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_client.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_dead_letters.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_event_log.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_hardening.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_icon.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_password.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_sessions.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_shards.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_status.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_step_up.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_theme.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_users.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_console_widgets.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_content_search.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_custom_roles.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_database_connector_integration.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_database_transport.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_db_lookup.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_db_lookup_live_runner.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_delivery_settings.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dependabot_automerge_guardrails.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dependency_boundaries.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dicom_codec.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dicom_scp.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dicom_scp_security.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dicom_scu.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dicom_wiring.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dicomweb.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_docs_runbooks.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dr_activation.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dr_api_status.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dr_failback.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dr_rbac.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dr_run_profile.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dr_seeding.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dryrun.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_dual_control_reload.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_ed_documents.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_ed_documents_e2e.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_egress_allowlist.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_email_destination.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_embedded_document_pruning.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_enginepoll_aggregate.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_environments.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_fhir_lookup.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_fhir_parsing.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_fhir_resource.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_fhir_transport.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_field_authz.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_field_authz_metadata.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_fifo_index_migration.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_fifo_ordering.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_frozen_launch_smoke.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_generate_cli.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_generated_adt.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_generators_core.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_generators_types.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_group_commit.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_groups.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_harness.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_harness_compose.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_harness_config.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_harness_faults.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_harness_file.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_harness_monitor.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_harness_scenarios.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_hl7_core_features.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_hl7schema.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_inbound_bind.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_inbound_http_source.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_ingest_time.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_inline_fast_path.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_keyprovider.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_last_admin_guard.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_last_resort.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_leader_tasks.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_license_notice.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_listener_tls_exposure.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_load_config.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_load_corpus.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_load_failover_postgres.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_load_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_load_failover_unit.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_load_metrics.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_load_profile.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_load_report.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_load_runner.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_load_sender.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_load_sink.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_logging.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_message.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_message_split.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_message_timestamps.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_metrics_exporter.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_mfa.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_mllp_encoding_override.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_mllp_tls.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_nonhl7_ingress_size_cap.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_operability_config.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_outbound_signing.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_outbound_simulate.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_packaging.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_parse_tree.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_parsing.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_passthrough.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_passthrough_graph.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_payload_agnostic_ingress.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_per_connection_retention.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_per_lane_wake.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_pool_warm.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_postgres_store.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_priority_resolution.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_reconcile_capture.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_reconcile_compare.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_reconcile_harness.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_redaction.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_reference_sets.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_reingress.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_release_console_installer.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_remotefile_transport.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_response_capture.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_rest_transport.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_restore_verify.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_retention.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_run_context.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_scaffold.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_scaffold_requirements.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_scan_forbidden.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_secrets_dpapi.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_security_notify.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_security_static.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_seq_only_fifo.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_service_control.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_sibling_helper_finder.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_smart_backend.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_soap_transport.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_soap_wssecurity.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_sqlserver_coordinator.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_sqlserver_cursor_close.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_sqlserver_schema_init.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_sqlserver_store.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_staged_pipeline.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_startup_attestation.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_startup_fault_isolation.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_stats_reset.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_step_up.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_store.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_store_backend.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_store_encryption.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_store_file_hardening.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_store_once_deliver_many.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_store_once_graph.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_store_read_pool.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_store_ssl.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_summary.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_supervisor.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_support_bundle.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_synchronous_baseline.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_task_resilience.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_tcp_transport.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_tee_cli.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_tee_compare.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_tee_correlate.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_tee_hl7_fields.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_tee_mefor_api.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_tee_mllp.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_tee_relay.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_tee_report.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_tee_store.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_timer_source.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_timezone.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_tls_policy.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_totp.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_totp_window.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_transform_offloop.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_transform_state.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_transports.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_update_check.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_verify.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_version.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_win2025_acceptance.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_wiring.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_wiring_engine.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_wiring_reload.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_wiring_serve.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_ws_stats_revalidation.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_x12_parsing.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_x12_rte.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_x12_source_ip_allowlist.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_x12_transport.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_x12_validate.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_xml_message.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/tests/test_xml_schema_signature.py +0 -0
- {messagefoundry-0.2.12 → messagefoundry-0.2.13}/uv.lock +0 -0
|
@@ -84,7 +84,7 @@ jobs:
|
|
|
84
84
|
MEFOR_STORE_DATABASE: messagefoundry
|
|
85
85
|
MEFOR_STORE_USERNAME: postgres
|
|
86
86
|
MEFOR_STORE_PASSWORD: mefor
|
|
87
|
-
MEFOR_STORE_POOL_SIZE: "5
|
|
87
|
+
MEFOR_STORE_POOL_SIZE: "40" # track the shipped default (ADR 0062: 5 -> 40)
|
|
88
88
|
MEFOR_STORE_ENCRYPT: "false" # plaintext to the container; the TLS-hardening guard needs the escape
|
|
89
89
|
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
90
90
|
steps:
|
|
@@ -151,7 +151,7 @@ jobs:
|
|
|
151
151
|
MEFOR_STORE_AUTH: sql
|
|
152
152
|
MEFOR_STORE_USERNAME: sa
|
|
153
153
|
MEFOR_STORE_PASSWORD: "Str0ng_P@ssw0rd!"
|
|
154
|
-
MEFOR_STORE_POOL_SIZE: "5
|
|
154
|
+
MEFOR_STORE_POOL_SIZE: "40" # track the shipped default (ADR 0062: 5 -> 40)
|
|
155
155
|
MEFOR_STORE_TRUST_SERVER_CERTIFICATE: "true"
|
|
156
156
|
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
157
157
|
steps:
|
|
@@ -569,7 +569,7 @@ jobs:
|
|
|
569
569
|
# FORCE a below-default pool (4 connections) so the perf_counter-measured acquire-WAIT
|
|
570
570
|
# histogram (the PRIMARY pool-wait signal) is non-trivial even at small N: ~3N inbound workers
|
|
571
571
|
# contend for 4 connections, so acquires actually queue and the percentiles populate. The
|
|
572
|
-
# default pool (
|
|
572
|
+
# default pool (40) would mask the wall. 4 (not 1-2) is deliberate: GET /status runs
|
|
573
573
|
# db_status()'s four sequential COUNT(*) queries on every poll, and an extremely tiny pool
|
|
574
574
|
# starves those acquires past the poller's HTTP timeout under the empty-claim herd on a slow
|
|
575
575
|
# runner — every poll then fails and the drain loops burn the test budget (the PR #675 hang).
|
|
@@ -6,6 +6,46 @@ All notable changes to MessageFoundry are documented here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.2.13] — 2026-07-01 — Early Access
|
|
10
|
+
|
|
11
|
+
The **store connection-scale sizing** wave — right-size the server-DB connection pool to the measured
|
|
12
|
+
inverted-U optimum, guard against over-provisioning, and guarantee the message store stays unified. All
|
|
13
|
+
changes are **server-DB-only**; the single-node SQLite default is unaffected.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- **Soft store-pool over-provisioning warning** ([ADR 0062](docs/adr/0062-default-store-pool-size.md)) — a
|
|
17
|
+
server-DB engine now logs an advisory `WARNING` at graph start if `[store].pool_size` is sized past the
|
|
18
|
+
connection-pool inverted-U optimum: at/beyond the ~80 catastrophic cliff, or oversized for the engine's
|
|
19
|
+
inbound-interface count (`~2.5 ×` interfaces). Advisory only — it never blocks startup; SQLite has no pool
|
|
20
|
+
so it is skipped, and the default (40) never trips it. Guards the "set a huge pool for 1500 connections"
|
|
21
|
+
footgun (which is a *sharding* problem, not a pool one).
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- **Default server-DB store connection pool size raised 5 → 40** ([`[store].pool_size`](docs/CONFIGURATION.md),
|
|
25
|
+
env `MEFOR_STORE_POOL_SIZE`; [ADR 0062](docs/adr/0062-default-store-pool-size.md)). A three-sweep
|
|
26
|
+
connection-scale study found the pool is an **inverted-U**: it helps up to ~40 per engine, and
|
|
27
|
+
**over-provisioning is catastrophic** — past ~40 the extra connections thrash one shared SQL instance
|
|
28
|
+
(WRITELOG serialization + per-message finalizer applocks), and ACK latency explodes 30–90×. 40 is the
|
|
29
|
+
measured optimum — **do not set it higher to chase connection count.** **Server-DB backends only** (Postgres
|
|
30
|
+
/ SQL Server) — the default **single-node SQLite** backend is unaffected (fixed read pool + single writer;
|
|
31
|
+
never reads `pool_size`). **Existing explicit `[store].pool_size` / `MEFOR_STORE_POOL_SIZE` values are
|
|
32
|
+
unchanged** — only the unset default moves. Behavioral deltas on server-DB engines: ~**8×** the steady-state
|
|
33
|
+
DB sessions per engine, and the startup pool pre-warm rises from ~2 to **~20 connections per engine**
|
|
34
|
+
(bounded by `warm_pool_timeout`, off the intake path, self-releasing, never raises). **Connection-budget
|
|
35
|
+
caution:** `pool_size` is **per engine**, so on a shared server DB `engines × pool_size` all count against
|
|
36
|
+
one `max_connections` (Postgres default ~100 → ~2 engines at 40) — raise `max_connections`, front the DB
|
|
37
|
+
with a pooler (PgBouncer), or use SQL Server; or size `pool_size` down. **Never split the store** to fit the
|
|
38
|
+
budget ([ADR 0063](docs/adr/0063-no-split-store-unified-store-for-sharding.md)). See
|
|
39
|
+
[`docs/DEPLOY-SERVER-DB.md`](docs/DEPLOY-SERVER-DB.md) §3.
|
|
40
|
+
- **No split data store: multi-shard engine sharding now requires a server DB** ([ADR 0063](docs/adr/0063-no-split-store-unified-store-for-sharding.md),
|
|
41
|
+
amends [ADR 0037](docs/adr/0037-multi-process-sharding-l3.md)). `messagefoundry supervise` with **more than
|
|
42
|
+
one shard** on a **SQLite** store is now **refused at startup** — the old SQLite-file-per-shard behavior
|
|
43
|
+
split the message store into one database per shard, fragmenting search/reporting/audit/replay. A sharded
|
|
44
|
+
deployment must share **one unified store**, so `>1` shard requires `[store].backend = 'postgres'` or
|
|
45
|
+
`'sqlserver'` (every shard connects to the same database). **A single un-sharded engine on SQLite is
|
|
46
|
+
unaffected** (byte-identical to `serve`). Migrating an existing SQLite-sharded deployment: drain each shard
|
|
47
|
+
store to empty, then re-point `supervise` at one server DB (not an offline store merge).
|
|
48
|
+
|
|
9
49
|
## [0.2.12] — 2026-07-01 — Early Access
|
|
10
50
|
|
|
11
51
|
The **throughput & connection-scale wave.** The staged-queue per-message commit chain is shortened
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: messagefoundry
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.13
|
|
4
4
|
Summary: Open-source healthcare integration engine — route, transform, and validate messages across many formats and connection types
|
|
5
5
|
Project-URL: Homepage, https://messagefoundry.org/
|
|
6
6
|
Project-URL: Documentation, https://messagefoundry.org/
|
|
@@ -49,7 +49,7 @@ x-ha-engine-env: &ha-engine-env
|
|
|
49
49
|
MEFOR_STORE_PORT: "5432"
|
|
50
50
|
MEFOR_STORE_DATABASE: "messagefoundry"
|
|
51
51
|
MEFOR_STORE_USERNAME: "mefor"
|
|
52
|
-
MEFOR_STORE_POOL_SIZE: "
|
|
52
|
+
MEFOR_STORE_POOL_SIZE: "40" # default (ADR 0062); >= 2 required under [cluster]
|
|
53
53
|
MEFOR_CLUSTER_ENABLED: "true"
|
|
54
54
|
# DEV-ONLY: the local Postgres has no CA-trusted cert, so verification can't succeed here. This
|
|
55
55
|
# disables TLS verification across ALL transports — it is a CI/lab switch and must NEVER be set in
|
|
@@ -426,6 +426,14 @@ client. "Moderate risk"; not verifiable in offscreen Qt tests, so it deserves a
|
|
|
426
426
|
**FIFO per outbound connection** (simple, safe). Per-key ordering is the leading-edge refinement to
|
|
427
427
|
revisit once FIFO is solid and a real workload needs the parallelism.
|
|
428
428
|
|
|
429
|
+
**Naming (locked 2026-06-30):** the canonical vocabulary for this concept is **sequence key** (the
|
|
430
|
+
per-message partition value — ADT = `facility + MRN`; same key → same lane → FIFO preserved,
|
|
431
|
+
different keys → parallel), **sequence group** (the set of messages sharing a sequence key), and
|
|
432
|
+
**sequence-keyed lanes** / **sequence sharding** (the mechanism). The older terms used elsewhere in
|
|
433
|
+
this item — `partition_key` (config setting) and "order-group sharding" — refer to the same thing.
|
|
434
|
+
"Order-group" was retired because "order" collides with clinical orders (CPOE/ORM); "partition key"
|
|
435
|
+
was retired because "partition" is reserved for the planned store-sharding-by-channel axis.
|
|
436
|
+
|
|
429
437
|
**What:** preserve order only *within* a partition key (e.g. MRN / encounter / sending facility)
|
|
430
438
|
while processing *across* keys in parallel — the sweet spot between strict per-connection FIFO (safe,
|
|
431
439
|
serial) and unordered parallelism (fast, unsafe). Same idiom as a broker partition key. Recent
|
|
@@ -3063,11 +3071,11 @@ parity analysis.
|
|
|
3063
3071
|
|
|
3064
3072
|
**Cluster:** Minor gaps. **Priority:** P3. **Verdict:** demand-gate.
|
|
3065
3073
|
|
|
3066
|
-
**Scope:** Per-connection send pacing
|
|
3074
|
+
**Scope:** Per-connection send pacing and verify the reply's MSA-2 == the sent MSH-10. *(Keep-alive / persistent-reconnect on MLLP/TCP outbounds was promoted out to its own tracked item — see [#97](#97-keep-alive--persistent-outbound-connections--per-connector-setting-p3-on-trigger).)*
|
|
3067
3075
|
|
|
3068
|
-
**Trigger:** build when a partner needs paced sending
|
|
3076
|
+
**Trigger:** build when a partner needs paced sending or strict response-correlation.
|
|
3069
3077
|
|
|
3070
|
-
**Why:**
|
|
3078
|
+
**Why:** Both confirmed (no pacing; `MLLPDestination._check_ack` reads MSA-1/MSA-3 only, never matches MSA-2↔MSH-10). Cheap per-connection-override additions; bundle on real partner need. Keep-alive is tracked separately at #97.
|
|
3071
3079
|
|
|
3072
3080
|
**Source:** promoted from [#52](#52-corepoint-capability-parity-gaps--prioritized-roadmap-input-2026-06-27) gap synthesis (adversarially reviewed, 2026-06-28).
|
|
3073
3081
|
|
|
@@ -3559,6 +3567,81 @@ reconciled the same day.
|
|
|
3559
3567
|
|
|
3560
3568
|
---
|
|
3561
3569
|
|
|
3570
|
+
## 96. Built-in "setup tester" — self-service capacity estimator that benchmarks the deployed setup and reports how much traffic it can handle (P2, adopter-facing)
|
|
3571
|
+
|
|
3572
|
+
**Type:** feature — an operator/adopter-facing **capacity self-test** shipped *with the engine*. It runs the
|
|
3573
|
+
same style of measurement we do for throughput testing, but as a first-class, on-demand command an adopter
|
|
3574
|
+
points at **their own** setup (this box, this store backend, this config) to get back an **estimate of how
|
|
3575
|
+
much traffic that setup can sustain**.
|
|
3576
|
+
|
|
3577
|
+
**What:** a `messagefoundry` subcommand (e.g. `messagefoundry capacity` / `setup-test`) that drives a
|
|
3578
|
+
controlled synthetic load through the real engine and reports an **estimated sustainable throughput** — a
|
|
3579
|
+
headline **msg/s** and **msg/day** figure, ideally **per-inbound-interface** *and* engine-wide, plus the
|
|
3580
|
+
**limiting factor** (commit-bound / pool-saturated / CPU / disk) and a confidence caveat. It ramps to the
|
|
3581
|
+
saturation knee (where `in_pipeline`/`backlog_seconds` start rising faster than drain — the #93 signal) and
|
|
3582
|
+
reports the last rate that drained cleanly with no loss, rather than a raw peak. Reuses the **BUILT load
|
|
3583
|
+
harness** measurement machinery ([`harness/load/`](../harness/load/), [`docs/LOAD-TESTING.md`](LOAD-TESTING.md))
|
|
3584
|
+
— the rate governor, the fast correlation sink (true end-to-end latency), the drain gauge (`in_pipeline`), and
|
|
3585
|
+
the no-loss reconciliation — packaged as a supported engine capability rather than a dev-only tool.
|
|
3586
|
+
|
|
3587
|
+
**Distinct from what already exists (don't duplicate):**
|
|
3588
|
+
- **#28 / #29 (DONE)** are the *developer/benchmark* runs of the harness against a synthetic high-fan-out
|
|
3589
|
+
system-under-test, producing the **project** [`benchmarks/TUNING-BASELINE.md`](benchmarks/TUNING-BASELINE.md)
|
|
3590
|
+
baseline. This item is the *adopter-run* inverse: point it at **the real deployed config on the real box** and
|
|
3591
|
+
get a sizing number for *that* deployment — not a project baseline, and not something that needs the harness's
|
|
3592
|
+
synthetic SUT config or the denylist-guarded estate profiles.
|
|
3593
|
+
- **#93 (P2)** is the *passive, runtime* counterpart — it watches real traffic and **warns** when live load is
|
|
3594
|
+
approaching capacity. This item is the *active, pre-cutover* counterpart — it **measures** where that capacity
|
|
3595
|
+
is in the first place, so #93's overload threshold can be calibrated against it. They pair.
|
|
3596
|
+
- **#40** is the enterprise-hardware CI leg; this tester is what an adopter would run **on their own hardware**
|
|
3597
|
+
to reproduce a sizing number without CI access.
|
|
3598
|
+
|
|
3599
|
+
**Design constraints (for the eventual ADR):**
|
|
3600
|
+
- **Must not pollute production.** A capacity run generates real store writes and would otherwise inflate the
|
|
3601
|
+
true inbound counts (the count-and-log invariant persists *every* received message). It must run against an
|
|
3602
|
+
**isolated/ephemeral store** (temp DB) or a clearly-marked test namespace, and never leave synthetic rows in,
|
|
3603
|
+
or skew the metrics of, the live message store.
|
|
3604
|
+
- **Synthetic payloads only — never real PHI.** Drive it from the conformant generators
|
|
3605
|
+
([`generators/`](../messagefoundry/generators/)) / the anon framework (ADR 0030), consistent with the
|
|
3606
|
+
dryrun/generate PHI rule (never against real PHI, never redirected to a committed file/CI log).
|
|
3607
|
+
- **Respect the per-interface bound.** Report capacity **per inbound interface** and note that a single strictly-
|
|
3608
|
+
ordered feed is core-bound (owner principle: fan out feeds at source, not infinite single-feed speed) — an
|
|
3609
|
+
engine-wide total is the sum across interfaces, not a single-feed number. Sequence-keyed lanes (#3) are the
|
|
3610
|
+
sanctioned single-feed escape hatch when one feed outgrows a core.
|
|
3611
|
+
- **Name the limiting factor**, reusing the #93/#64 signals (commit/write latency, `[store].pool_size`
|
|
3612
|
+
busy/wait, CPU/mem via #74, `in_pipeline` growth) so the output is *"~N msg/s, commit-bound"* rather than a
|
|
3613
|
+
bare number — the sizing memos already conclude the pipeline is serial-per-inbound commit-bound, not
|
|
3614
|
+
disk/CPU/pool-bound on the tested boxes.
|
|
3615
|
+
|
|
3616
|
+
**Why P2 / on-trigger.** Turns capacity sizing — today a manual "run the dev harness + read TUNING-BASELINE by
|
|
3617
|
+
hand" exercise — into a **supported operation** an adopter can self-serve before a cutover (*"will this box carry
|
|
3618
|
+
our ~1.6M ADT/day?"*). The measurement machinery already exists; the net-new is the operator-facing command, the
|
|
3619
|
+
isolated-store harness, the ramp-to-knee estimator, and the capacity report. **Trigger:** a pilot/adopter needing
|
|
3620
|
+
a self-service pre-cutover capacity check on their own hardware (the ADR 0017 consumer-deployment pattern), or the
|
|
3621
|
+
#93 overload-alert threshold needing a per-deployment capacity baseline to calibrate against. Relates to
|
|
3622
|
+
**#28**/**#29** (the harness it wraps), **#40** (enterprise-box runs), **#64** (the throughput-performance
|
|
3623
|
+
roadmap), **#93** (the runtime overload-alert counterpart), and the recorded sizing work (throughput matrix /
|
|
3624
|
+
per-interface bound / commit-bottleneck analyses).
|
|
3625
|
+
|
|
3626
|
+
**Source:** owner request (2026-06-30) — "add a setup tester to the engine … do tests like we're doing for
|
|
3627
|
+
throughput testing and report back an estimate of how much traffic the setup can handle."
|
|
3628
|
+
|
|
3629
|
+
---
|
|
3630
|
+
|
|
3631
|
+
## 97. Keep-alive / persistent outbound connections — per-connector setting (P3, on-trigger)
|
|
3632
|
+
|
|
3633
|
+
> **On-trigger / demand-gate.** Numbered for tracking only — build when the trigger below fires (“demand-gate, don’t schedule”). Promotes the keep-alive sub-scope of [#82](#82-sender-transport-polish-bundle--pacing--msa-2msh-10-matching--tcp-keep-alive) into its own tracked item at the owner's request.
|
|
3634
|
+
|
|
3635
|
+
**Type:** feature — a per-outbound-connection option to **hold the TCP link open across deliveries** (keep-alive / persistent) instead of the current connect-per-message behavior.
|
|
3636
|
+
|
|
3637
|
+
**What:** an opt-in **per-connector setting** (e.g. `keepalive = true` / a `connection_mode = "persistent" | "on_demand"` knob in the outbound's `settings`, default `on_demand` so existing configs stay byte-identical) on the MLLP / raw-TCP / X12 outbound connectors. When enabled, the delivery worker reuses one open connection (reconnecting on drop/idle), rather than opening + closing a fresh socket every message as it does today. Wants: a bounded idle-close / max-lifetime, reconnect-with-backoff on a dropped link, and clean teardown on `stop()`/reload — all per-connection, with the setting validated at build (dry-run / `check`), consistent with the other outbound knobs.
|
|
3638
|
+
|
|
3639
|
+
**Why:** confirmed gap — every TCP-family outbound opens a **fresh connection per delivery** today and there is no toggle: `MLLPDestination` ([`transports/mllp.py`](../messagefoundry/transports/mllp.py), *"Phase 1 opens a fresh connection per delivery … a persistent/pooled connection can come later"*) and `TcpDestination` ([`transports/tcp.py`](../messagefoundry/transports/tcp.py), *"Opens a fresh connection per delivery … pooling can come later"*); listed as an unbuilt MLLP feature gap in [`CONNECTIONS.md`](CONNECTIONS.md) ("keep-connection-open/pooling"). Inbound listeners are already persistent (peer-driven, idle-bounded by `receive_timeout`) — this closes the outbound half. The connect-per-message default is simple and robust to flaky peers, so this is genuinely additive and stays **off by default**; the at-least-once / idempotent-receiver contract is unchanged (a reused link that drops mid-ACK still retries, same as today). **Trigger:** a partner that needs a held-open link (a persistent-session receiver, or a high-rate feed where per-message connect setup is measurable overhead). Relates to **#82** (the sender-polish bundle this splits from — pacing + MSA-2↔MSH-10 matching stay there), **#46** (connection lifecycle events would gain reconnect/retry signals), and **#65** (outbound-connector option surface).
|
|
3640
|
+
|
|
3641
|
+
**Source:** owner request (2026-06-30) — "add keepalive feature for outbound connections, controlled by a setting per outbound connector."
|
|
3642
|
+
|
|
3643
|
+
---
|
|
3644
|
+
|
|
3562
3645
|
*Everything else from the 2026-06-10 full-codebase review (1 critical, 13 high, 33 medium, 31 low —
|
|
3563
3646
|
78 findings) has been remediated; see the review report's §6 action order. The two items it still
|
|
3564
3647
|
sourced — **#1 (SQL Server concurrency)** and **#2 (console off-thread)** — are now both **DONE**
|
|
@@ -77,7 +77,7 @@ is verified against [`config/settings.py`](../messagefoundry/config/settings.py)
|
|
|
77
77
|
| `MEFOR_STORE_DATABASE` | `[store].database` | `messagefoundry` | the database name |
|
|
78
78
|
| `MEFOR_STORE_USERNAME` | `[store].username` | `mefor` | the login |
|
|
79
79
|
| `MEFOR_STORE_PASSWORD` | `[store].password` | *(secret)* | **env/secret only** — never the config file |
|
|
80
|
-
| `MEFOR_STORE_POOL_SIZE` | `[store].pool_size` | `
|
|
80
|
+
| `MEFOR_STORE_POOL_SIZE` | `[store].pool_size` | `40` | default 40, the inverted-U optimum — don't set higher ([ADR 0062](adr/0062-default-store-pool-size.md)); `>= 2` under `[cluster]`. **Budget:** `engines × pool_size` hit one managed-PG `max_connections` (~2 engines at 40/100) — raise it, add a pooler, or size down; never split the store ([DEPLOY-SERVER-DB.md](DEPLOY-SERVER-DB.md) §3) |
|
|
81
81
|
| `MEFOR_CLUSTER_ENABLED` | `[cluster].enabled` | `true` | turns on the leader lease + graph gating |
|
|
82
82
|
| `MEFOR_STORE_REQUIRE_ENCRYPTION` | `[store].require_encryption` | `true` | fail-closed: refuse to start keyless (PHI at rest) |
|
|
83
83
|
| `MEFOR_STORE_ENCRYPTION_KEY` | `[store].encryption_key` | *(secret)* | base64 32 bytes — `messagefoundry gen-key` |
|
|
@@ -66,11 +66,11 @@ backend that consumes the server-DB keys lands incrementally (the settings + val
|
|
|
66
66
|
| `username` | str | — | server DBs (required when `auth = sql`) |
|
|
67
67
|
| `password` | secret | — | **env only** (`MEFOR_STORE_PASSWORD`) |
|
|
68
68
|
| `encrypt`, `trust_server_certificate` | bool | `true`/`false` | TLS to the DB |
|
|
69
|
-
| `pool_size` | int |
|
|
69
|
+
| `pool_size` | int | 40 | server DBs — **server-DB only** (no-op on SQLite). The inverted-U optimum (raised from 5; do **not** set higher — over-provisioning is catastrophic, [ADR 0062](adr/0062-default-store-pool-size.md)). **Per engine:** `engines × pool_size` share one `max_connections` — see [`DEPLOY-SERVER-DB.md`](DEPLOY-SERVER-DB.md) §3 |
|
|
70
70
|
| `connect_timeout`, `command_timeout` | int (s) | 15 / 30 | server DBs |
|
|
71
71
|
| `warm_pool` | bool | `true` | server DBs — pre-open pooled connections in the background on graph start/promotion so a connection burst (the post-promotion delivery workers, or a cold start) finds them warm instead of paying cold connects (TCP+TLS+login). Best-effort, self-releasing, **no-op on SQLite**. On by default (it touches no commit/correctness seam); set `false` to opt out on a connection-constrained/licensed site. |
|
|
72
72
|
| `warm_pool_timeout` | num (s) | 15 | server DBs — upper bound on the background warm-up; on expiry it logs and continues with a partially warm pool. Must be `> 0`. A **clustered** server-DB node also rejects an **explicit** value `>= [cluster].leader_fence_timeout_seconds` (a warm should finish within the leadership term that started it); the default (15 < the 20 fence) never trips this. |
|
|
73
|
-
| `warm_pool_target` | int | — | server DBs — how many connections to pre-open. Unset (default) = a safe fraction of the pool (`min(pool_size-1, pool_size//2)`), so the warm never pins more than half the pool; an explicit value is clamped to `pool_size-1`. A pool of 1 is never warmed. |
|
|
73
|
+
| `warm_pool_target` | int | — | server DBs — how many connections to pre-open. Unset (default) = a safe fraction of the pool (`min(pool_size-1, pool_size//2)`), so the warm never pins more than half the pool; an explicit value is clamped to `pool_size-1`. A pool of 1 is never warmed. At the default `pool_size = 40` this is `min(39, 20) = 20` pre-opened per server-DB engine at startup. |
|
|
74
74
|
| `db_schema`, `application_name` | str | — / `messagefoundry` | optional (`db_schema` ⇒ env `MEFOR_STORE_DB_SCHEMA`) |
|
|
75
75
|
|
|
76
76
|
> Selecting `backend = "sqlserver"` validates that `server`/`database` (and `username` when
|
|
@@ -60,12 +60,44 @@ Configure `[store]` in the service settings (full reference: [`CONFIGURATION.md`
|
|
|
60
60
|
|
|
61
61
|
## 3. Pool sizing
|
|
62
62
|
|
|
63
|
+
The default `[store].pool_size` is **40** (server-DB only; a no-op on the SQLite default, which uses a fixed
|
|
64
|
+
read pool + single writer). Raised from 5 in [ADR 0062](adr/0062-default-store-pool-size.md): the
|
|
65
|
+
connection-scale study found the pool is an **inverted-U** — it helps up to ~40 per engine, and
|
|
66
|
+
**over-provisioning is catastrophic** (past ~40 the extra connections thrash one shared instance — WRITELOG +
|
|
67
|
+
finalizer applocks — and ACK latency explodes 30–90×). 40 is the measured **optimum**, not a floor: **do not
|
|
68
|
+
set it higher to chase connection count** (that path is refuted — scale is *sharding*, not a bigger pool).
|
|
69
|
+
Tunable via `[store].pool_size` / `MEFOR_STORE_POOL_SIZE`; re-measure for a materially different deployment
|
|
70
|
+
shape (transform cost, message size, disk, SQL-box sizing).
|
|
71
|
+
|
|
63
72
|
- **Single node:** `[store].pool_size ≥ 3` recommended. Each stage handoff is a committed round-trip and
|
|
64
73
|
the per-stage workers (router, transform, per-outbound delivery) run concurrently against the pool — a
|
|
65
74
|
pool of 1 serializes them against intake.
|
|
66
75
|
- **Clustered (active-passive):** `pool_size ≥ 2` is **required** (a cross-section validator refuses a
|
|
67
76
|
smaller pool when `[cluster].enabled`), `≥ 3` recommended — a clustered node also drives the
|
|
68
77
|
membership / lease-renewal maintenance loop against the pool.
|
|
78
|
+
- **Connection-budget ceiling (important on a shared server DB):** `pool_size` is **per engine**. Every
|
|
79
|
+
Postgres/SQL Server engine that shares the store — multi-process shards (all connect to the *same*
|
|
80
|
+
database) and the active-passive standby's warm pool — counts against one server limit. So budget
|
|
81
|
+
**peak connections ≈ engines × `pool_size`** (+ the standby's `warm_pool_target`) and keep it well under
|
|
82
|
+
the DB server's `max_connections` (**Postgres default ~100**; SQL Server is bounded by sessions/memory).
|
|
83
|
+
At the default `pool_size = 40`, ~2 co-located engines already reach ~100 — **a config that connected at
|
|
84
|
+
5 can fail to connect at 40.** Co-locating several server-DB engines (a sharded fan-out)? **Raise
|
|
85
|
+
`max_connections`, front the DB with a connection pooler (PgBouncer), or use SQL Server** (more sessions);
|
|
86
|
+
or size `pool_size` **down**. **Do NOT give each shard its own database/server** — that is a split store,
|
|
87
|
+
which is disallowed ([ADR 0063](adr/0063-no-split-store-unified-store-for-sharding.md)); one unified store
|
|
88
|
+
scales *vertically* (faster box/disk) + *cheaper-per-message*, never by fragmenting. Also budget the startup
|
|
89
|
+
warm burst (~20 pre-opened/engine at the default; set `warm_pool_target` or `warm_pool = false` on a
|
|
90
|
+
connection-/license-constrained site).
|
|
91
|
+
- **Commit-depth at high interface counts (`fifo_claim_batch`):** the pool is not the only per-engine wall —
|
|
92
|
+
above ~48 inbound interfaces an engine becomes bound by *commits per message* on the shared store (WRITELOG
|
|
93
|
+
+ the per-message finalizer applock), which a bigger pool **cannot** fix. For a **high-interface-count,
|
|
94
|
+
commit-bound** server-DB engine, set **`[store].fifo_claim_batch = 8`** (range 8–16, [ADR 0058](adr/0058-batch-claim-fifo-prefix.md)):
|
|
95
|
+
the INGRESS/ROUTED FIFO claim then takes the contiguous due head-prefix in one commit instead of one-per-row,
|
|
96
|
+
amortizing the claim commit toward `1/N` on backlogged lanes. It **preserves strict per-lane FIFO (#285) +
|
|
97
|
+
at-least-once**, is **byte-identical at `1` (the default)** and on caught-up (low-backlog) lanes, and never
|
|
98
|
+
batches the outbound/delivery claim. Size it against worst-case message size (N decrypted bodies are resident
|
|
99
|
+
per lane between the claim and its N handoffs). This — not the pool — is the *raise-interfaces-per-engine*
|
|
100
|
+
lever.
|
|
69
101
|
|
|
70
102
|
---
|
|
71
103
|
|
|
@@ -173,7 +205,8 @@ update the pin in lockstep — pin the **CA**, not the leaf, to keep rotations m
|
|
|
173
205
|
- [ ] `[store].encrypt = true` (and **not** `MEFOR_ALLOW_INSECURE_TLS`) for any PHI deployment.
|
|
174
206
|
- [ ] DB CA trusted so `trust_server_certificate = false` validates — Postgres `ssl_root_cert` **or**
|
|
175
207
|
machine-store import; SQL Server **machine store only** (§5). Never `TrustServerCertificate=true`.
|
|
176
|
-
- [ ] `[store].pool_size
|
|
208
|
+
- [ ] `[store].pool_size` sized (default **40**, server-DB only; ≥ 2 hard-required in cluster mode) **and**
|
|
209
|
+
the connection budget checked: engines × `pool_size` (+ standby warm) well under the DB `max_connections` (§3).
|
|
177
210
|
- [ ] Bootstrap login can create the schema on first open, **or** the schema is pre-created.
|
|
178
211
|
- [ ] SQL Server: RCSI enabled (auto, or pre-enabled by a DBA).
|
|
179
212
|
- [ ] Source store drained (`in_pipeline → 0`) before cutover — greenfield, no in-place migration.
|
|
@@ -422,7 +422,7 @@ The built-in HA model is **active-passive failover** (the Corepoint/Rhapsody mod
|
|
|
422
422
|
backend = "postgres" # or "sqlserver"; SQLite cannot cluster
|
|
423
423
|
server = "db.internal"
|
|
424
424
|
database = "messagefoundry"
|
|
425
|
-
pool_size =
|
|
425
|
+
pool_size = 40 # default (ADR 0062); >= 2 (>= 3 preferred)
|
|
426
426
|
|
|
427
427
|
[cluster]
|
|
428
428
|
enabled = true
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# Understanding MessageFoundry Throughput
|
|
2
|
+
|
|
3
|
+
*A plain-language guide to what determines how many messages MessageFoundry can move — and why a
|
|
4
|
+
single "messages per day" number rarely tells you what you need to know.*
|
|
5
|
+
|
|
6
|
+
> **Read this first.** Every throughput figure in this document is a **theoretical maximum** measured
|
|
7
|
+
> in a controlled lab under ideal conditions. Your real-world throughput will almost always be **lower**,
|
|
8
|
+
> and it is usually set by **how fast your partner systems accept and acknowledge each message** — not by
|
|
9
|
+
> the engine. MessageFoundry adds only a few milliseconds of its own overhead per message; the rest of the
|
|
10
|
+
> time is spent waiting on round-trips to your database and your downstream systems. Size against *your*
|
|
11
|
+
> systems, not against a headline number.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Executive summary
|
|
16
|
+
|
|
17
|
+
- **The engine is nearly transparent.** In our reference lab, MessageFoundry adds on the order of
|
|
18
|
+
**~16 milliseconds** of its own processing per message. For an ordered (strictly in-sequence) feed that
|
|
19
|
+
works out to roughly **60 messages/second end-to-end** and **~450 messages/second at the point of
|
|
20
|
+
receipt** — but those are *ceilings under ideal conditions*, not promises for your environment.
|
|
21
|
+
|
|
22
|
+
- **Your partner systems are the biggest factor.** For ordered delivery, each message is sent, the engine
|
|
23
|
+
**waits for the partner to accept and acknowledge it**, and only then does the next one go. The partner's
|
|
24
|
+
round-trip time lands *directly* in the critical path. A partner that takes 50 ms to acknowledge caps a
|
|
25
|
+
single ordered stream at roughly **15 messages/second** — no matter how fast the engine or database is.
|
|
26
|
+
|
|
27
|
+
- **"Messages per day" is a weak unit.** Healthcare traffic is **bursty**. In the production ADT feeds
|
|
28
|
+
we've profiled, the **busiest hour runs about 2.7× the all-day average rate**. You have to size for the
|
|
29
|
+
*peak hour*, not the daily average — so a raw "X million/day" figure, on its own, tells you very little.
|
|
30
|
+
|
|
31
|
+
- **Scale by fanning out, not by one giant pipe.** A strictly-ordered interface is a single serial lane
|
|
32
|
+
with a bounded rate — that's the physics of guaranteed ordering, not a product limitation. Real capacity
|
|
33
|
+
comes from running **many interfaces** (split feeds at the source: by hospital, facility, service line).
|
|
34
|
+
One node's message store easily absorbs the combined load of dozens of interfaces.
|
|
35
|
+
|
|
36
|
+
- **Four questions to ask of *any* throughput claim** — ours or a competitor's:
|
|
37
|
+
**(1)** How big are the messages? **(2)** Is delivery strictly ordered or parallel?
|
|
38
|
+
**(3)** How fast does the receiving system acknowledge? **(4)** What's the *peak-hour* rate behind that
|
|
39
|
+
daily average? Without those four, a msg/s or msg/day number is marketing, not engineering.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 1. How a message flows (and why there are two different "speeds")
|
|
44
|
+
|
|
45
|
+
A message moves through MessageFoundry in stages, each of which is written durably to the message store
|
|
46
|
+
before the next begins (that's what guarantees nothing is lost):
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
sender ──▶ [ receive + persist ] ──▶ [ route ] ──▶ [ transform ] ──▶ [ deliver ] ──▶ partner
|
|
50
|
+
│ │
|
|
51
|
+
ACK to sender partner ACK
|
|
52
|
+
(fast — "intake") (paced by the partner)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
This gives you **two distinct throughput numbers**, and they are often very far apart:
|
|
56
|
+
|
|
57
|
+
| Rate | What it measures | Typical relationship |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| **Intake rate** (ACK-on-receipt) | How fast the engine can accept a message, store it durably, and acknowledge the *sender*. The sender never waits for downstream delivery. | **Higher** — ~450/s in our lab. Protects upstream senders from downstream slowness. |
|
|
60
|
+
| **Delivery rate** (end-to-end) | How fast the engine can get a message all the way to the *partner* and confirm it landed. | **Lower** — ~60/s in our lab. Paced by everything downstream, especially the partner. |
|
|
61
|
+
|
|
62
|
+
The gap between them is not waste — it's the buffer. MessageFoundry accepts and safely stores messages
|
|
63
|
+
faster than it delivers them, so a momentary slowdown at a partner doesn't push back on the sender. The
|
|
64
|
+
backlog drains as the partner catches up.
|
|
65
|
+
|
|
66
|
+
**Takeaway:** when someone quotes a throughput number, ask *which* rate they mean. Intake numbers look
|
|
67
|
+
impressive but say nothing about how fast messages actually reach their destination.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 2. The single biggest factor: your partner systems and round-trip times
|
|
72
|
+
|
|
73
|
+
This is the point most capacity conversations miss.
|
|
74
|
+
|
|
75
|
+
**Ordered delivery is inherently serial.** When you require messages to arrive in the exact order they were
|
|
76
|
+
received (the default, and a hard requirement for most clinical feeds), the engine can only have **one
|
|
77
|
+
message in flight per destination at a time**:
|
|
78
|
+
|
|
79
|
+
1. Send message *N* to the partner.
|
|
80
|
+
2. **Wait** for the partner to receive it, process it (often persist it to *its own* database), and send
|
|
81
|
+
back an acknowledgement.
|
|
82
|
+
3. Only then send message *N+1*.
|
|
83
|
+
|
|
84
|
+
That waiting time is not the engine's — it belongs to the **network round-trip and the partner's own
|
|
85
|
+
processing**. And because the stream is serial, it lands squarely in the critical path.
|
|
86
|
+
|
|
87
|
+
### The round-trips that make up a message's journey
|
|
88
|
+
|
|
89
|
+
Every message pays for several round-trips, and each one adds latency:
|
|
90
|
+
|
|
91
|
+
- **Sender ↔ engine** — the intake acknowledgement. Fast, and it doesn't block delivery.
|
|
92
|
+
- **Engine ↔ message store** — each durable stage handoff is a commit. If the store is on another server,
|
|
93
|
+
every commit is a network round-trip. (See §4.)
|
|
94
|
+
- **Engine ↔ partner** — the delivery send *and the partner's acknowledgement*. **This is usually the
|
|
95
|
+
dominant term**, and MessageFoundry does not control it.
|
|
96
|
+
- **Engine ↔ enrichment source** *(optional)* — if a handler does a live lookup (e.g. a provider or
|
|
97
|
+
eligibility check), that adds another round-trip during transformation. (See §5.)
|
|
98
|
+
|
|
99
|
+
### What this does to throughput
|
|
100
|
+
|
|
101
|
+
For an ordered stream, throughput is approximately:
|
|
102
|
+
|
|
103
|
+
> **messages/second ≈ 1000 ÷ ( engine overhead + partner round-trip )**, in milliseconds
|
|
104
|
+
|
|
105
|
+
The engine overhead is small and roughly fixed (~16 ms in our lab). The **partner round-trip is yours**,
|
|
106
|
+
and it dominates as soon as it's more than a few milliseconds:
|
|
107
|
+
|
|
108
|
+
| Partner acknowledges in… | Approx. ordered throughput | "Uniform" msgs/day* | Realistic msgs/day (peak-aware)† |
|
|
109
|
+
|---|---|---|---|
|
|
110
|
+
| ~0 ms (lab ideal) | ~60 /s | ~5.2 M | ~1.9 M |
|
|
111
|
+
| 10 ms | ~38 /s | ~3.3 M | ~1.2 M |
|
|
112
|
+
| 25 ms | ~24 /s | ~2.1 M | ~0.8 M |
|
|
113
|
+
| 50 ms | ~15 /s | ~1.3 M | ~0.5 M |
|
|
114
|
+
| 100 ms | ~9 /s | ~0.8 M | ~0.3 M |
|
|
115
|
+
| 250 ms | ~4 /s | ~0.35 M | ~0.13 M |
|
|
116
|
+
|
|
117
|
+
<sub>\* "Uniform" assumes traffic is perfectly flat around the clock — it never is (see §6).
|
|
118
|
+
† "Peak-aware" divides by a 2.7× burst factor, which is the realistic planning number. Illustrative
|
|
119
|
+
first-order model anchored to the measured ~16 ms engine floor; your numbers depend on your systems.</sub>
|
|
120
|
+
|
|
121
|
+
The lesson is stark: a partner that takes a quarter-second to acknowledge each message will hold a single
|
|
122
|
+
ordered stream to a few messages per second, and **no amount of engine or database speed changes that.**
|
|
123
|
+
The bottleneck has moved outside MessageFoundry entirely.
|
|
124
|
+
|
|
125
|
+
### What you can do about a slow partner
|
|
126
|
+
|
|
127
|
+
- **Relax ordering where it's safe.** If a feed tolerates out-of-order delivery, unordered mode lets the
|
|
128
|
+
engine keep many messages in flight at once, hiding the partner's round-trip behind concurrency (see §3).
|
|
129
|
+
- **Open multiple connections to the partner.** Each destination connection is its own independent stream,
|
|
130
|
+
so *N* connections give you *N* parallel ordered lanes (if the partner accepts concurrent connections).
|
|
131
|
+
- **Fan out at the source.** Split one hot feed into several interfaces (see §7) so the aggregate isn't
|
|
132
|
+
gated by a single serial lane.
|
|
133
|
+
- **Ask your partner about their acknowledgement latency.** It is often the cheapest thing to improve, and
|
|
134
|
+
it's the term that matters most.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 3. Ordering: the throughput-vs-order trade-off
|
|
139
|
+
|
|
140
|
+
Ordering guarantees and raw throughput pull in opposite directions. MessageFoundry lets you choose per
|
|
141
|
+
feed:
|
|
142
|
+
|
|
143
|
+
| Mode | Guarantee | Throughput | Use when |
|
|
144
|
+
|---|---|---|---|
|
|
145
|
+
| **Strict FIFO** *(default)* | Messages delivered in exactly the order received. | Bounded — one message in flight per destination (serial). | Order matters: ADT streams, anything where a later message corrects an earlier one. |
|
|
146
|
+
| **Unordered** | No ordering guarantee. | Higher — many messages in flight at once; the partner round-trip is hidden by concurrency. | Order doesn't matter: independent results, logging, feeds keyed only by their own content. |
|
|
147
|
+
|
|
148
|
+
Strict ordering being serial is not unique to MessageFoundry — it is a property of *any* system that
|
|
149
|
+
guarantees order over a single stream. This is exactly why integration engines let you opt out of ordering
|
|
150
|
+
when a feed can tolerate it: it's the most direct throughput lever available for a single interface.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 4. The message store (durability has a cost, and location matters)
|
|
155
|
+
|
|
156
|
+
Every stage handoff is committed durably to the store before the next stage runs — that's what makes
|
|
157
|
+
delivery at-least-once and crash-safe. So the store's commit latency is part of every message's journey.
|
|
158
|
+
|
|
159
|
+
| Choice | Effect on throughput |
|
|
160
|
+
|---|---|
|
|
161
|
+
| **SQLite (embedded, default)** | Runs *in-process* with no network hop — the fastest per-commit path. Its ceiling is single-writer serialization, which is the floor case in our testing, not a problem for most single-node deployments. |
|
|
162
|
+
| **SQL Server / PostgreSQL (server database)** | Chosen for concurrency, high availability, and enterprise operations — **not** for raw single-stream speed. Every commit is now a **network round-trip** to the database server, which *adds* latency to each handoff. |
|
|
163
|
+
| **Store location — local vs. across the network** | This matters more than the database brand. A commit to a co-located, fast local disk is dramatically quicker than a commit that crosses the network to a remote database server. In our testing a local NVMe store committed on the order of **~65× faster** than a round-trip to a database on another box. |
|
|
164
|
+
| **Disk speed (NVMe vs. shared SAN)** | The store forces data to disk on commit for durability; faster storage lowers that per-commit cost. |
|
|
165
|
+
|
|
166
|
+
**One store serves many interfaces.** A single node's store has enormous headroom — in our lab a local
|
|
167
|
+
store sustained on the order of **tens of thousands of commits per second**, far more than any one ordered
|
|
168
|
+
interface can generate. This is *why* the scaling story is "add interfaces," not "make one interface
|
|
169
|
+
faster": the shared store is nowhere near the wall.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 5. Message and transformation factors
|
|
174
|
+
|
|
175
|
+
- **Message size.** A small ADT message and a large message carrying an embedded document are not the same
|
|
176
|
+
unit of work. Bigger messages cost more to parse, store, encrypt, and transmit.
|
|
177
|
+
- **Parsing and validation.** Fast, tolerant field inspection on the routing path is cheap. Full strict
|
|
178
|
+
validation is deliberately opt-in per feed because it is the slow path — turn it on where you need
|
|
179
|
+
conformance, not everywhere.
|
|
180
|
+
- **Transformation complexity.** How much work your handler does per message directly affects the rate.
|
|
181
|
+
Heavy transformation is one of the largest hardware-independent reducers of throughput.
|
|
182
|
+
- **Live enrichment lookups.** A handler may do a sanctioned read-only lookup (e.g. a provider or
|
|
183
|
+
eligibility check against a database or FHIR endpoint). Each lookup is another round-trip that adds to a
|
|
184
|
+
message's time in the pipeline — powerful, but use it deliberately.
|
|
185
|
+
- **Fan-out.** If one inbound message is delivered to *N* destinations, that's *N* deliveries to commit and
|
|
186
|
+
*N* partners to wait on. Each destination is its own independent lane.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 6. Why "messages per day" is a misleading unit
|
|
191
|
+
|
|
192
|
+
**Healthcare message traffic is bursty — it is nothing like a flat, around-the-clock stream.** It follows
|
|
193
|
+
the operational rhythm of the facilities behind it, and that shape matters far more than the daily total.
|
|
194
|
+
|
|
195
|
+
### The shape of real traffic
|
|
196
|
+
|
|
197
|
+
- **Within a day:** volume is light overnight, ramps up sharply in the morning as registration, admissions,
|
|
198
|
+
rounds, lab draws, and shift changes begin, peaks during the busy clinical hours, and tapers into the
|
|
199
|
+
evening. Emergency-department and registration surges create short, sharp spikes on top of that curve.
|
|
200
|
+
- **Across a week:** weekdays run **several times heavier** than weekends, driven by elective admissions,
|
|
201
|
+
scheduled procedures, and clinic activity.
|
|
202
|
+
- **Across a year:** seasonal load (e.g. respiratory-illness season) shifts the baseline further.
|
|
203
|
+
|
|
204
|
+
### The number that actually matters: the peak hour
|
|
205
|
+
|
|
206
|
+
A system doesn't experience the daily *average* — it experiences the **busiest hour**. If you size for the
|
|
207
|
+
average, you will be underwater exactly when volume is highest: queues back up, and end-to-end latency
|
|
208
|
+
climbs right when timeliness matters most.
|
|
209
|
+
|
|
210
|
+
**In the production ADT feeds we've profiled, the busiest hour runs about 2.7× the all-day average rate.**
|
|
211
|
+
So a feed that averages out to some tidy daily figure is actually asking for **nearly three times that
|
|
212
|
+
average rate** during its peak — and *that* is the rate your interface has to sustain.
|
|
213
|
+
|
|
214
|
+
### Same interface, very different "daily capacity"
|
|
215
|
+
|
|
216
|
+
Because you must size to the peak, the realistic daily capacity of an interface is well below the naive
|
|
217
|
+
"sustained rate × 86,400 seconds" figure:
|
|
218
|
+
|
|
219
|
+
| | Naive (assumes flat traffic) | Realistic (peak = 2.7× average) |
|
|
220
|
+
|---|---|---|
|
|
221
|
+
| One ordered interface at 60 msg/s | ~5.2 M messages/day | **~1.9 M messages/day** |
|
|
222
|
+
|
|
223
|
+
Nothing about the engine changed between those two columns — only the assumption about traffic shape. The
|
|
224
|
+
naive number is off by nearly 3×.
|
|
225
|
+
|
|
226
|
+
**This is why a bare "handles X million messages/day" claim is close to meaningless.** Two feeds with the
|
|
227
|
+
*same* daily total but different burst profiles need very different capacity. Always ask for the
|
|
228
|
+
**peak-hour rate**, the **message size**, and the **ordering guarantee** behind any daily figure — those,
|
|
229
|
+
not the daily total, tell you whether it fits your environment.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 7. Putting it together: how to size a deployment
|
|
234
|
+
|
|
235
|
+
There is no single throughput number — there's a short calculation using *your* inputs:
|
|
236
|
+
|
|
237
|
+
1. **Start from the per-interface ceiling** for your ordering mode (our lab reference: ~60 msg/s ordered,
|
|
238
|
+
with an instant partner).
|
|
239
|
+
2. **Apply your partner's real acknowledgement time** (§2). This is usually the biggest reduction.
|
|
240
|
+
3. **Apply your traffic's burst factor** (§6) — divide by ~2.7 for ADT-shaped traffic (or measure your own
|
|
241
|
+
feed's peak-hour ÷ daily-average ratio).
|
|
242
|
+
4. **Fan out to enough interfaces** to cover your aggregate peak, splitting feeds at the source.
|
|
243
|
+
|
|
244
|
+
### A worked (illustrative) example
|
|
245
|
+
|
|
246
|
+
Suppose a partner acknowledges in ~25 ms and you have ADT-shaped traffic:
|
|
247
|
+
|
|
248
|
+
- Ordered throughput per interface ≈ 1000 ÷ (16 + 25) ≈ **~24 msg/s**.
|
|
249
|
+
- Peak-aware daily capacity ≈ 24 × 86,400 ÷ 2.7 ≈ **~0.8 M messages/day per interface**.
|
|
250
|
+
- To carry, say, a 5-million-message/day aggregate, you'd fan out to roughly **6–7 interfaces** — each
|
|
251
|
+
comfortably within one node's shared-store headroom.
|
|
252
|
+
|
|
253
|
+
Your inputs will differ; the point is the *method*. Plug in your partner latency and your peak factor, then
|
|
254
|
+
count interfaces.
|
|
255
|
+
|
|
256
|
+
### Fan-out is the scaling story
|
|
257
|
+
|
|
258
|
+
A mega health system cannot push all of its ADT through one interface, and it doesn't need to. It splits
|
|
259
|
+
the feed at the source — by hospital, facility, region, or service line — across **multiple interfaces**.
|
|
260
|
+
Aggregate capacity is the sum of the interfaces; the shared message store on a single node has ample
|
|
261
|
+
headroom for the combined load, so you scale out by adding interfaces rather than trying to make one pipe
|
|
262
|
+
infinitely fast.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 8. Reference lab measurements (and their caveats)
|
|
267
|
+
|
|
268
|
+
These are the figures referenced above, stated with full conditions so you can judge how they map to your
|
|
269
|
+
environment. **They are theoretical maxima under controlled conditions using synthetic data — not
|
|
270
|
+
guarantees, and not measured against any live clinical system.**
|
|
271
|
+
|
|
272
|
+
| Measurement | Value | Conditions |
|
|
273
|
+
|---|---|---|
|
|
274
|
+
| End-to-end delivery, one ordered interface | **~60 msg/s** | Single strictly-ordered MLLP interface, synthetic ADT, pass-through (no heavy transform), server database over a LAN, default settings, **instant-acknowledging partner**. |
|
|
275
|
+
| Intake (ACK-on-receipt) | **~450 msg/s** | Same setup; measures accept-and-persist, not end-to-end delivery. |
|
|
276
|
+
| Single-node store commit ceiling | **~tens of thousands of commits/s** | Local NVMe store; the shared store is far from the bottleneck for realistic interface counts. |
|
|
277
|
+
| Engine's own per-message overhead | **~16 ms** | Derived from the ordered end-to-end rate with an instant partner; this is the portion MessageFoundry contributes. |
|
|
278
|
+
|
|
279
|
+
**Why these are conservative and why your mileage will vary:**
|
|
280
|
+
|
|
281
|
+
- **Ordered, single interface.** The default strict-FIFO mode is serial by design. Unordered feeds and
|
|
282
|
+
multiple interfaces both go faster.
|
|
283
|
+
- **Instant partner.** The lab partner acknowledges immediately. **Real partners don't** — and as §2 shows,
|
|
284
|
+
their round-trip time is usually the dominant factor. This is the single largest reason your end-to-end
|
|
285
|
+
number will differ from the lab number.
|
|
286
|
+
- **No independent industry benchmark exists.** There is no trustworthy public per-node throughput number
|
|
287
|
+
for the major integration engines either — every published msg/s figure is hardware- and
|
|
288
|
+
workload-dependent. Treat *all* such numbers (including these) as starting points for your own
|
|
289
|
+
measurement, not as guarantees.
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Takeaways
|
|
294
|
+
|
|
295
|
+
1. MessageFoundry adds only a few milliseconds per message; **your partner systems and round-trip times set
|
|
296
|
+
the real throughput.**
|
|
297
|
+
2. There are **two** rates — fast intake and slower end-to-end delivery. Know which one a number refers to.
|
|
298
|
+
3. **Strict ordering is serial** and therefore bounded; relax ordering, add connections, or fan out when you
|
|
299
|
+
need more.
|
|
300
|
+
4. Traffic is **bursty** — size to the **peak hour (≈ 2.7× the average)**, not the daily total. "Messages
|
|
301
|
+
per day" alone tells you little.
|
|
302
|
+
5. **Scale by fanning out** to multiple interfaces; one node's store has ample headroom.
|
|
303
|
+
6. Interrogate every throughput claim with four questions: **message size, ordering, partner
|
|
304
|
+
acknowledgement time, and peak-hour rate.**
|