messagefoundry 0.2.11__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.11 → messagefoundry-0.2.13}/.github/workflows/benchmark.yml +2 -2
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/ci.yml +74 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/release.yml +5 -1
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.gitignore +4 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/CHANGELOG.md +97 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/PKG-INFO +1 -1
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/compose.yaml +1 -1
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/BACKLOG.md +321 -3
- messagefoundry-0.2.13/docs/BRAND.md +103 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/CLOUD-DEPLOYMENT.md +1 -1
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/CLUSTERING.md +8 -1
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/CONFIGURATION.md +4 -2
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/DEPLOY-SERVER-DB.md +34 -1
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/MENTAL-MODEL.md +1 -1
- messagefoundry-0.2.13/docs/THROUGHPUT.md +304 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0001-staged-pipeline-architecture.md +6 -1
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0037-multi-process-sharding-l3.md +6 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0055-group-commit-durable-write.md +8 -0
- messagefoundry-0.2.13/docs/adr/0056-engine-managed-vip-failover.md +643 -0
- messagefoundry-0.2.13/docs/adr/0057-inline-step-a-fast-path.md +184 -0
- messagefoundry-0.2.13/docs/adr/0058-batch-claim-fifo-prefix.md +251 -0
- messagefoundry-0.2.13/docs/adr/0059-seq-only-fifo-ordering.md +55 -0
- messagefoundry-0.2.13/docs/adr/0060-rename-based-fifo-index-migration.md +78 -0
- messagefoundry-0.2.13/docs/adr/0061-per-lane-wake-events.md +106 -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.11 → messagefoundry-0.2.13}/docs/benchmarks/step-b-write-amplification.md +16 -2
- messagefoundry-0.2.13/docs/throughput-build-plan.md +102 -0
- messagefoundry-0.2.13/docs/throughput-roadmap.md +361 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/__main__.py +76 -2
- messagefoundry-0.2.13/harness/config/connscale/__init__.py +4 -0
- messagefoundry-0.2.13/harness/config/connscale/_shape.py +111 -0
- messagefoundry-0.2.13/harness/config/connscale/gen_toml.py +106 -0
- messagefoundry-0.2.13/harness/config/connscale/graph.py +91 -0
- messagefoundry-0.2.13/harness/load/connscale/__init__.py +14 -0
- messagefoundry-0.2.13/harness/load/connscale/driver.py +135 -0
- messagefoundry-0.2.13/harness/load/connscale/probe.py +113 -0
- messagefoundry-0.2.13/harness/load/connscale/profile.py +364 -0
- messagefoundry-0.2.13/harness/load/connscale/report.py +300 -0
- messagefoundry-0.2.13/harness/load/connscale/runner.py +622 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/enginepoll.py +99 -3
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/failover.py +6 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profile.py +5 -1
- messagefoundry-0.2.13/harness/load/profiles/connscale-smoke.toml +31 -0
- messagefoundry-0.2.13/harness/load/profiles/connscale.toml +35 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/report.py +10 -2
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/__init__.py +1 -1
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/__main__.py +18 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/api/app.py +62 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/api/models.py +52 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/ingest_time.py +8 -1
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/settings.py +38 -4
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/wiring.py +9 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/status.py +12 -1
- messagefoundry-0.2.13/messagefoundry/pipeline/connscale_shim.py +115 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/engine.py +12 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/sharding.py +37 -2
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/supervisor.py +10 -2
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/wiring_runner.py +588 -241
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/store/base.py +97 -2
- messagefoundry-0.2.13/messagefoundry/store/pool_metrics.py +145 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/store/postgres.py +255 -95
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/store/sqlserver.py +240 -52
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/store/store.py +177 -73
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/support/bundle.py +1 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/worktree/new.ps1 +4 -4
- messagefoundry-0.2.13/tests/test_batch_claim_fifo.py +371 -0
- messagefoundry-0.2.13/tests/test_batch_claim_locking.py +208 -0
- messagefoundry-0.2.13/tests/test_batch_claim_worker.py +154 -0
- messagefoundry-0.2.13/tests/test_connscale_config.py +85 -0
- messagefoundry-0.2.13/tests/test_connscale_driver.py +105 -0
- messagefoundry-0.2.13/tests/test_connscale_postgres.py +110 -0
- messagefoundry-0.2.13/tests/test_connscale_profile.py +107 -0
- messagefoundry-0.2.13/tests/test_connscale_report.py +150 -0
- messagefoundry-0.2.13/tests/test_connscale_smoke.py +143 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_enginepoll_aggregate.py +2 -0
- messagefoundry-0.2.13/tests/test_fifo_index_migration.py +426 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_fifo_ordering.py +2 -1
- messagefoundry-0.2.13/tests/test_inline_fast_path.py +525 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_load_config.py +7 -3
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_load_report.py +17 -3
- messagefoundry-0.2.13/tests/test_per_lane_wake.py +322 -0
- messagefoundry-0.2.13/tests/test_seq_only_fifo.py +463 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_settings.py +66 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_sharding.py +39 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_sqlserver_cursor_close.py +5 -1
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_sqlserver_schema_init.py +44 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_staged_pipeline.py +21 -21
- messagefoundry-0.2.13/tests/test_synchronous_baseline.py +190 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.claude/settings.json +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.dockerignore +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.gitattributes +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/CODEOWNERS +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/SECURITY.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/dependabot.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/cla.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/codeql.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/dependabot-auto-merge.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/dependabot-lock-resync.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/freethread-smoke.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/manifest-lint.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/release-sync-check.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/scorecard.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/security.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/selfhosted-win2025-sql.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/workflows/vuln-metrics.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.github/zizmor.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.gitleaks.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.mefor-hooks/pre-commit +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.pre-commit-config.yaml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/.semgrep/messagefoundry.yml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/CLA.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/CLAUDE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/CODE_OF_CONDUCT.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/COMMERCIAL-LICENSE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/CONTRIBUTING.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/GOVERNANCE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/LICENSE +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/MAINTAINERS.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/NOTICE +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/Dockerfile +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/k8s/ha-postgres.yaml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/k8s/secret.example.yaml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/k8s/statefulset.yaml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/locks/requirements-core.lock +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/locks/requirements-sqlserver.lock +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/secrets.env.example +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/smoke/Dockerfile +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/smoke/config/IB_Test_ADT.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docker/smoke/send_adt.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/ADOPTER-CI.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/AI.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/ANTIVIRUS-FIREWALL.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/ARCHITECTURE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/CI-QUALITY.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/CLOUD-PHI-HIPAA.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/CODESETS.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/CONNECTIONS.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/CONTAINER-EXPOSURE-EVALUATION.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/DEPLOYMENT.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/DICOM.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/DUAL_LICENSING_PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/FEATURE-MAP.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/HL7-VALIDATION.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/INSTALL-GUIDE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/LOAD-TESTING.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/MessageFoundry-Mental-Model.docx +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/PHI.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/POSITIONING.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/REMOTE-CONSOLE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/SECURITY-REMEDIATION-LEDGER.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/SECURITY.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/SERVICE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/SUPPORT-POLICY.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/SYSTEM-REQUIREMENTS.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/Secure_AI_Development_Standards.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/Secure_Development_Standards.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/TEE-RELAY.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/THROUGHPUT-IMPROVEMENTS.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/USER-GUIDE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/WORKTREES.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0005-transform-accessible-state.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0006-external-data-lookups.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0008-cluster-observability-api.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0009-run-scoped-context-providers.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0011-timer-scheduled-source.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0012-x12-edi-codec.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0013-increment-2-reingress-design.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0013-query-response-orchestration.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0014-alerting-rules-engine.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0017-consumer-deployment-model.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0023-inbound-http-listener.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0026-off-box-egress-update-check.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0027-per-connection-retention.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0029-email-smtp-destination.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0032-console-desktop-launch.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0033-gui-manageable-code-sets.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0034-static-analysis-triage-policy-accepted-risk-register.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0035-ide-extension-workspace-trust-and-scope.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0036-windows-config-source-trust.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0038-internal-pass-through-connector.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0039-database-tier-sharding-l5.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0040-free-threaded-engine-support.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0041-load-path-attestation-and-change-attribution.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0042-embedded-document-pruning.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0043-fhir-read-lookup.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0044-operator-alert-state.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0045-custom-rbac-roles.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0046-message-content-search.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0047-cloud-kubernetes-ha-deployment-packaging.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0048-third-tier-disaster-recovery-standby.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0049-turnkey-dr-backup-restore-verify.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0050-single-project-root-config-anchoring.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0051-corepoint-throughput-parity-strategy.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0052-enterprise-scale-target.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0053-free-threaded-multicore-engine.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/0054-low-allocation-builtins-hl7-parser.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/adr/TEMPLATE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/architecture-components.png +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/architecture-components.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/architecture-config-graph.png +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/architecture-config-graph.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/architecture-diagram.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/architecture-message-flow.png +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/architecture-message-flow.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/architecture-topology.png +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/architecture-topology.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/benchmarks/TUNING-BASELINE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/design/dbshard.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/design/freethread-spike.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/design/freethread.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/design/multiproc.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/hl7-message-ordering-reference.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/message-ordering-design.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN-4.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN-5.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN-6.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/v0.1-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/research/cloud-deployment-research-2026-06.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/research/config-ux-review.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/research/non-hl7-transform-components.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/ADVISORY-PROCESS.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/ASVS-L3-STATUS.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/BEYOND-ASVS-L3.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/DEPENDENCY-METRICS.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/PHASE-8C-RBAC.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/PUBLISHING.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/RCA-TEMPLATE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/RELEASE-GATE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/REVIEW-2026-06-07.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/SECURITY-POSTURE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/security/THREAT-MODEL.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/testing/VERIFY.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/environments/dev.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/environments/prod.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/acceptance/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/acceptance/__main__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/acceptance/matrix.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/acceptance/probes.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/acceptance/report.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/acceptance/runner.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/compose.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/config/coverage.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/config/load/_shape.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/config/load/graph.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/config/passthrough/graph.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/config/store_once/graph.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/file_panel.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/file_transport.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/corpus.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/correlator.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/failover_track.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/governor.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/ids.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/metrics.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/adt-fanout-stress.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/closed-loop.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/failover.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/fanout-baseline.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/malformed-load.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/reference.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/smoke-sqlserver.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/smoke.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/soak.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/spike-burst.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/sustained-overload.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/profiles/writeamp.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/runner.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/sender.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/load/sink.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/mllp.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/monitor.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/receive.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/reconcile/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/reconcile/__main__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/reconcile/capture.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/reconcile/compare.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/reconcile/normalize.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/reconcile/report.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/scenarios.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/send.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/harness/window.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/.gitignore +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/.vscodeignore +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/esbuild.js +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/media/hl7schema.json +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/media/icon-amber.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/media/icon.png +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/media/icon.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/package-lock.json +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/package.json +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/snippets/messagefoundry.code-snippets +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/aiPolicy.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/alertEditor.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/auth.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/chat.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/cli.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/codeSetEditor.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/codesetsTree.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/completion.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/connectionEditor.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/editorToolbar.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/engineClient.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/engineTarget.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/extension.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/generate.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/git.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/graphTree.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/home.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/insertElement.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/newRoute.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/promote.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/promoteTarget.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/sourceControl.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/test/runTest.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/test/suite/ai-policy.test.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/test/suite/chat.test.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/test/suite/editor-toolbar.test.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/test/suite/engine-target.test.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/test/suite/extension.test.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/test/suite/index.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/test/suite/insert-element.test.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/test/suite/promote-target.test.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/test/suite/pythonpath.test.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/test/suite/settings-scope.test.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/testBench.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/src/validate.ts +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/tsconfig.json +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/ide/tsconfig.test.json +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/mefor.code-workspace +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/adr_analyze.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/anon/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/anon/_pools.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/anon/hl7.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/anon/keying.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/anon/leak.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/anon/rules.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/anon/surrogates.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/api/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/api/approvals.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/api/auth_models.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/api/auth_routes.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/api/field_authz.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/api/metrics.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/api/security.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/api/tls.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/data/common_passwords.txt +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/identity.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/ldap.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/notifications.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/passwords.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/permissions.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/policy.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/ratelimit.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/service.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/tokens.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/auth/totp.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/checks.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/active_environment.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/ai_policy.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/alerts_edit.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/anchor.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/code_sets.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/codeset_edit.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/connections_edit.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/connections_file.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/db_lookup.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/environments.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/fhir_lookup.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/fingerprint.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/models.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/reference.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/response.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/run_context.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/state.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/config/tls_policy.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/__main__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/_async.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/alerts_page.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/change_password.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/client.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/connections.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/dead_letters_page.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/delegates.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/event_log_page.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/icons/alerts.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/icons/connections.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/icons/dead-letters.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/icons/engine-status.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/icons/log-search.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/icons/logo-lockup.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/icons/users.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/login.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/mfa.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/reauth.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/resources/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/resources/app.ico +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/resources/app.svg +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/search.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/service_control.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/sessions.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/shards.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/shell.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/theme.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/users_page.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/console/widgets.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/_core.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/_hl7data.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/adt.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/all_types.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/bar.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/dft.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/documents.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/mdm.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/mfn.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/oml.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/orl.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/orm.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/oru.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/ras.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/rde.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/siu.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/generators/vxu.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/hl7schema.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/integrity.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/last_resort.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/logging_setup.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/_backend.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/_builtin_hl7.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/binary.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/consistency.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/_deps.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/_util.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/dataset.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/errors.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/dicom/peek.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/fhir/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/fhir/_deps.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/fhir/errors.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/fhir/peek.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/fhir/resource.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/groups.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/message.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/peek.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/split.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/summary.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/tree.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/validate.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/_deps.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/delimiters.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/errors.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/interchange.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/message.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/peek.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/x12/validate.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/_deps.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/errors.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/harden.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/message.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/schema.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/parsing/xml/signature.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/alert_sinks.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/alerts.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/cert_expiry.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/cluster.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/config_convergence.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/dr.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/dr_backup.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/dryrun.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/leader_tasks.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/reference_sync.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/retention.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/security_notify.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/state_convergence.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/pipeline/update_check.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/py.typed +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/redaction.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/scaffold.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/secrets_dpapi.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/store/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/store/audit_tee.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/store/backup_codec.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/store/content_search.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/store/crypto.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/store/document_strip.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/store/keyprovider.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/support/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/support/redact.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/timezone.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/base.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/database.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/dicom.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/dicomweb.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/email.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/fhir.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/file.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/framing.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/http_listener.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/loopback.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/mllp.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/passthrough.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/remotefile.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/rest.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/signing.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/smart.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/soap.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/tcp.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/timer.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/transports/x12.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/verify/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/verify/checks.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/verify/model.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/verify/report.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/verify/runner.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/messagefoundry/verify/smoke.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/packaging/console-installer/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/packaging/console-installer/THIRD-PARTY-NOTICES.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/packaging/console-installer/THIRD-PARTY-NOTICES.txt +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/packaging/console-installer/console_launcher.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/packaging/console-installer/licenses/GPL-3.0.txt +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/packaging/console-installer/licenses/LGPL-3.0.txt +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/packaging/console-installer/messagefoundry-console.iss +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/packaging/console-installer/messagefoundry-console.spec +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/packaging/messagefoundry-harness/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/packaging/messagefoundry-harness/pyproject.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/pyproject.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/requirements.lock +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/config/IB_ACME_ADT.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/config/IB_FHIR_INTAKE.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/config/IB_PARTNER_X12.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/config/IB_RADIOLOGY_SR.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/config/adt.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/config/codesets/event_labels.csv +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/config/codesets/facility_mnemonics.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/config/connections.toml +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/consistency/validated_adt.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/dicom/generate_sr_sample.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/adt_a01.hl7 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/adt_batch.hl7 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/messages/x12_270_eligibility.edi +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/results_relay/README.md +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/results_relay/codesets/test_codes.csv +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/results_relay/messages/oru_results.hl7 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/results_relay/results_relay.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/samples/send_mllp.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/console/install-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/console/pack_ico.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/dev/postgres.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/dev/sqlserver-docker.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/dev/sqlserver.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/publish/check_release_sync.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/publish/publish-denylist.txt +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/publish/publish.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/publish/scan_forbidden.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/security/crypto_inventory_check.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/security/vuln_metrics.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/service/import-db-ca.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/service/install-service.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/service/uninstall-service.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/trace_icon.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/worktree/remove.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/worktree/session-context.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/scripts/worktree/spawn.ps1 +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/__main__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/anon/__init__.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/anon/_hl7data.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/anon/_pools.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/anon/hl7.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/anon/keying.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/anon/leak.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/anon/rules.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/anon/surrogates.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/compare.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/correlate.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/hl7_fields.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/mefor_api.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/mllp.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/relay.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/report.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tee/store.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/_dicom_sample.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/_failover_load_support.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/_fhir_fixtures.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/conftest.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_acceptance_framework.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_ack_capture_runner.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_ack_sent_store.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_active_environment.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_ad_group_scope.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_admin_new_ip.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_adr_analyze.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_ai_policy.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_alert_rules.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_alert_sinks.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_alert_state.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_alerts_edit.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_alerts_rules_api.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_anon_core.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_anon_integration.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_anon_parity.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_api.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_api_alerts.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_api_auth.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_api_reload.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_api_tls.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_approvals.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_asvs_phase0.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_audit_integrity.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_audit_offbox_tee.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_auth_core.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_auth_entry_hardening.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_auth_hardening.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_auth_service.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_auth_session_lifecycle.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_auth_store.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_backup_crypto.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_backup_restore_atleastonce.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_backup_runner.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_binary_carriage.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_bootstrap_admin_perms.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_builtin_hl7_parity.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_cert_expiry.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_channel_rbac.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_checks.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_checks_lint.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_cli.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_cli_offline_resolution.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_cluster.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_cluster_failover_postgres.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_cluster_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_cluster_graph_gating.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_cluster_lease.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_code_sets.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_codeset_edit.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_config_anchoring.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_config_fingerprint.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_config_source_trust.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_connection_api.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_connection_event_api.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_connection_event_emit.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_connection_event_outbound.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_connection_event_scope.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_connection_event_store.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_connection_resilience.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_connections_cli.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_connections_file.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_consistency.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_alerts.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_auth.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_client.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_dead_letters.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_event_log.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_hardening.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_icon.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_password.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_sessions.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_shards.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_status.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_step_up.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_theme.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_users.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_console_widgets.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_content_search.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_custom_roles.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_database_connector_integration.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_database_transport.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_db_lookup.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_db_lookup_live_runner.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_delivery_settings.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dependabot_automerge_guardrails.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dependency_boundaries.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dicom_codec.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dicom_scp.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dicom_scp_security.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dicom_scu.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dicom_wiring.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dicomweb.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_docs_runbooks.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dr_activation.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dr_api_status.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dr_failback.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dr_rbac.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dr_run_profile.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dr_seeding.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dryrun.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_dual_control_reload.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_ed_documents.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_ed_documents_e2e.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_egress_allowlist.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_email_destination.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_embedded_document_pruning.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_environments.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_fhir_lookup.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_fhir_parsing.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_fhir_resource.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_fhir_transport.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_field_authz.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_field_authz_metadata.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_frozen_launch_smoke.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_generate_cli.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_generated_adt.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_generators_core.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_generators_types.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_group_commit.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_groups.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_harness.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_harness_compose.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_harness_config.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_harness_faults.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_harness_file.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_harness_monitor.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_harness_scenarios.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_hl7_core_features.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_hl7schema.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_inbound_bind.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_inbound_http_source.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_ingest_time.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_keyprovider.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_last_admin_guard.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_last_resort.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_leader_tasks.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_license_notice.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_listener_tls_exposure.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_load_corpus.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_load_failover_postgres.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_load_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_load_failover_unit.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_load_metrics.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_load_profile.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_load_runner.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_load_sender.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_load_sink.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_logging.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_message.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_message_split.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_message_timestamps.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_metrics_exporter.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_mfa.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_mllp_encoding_override.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_mllp_tls.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_nonhl7_ingress_size_cap.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_operability_config.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_outbound_signing.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_outbound_simulate.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_packaging.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_parse_tree.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_parsing.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_passthrough.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_passthrough_graph.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_payload_agnostic_ingress.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_per_connection_retention.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_pool_warm.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_postgres_store.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_priority_resolution.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_reconcile_capture.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_reconcile_compare.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_reconcile_harness.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_redaction.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_reference_sets.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_reingress.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_release_console_installer.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_remotefile_transport.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_response_capture.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_rest_transport.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_restore_verify.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_retention.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_run_context.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_scaffold.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_scaffold_requirements.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_scan_forbidden.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_secrets_dpapi.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_security_notify.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_security_static.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_service_control.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_sibling_helper_finder.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_smart_backend.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_soap_transport.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_soap_wssecurity.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_sqlserver_coordinator.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_sqlserver_store.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_startup_attestation.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_startup_fault_isolation.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_stats_reset.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_step_up.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_store.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_store_backend.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_store_encryption.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_store_file_hardening.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_store_once_deliver_many.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_store_once_graph.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_store_read_pool.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_store_ssl.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_summary.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_supervisor.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_support_bundle.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_task_resilience.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_tcp_transport.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_tee_cli.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_tee_compare.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_tee_correlate.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_tee_hl7_fields.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_tee_mefor_api.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_tee_mllp.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_tee_relay.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_tee_report.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_tee_store.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_timer_source.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_timezone.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_tls_policy.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_totp.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_totp_window.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_transform_offloop.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_transform_state.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_transports.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_update_check.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_verify.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_version.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_win2025_acceptance.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_wiring.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_wiring_engine.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_wiring_reload.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_wiring_serve.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_ws_stats_revalidation.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_x12_parsing.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_x12_rte.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_x12_source_ip_allowlist.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_x12_transport.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_x12_validate.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_xml_message.py +0 -0
- {messagefoundry-0.2.11 → messagefoundry-0.2.13}/tests/test_xml_schema_signature.py +0 -0
- {messagefoundry-0.2.11 → 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:
|
|
@@ -431,6 +431,33 @@ jobs:
|
|
|
431
431
|
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
432
432
|
run: pytest tests/test_load_failover_sqlserver.py -v
|
|
433
433
|
|
|
434
|
+
- name: Run the throughput-lever backend invariants on real SQL Server (B1 inline, B2 batch-claim, ...)
|
|
435
|
+
env:
|
|
436
|
+
MEFOR_TEST_SQLSERVER: "1"
|
|
437
|
+
MEFOR_STORE_BACKEND: sqlserver
|
|
438
|
+
MEFOR_STORE_SERVER: localhost
|
|
439
|
+
MEFOR_STORE_PORT: "1433"
|
|
440
|
+
MEFOR_STORE_DATABASE: MessageFoundry
|
|
441
|
+
MEFOR_STORE_AUTH: sql
|
|
442
|
+
MEFOR_STORE_USERNAME: sa
|
|
443
|
+
MEFOR_STORE_PASSWORD: "Str0ng_P@ssw0rd!"
|
|
444
|
+
MEFOR_STORE_TRUST_SERVER_CERTIFICATE: "true"
|
|
445
|
+
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
446
|
+
# The staged-pipeline throughput levers (ADR 0057 inline fast-path, ADR 0058 batch-claim, ...) carry
|
|
447
|
+
# reliability-core invariant tests — crash-replay, poison-bound, and the per-lane-FIFO locked-head-
|
|
448
|
+
# BLOCKS (#285) gate — that are MEFOR_TEST_SQLSERVER-gated but live in their OWN files, so the named
|
|
449
|
+
# suites above never picked them up and they ran only on SQLite. Run them here against the real
|
|
450
|
+
# backend. APPEND each new lever's test file per docs/throughput-build-plan.md.
|
|
451
|
+
run: >-
|
|
452
|
+
pytest -v
|
|
453
|
+
tests/test_inline_fast_path.py
|
|
454
|
+
tests/test_batch_claim_fifo.py
|
|
455
|
+
tests/test_batch_claim_worker.py
|
|
456
|
+
tests/test_batch_claim_locking.py
|
|
457
|
+
tests/test_seq_only_fifo.py
|
|
458
|
+
tests/test_fifo_index_migration.py
|
|
459
|
+
tests/test_per_lane_wake.py
|
|
460
|
+
|
|
434
461
|
# Postgres store backend (Track B): run the gated store suite against a real PostgreSQL service
|
|
435
462
|
# container (Linux, so 1x minutes). Skipped on PRs like the other server-DB job to save spend; runs
|
|
436
463
|
# on push to main and on-demand (workflow_dispatch — use `gh workflow run ci.yml --ref <branch>` to
|
|
@@ -504,6 +531,53 @@ jobs:
|
|
|
504
531
|
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
505
532
|
run: pytest tests/test_load_failover_postgres.py -v
|
|
506
533
|
|
|
534
|
+
- name: Run the throughput-lever backend invariants on real Postgres (B1 inline, B2 batch-claim, ...)
|
|
535
|
+
env:
|
|
536
|
+
MEFOR_TEST_POSTGRES: "1"
|
|
537
|
+
MEFOR_STORE_BACKEND: postgres
|
|
538
|
+
MEFOR_STORE_SERVER: localhost
|
|
539
|
+
MEFOR_STORE_PORT: "5432"
|
|
540
|
+
MEFOR_STORE_DATABASE: messagefoundry
|
|
541
|
+
MEFOR_STORE_USERNAME: postgres
|
|
542
|
+
MEFOR_STORE_PASSWORD: mefor
|
|
543
|
+
MEFOR_STORE_ENCRYPT: "false"
|
|
544
|
+
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
545
|
+
# The throughput levers' MEFOR_TEST_POSTGRES-gated invariants (esp. the FOR-UPDATE no-SKIP-LOCKED
|
|
546
|
+
# locked-head-BLOCKS twin of #285, and the batch FIFO/crash tests) live in their own files. APPEND
|
|
547
|
+
# each new lever's test file per docs/throughput-build-plan.md.
|
|
548
|
+
run: >-
|
|
549
|
+
pytest -v
|
|
550
|
+
tests/test_inline_fast_path.py
|
|
551
|
+
tests/test_batch_claim_fifo.py
|
|
552
|
+
tests/test_batch_claim_worker.py
|
|
553
|
+
tests/test_batch_claim_locking.py
|
|
554
|
+
tests/test_seq_only_fifo.py
|
|
555
|
+
tests/test_fifo_index_migration.py
|
|
556
|
+
tests/test_per_lane_wake.py
|
|
557
|
+
|
|
558
|
+
- name: Run the connection-scale pool-wait smoke on real Postgres (B11 wall #2, tiny pool)
|
|
559
|
+
env:
|
|
560
|
+
MEFOR_TEST_POSTGRES: "1"
|
|
561
|
+
MEFOR_STORE_BACKEND: postgres
|
|
562
|
+
MEFOR_STORE_SERVER: localhost
|
|
563
|
+
MEFOR_STORE_PORT: "5432"
|
|
564
|
+
MEFOR_STORE_DATABASE: messagefoundry
|
|
565
|
+
MEFOR_STORE_USERNAME: postgres
|
|
566
|
+
MEFOR_STORE_PASSWORD: mefor
|
|
567
|
+
MEFOR_STORE_ENCRYPT: "false"
|
|
568
|
+
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
569
|
+
# FORCE a below-default pool (4 connections) so the perf_counter-measured acquire-WAIT
|
|
570
|
+
# histogram (the PRIMARY pool-wait signal) is non-trivial even at small N: ~3N inbound workers
|
|
571
|
+
# contend for 4 connections, so acquires actually queue and the percentiles populate. The
|
|
572
|
+
# default pool (40) would mask the wall. 4 (not 1-2) is deliberate: GET /status runs
|
|
573
|
+
# db_status()'s four sequential COUNT(*) queries on every poll, and an extremely tiny pool
|
|
574
|
+
# starves those acquires past the poller's HTTP timeout under the empty-claim herd on a slow
|
|
575
|
+
# runner — every poll then fails and the drain loops burn the test budget (the PR #675 hang).
|
|
576
|
+
# This still gives the B11 pool-wait instrumentation real regression coverage SQLite (no pool)
|
|
577
|
+
# cannot — the connscale harness OWNS the engine subprocess and inherits this env.
|
|
578
|
+
MEFOR_STORE_POOL_SIZE: "4"
|
|
579
|
+
run: pytest tests/test_connscale_postgres.py -v
|
|
580
|
+
|
|
507
581
|
# Headless load test (Track B / throughput): serve the synthetic high-fan-out load config (auth
|
|
508
582
|
# off, small fan-out) and drive the smoke profile through the real `python -m harness --load` CLI,
|
|
509
583
|
# asserting zero message loss + all SLOs (exit 0) and uploading the JSON/CSV report. Skipped on PRs
|
|
@@ -347,7 +347,11 @@ jobs:
|
|
|
347
347
|
MEFOR_FROZEN_CONSOLE_DIR: dist/messagefoundry-console
|
|
348
348
|
QT_QPA_PLATFORM: offscreen
|
|
349
349
|
run: |
|
|
350
|
-
|
|
350
|
+
# pytest-timeout is required: the repo's pyproject `addopts` sets `--timeout=60
|
|
351
|
+
# --timeout-method=thread`, so a bare `pip install pytest` aborts the run with
|
|
352
|
+
# "unrecognized arguments: --timeout" before the smoke ever executes (it leaves the per-test
|
|
353
|
+
# watchdog intact instead of stripping addopts).
|
|
354
|
+
pip install pytest pytest-timeout
|
|
351
355
|
python -m pytest tests/test_frozen_launch_smoke.py -v -p no:cacheprovider
|
|
352
356
|
|
|
353
357
|
- name: Install Inno Setup (pinned)
|
|
@@ -80,6 +80,10 @@ TRANSCRIPTS.md
|
|
|
80
80
|
# Still usable by name (they sit in PROFILES_DIR) and copy-on to the test box.
|
|
81
81
|
/harness/load/profiles/hospital-baseline.toml
|
|
82
82
|
/harness/load/profiles/soak-12h.toml
|
|
83
|
+
# Deep-research survey of alternative OSS DB backends for the shared-DB commit-wall — local working
|
|
84
|
+
# note, not a committed artifact (the conclusion is carried in the throughput ADRs / AI memory).
|
|
85
|
+
/docs/research/db-commit-wall-backend-survey.md
|
|
86
|
+
|
|
83
87
|
# --- MessageFoundry ---
|
|
84
88
|
.mefor/
|
|
85
89
|
*.db*
|
|
@@ -6,6 +6,103 @@ 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
|
+
|
|
49
|
+
## [0.2.12] — 2026-07-01 — Early Access
|
|
50
|
+
|
|
51
|
+
The **throughput & connection-scale wave.** The staged-queue per-message commit chain is shortened
|
|
52
|
+
(opt-in inline fast-path + batch-claim, plus a result-preserving seq-only FIFO ordering that drops a
|
|
53
|
+
per-handoff round-trip); a connection-scale measurement harness + read-only engine instrumentation lands;
|
|
54
|
+
**per-lane wake events** (opt-in) eliminate the thundering-herd empty-claim storm that dominates at high
|
|
55
|
+
connection counts; and ADR 0059's seq-only FIFO index re-key now reaches **upgraded** databases via a
|
|
56
|
+
one-time on-open migration. All new *runtime* behavior is opt-in / off-by-default unless noted — the
|
|
57
|
+
seq-only ordering (B3) and the index migration (B10) are result-preserving.
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
- **Inline Step-A fast-path** ([ADR 0057](docs/adr/0057-inline-step-a-fast-path.md)) — **opt-in per
|
|
61
|
+
inbound via `inline`**: for the pure all-deliver message (no filter/state/pass-through), fuse
|
|
62
|
+
route+transform+handoff into **one committed transaction**, cutting the per-message commit depth from 7
|
|
63
|
+
to 5 durable round-trips. Off by default → byte-identical to the split path; ineligible messages fall
|
|
64
|
+
back automatically.
|
|
65
|
+
- **Batch-claim** (#671, [ADR 0058](docs/adr/0058-batch-claim-fifo-prefix.md)) — **opt-in via
|
|
66
|
+
`[store].fifo_claim_batch`** (>1): the INGRESS/ROUTED FIFO claim takes the contiguous due head-prefix in
|
|
67
|
+
one commit instead of one row per commit, processed in strict FIFO order. Default `1` = off
|
|
68
|
+
(byte-identical); preserves per-lane FIFO (#285) and at-least-once.
|
|
69
|
+
- **Per-lane wake events** (#678, [ADR 0061](docs/adr/0061-per-lane-wake-events.md)) — **opt-in via
|
|
70
|
+
`[pipeline].per_lane_wake`**: a committed message wakes **only its own `(stage, lane)` worker** instead
|
|
71
|
+
of every worker of that stage, eliminating the thundering-herd empty-claim storm at high **connection**
|
|
72
|
+
counts (~1,500 inbounds). Default off + byte-identical; the FIFO claim and the lost-wakeup poll backstop
|
|
73
|
+
are unchanged (a missed wake self-heals). Env override `MEFOR_PIPELINE_PER_LANE_WAKE` for the harness A/B.
|
|
74
|
+
- **Connection-scale measurement harness + read-only engine instrumentation** (#675) — a headless harness
|
|
75
|
+
that spins N inbound connections at a low per-connection rate and reads the connection-scale walls
|
|
76
|
+
(executor saturation, server-store pool wait, idle-poll storm, FD/socket count, config-reload + ACK
|
|
77
|
+
latency) vs connection count. The supporting engine instrumentation is **additive + read-only**, surfaced
|
|
78
|
+
via `/stats` + `/status`: empty-claim counters split into idle-poll vs per-commit wake-fanout, and (on a
|
|
79
|
+
server store) connection-pool acquire-wait percentiles + size/idle occupancy. Counters default to 0 /
|
|
80
|
+
`None` — byte-identical when unused.
|
|
81
|
+
|
|
82
|
+
### Changed
|
|
83
|
+
- **Seq-only per-lane FIFO ordering** (#673, [ADR 0059](docs/adr/0059-seq-only-fifo-ordering.md)) — the
|
|
84
|
+
per-lane FIFO claim now orders by the DB-assigned `seq` (rowid on SQLite) **alone** instead of
|
|
85
|
+
`(created_at, seq)`, and the per-insert `SELECT MAX(created_at)` clamp is removed from **every stage
|
|
86
|
+
handoff** (one fewer round-trip per produced row). **Result-preserving** (proven order-isomorphic to the
|
|
87
|
+
prior clamped ordering) and strictly more robust under clock skew / failover (`seq` has no wall-clock
|
|
88
|
+
dependence). `created_at` stays a real ingest-time/metrics timestamp — it is simply no longer an ordering
|
|
89
|
+
key. The FIFO covering indexes re-key to trail in `seq` (see the migration below).
|
|
90
|
+
- **Rename-based FIFO covering-index migration** (#676, [ADR 0060](docs/adr/0060-rename-based-fifo-index-migration.md)) —
|
|
91
|
+
ADR 0059 re-keyed the per-lane FIFO indexes to trail in `seq` for the seq-only claim, but kept their names
|
|
92
|
+
under `IF NOT EXISTS` guards, so **only fresh databases** adopted the new index — an upgraded DB silently
|
|
93
|
+
kept its old `created_at`-trailing index and never got ADR 0059's throughput win. The seq-trailing indexes
|
|
94
|
+
are now named `ix_queue_fifo_in_seq` / `ix_queue_fifo_out_seq`, and a one-time, idempotent **on-open
|
|
95
|
+
migration drops the old-named index and builds the new one** on all three backends, so upgraded databases
|
|
96
|
+
adopt it. Correctness is unchanged (the claim orders by `seq`/`rowid` and names no index, so the migration
|
|
97
|
+
only restores speed). Operational notes: the first open after upgrade pays a **one-time index rebuild** on
|
|
98
|
+
the `queue` table (SQLite/Postgres blocking, SQL Server offline — bounded by live queue depth, at cold start
|
|
99
|
+
before serving); on a very large SQLite queue a *concurrent* second opener may hit a transient, non-corrupting
|
|
100
|
+
open failure during the rebuild; the shared-DB backends (SQL Server / Postgres) should upgrade **stop-the-world
|
|
101
|
+
/ under a drain window** (a mixed-version fleet or a live rejoin can re-create or contend on the index); a
|
|
102
|
+
downgrade re-creates the old-named index (drop `ix_queue_fifo_in/out` manually if downgrading permanently).
|
|
103
|
+
- **`/status` DB observability** — the SQLite journal mode and `synchronous` durability setting are now
|
|
104
|
+
surfaced in the DB status (`synchronous=NORMAL` remains the crash-safe-under-WAL default).
|
|
105
|
+
|
|
9
106
|
## [0.2.11] — 2026-06-29 — Early Access
|
|
10
107
|
|
|
11
108
|
The **Plan-6 disaster-recovery + cloud/HA wave** — turnkey DR backup/restore-verify and a third-tier DR
|
|
@@ -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
|
|
@@ -114,6 +114,7 @@ protects the minimal-dep, on-prem, code-first identity.
|
|
|
114
114
|
| **ASVS 4.1.5 per-message signing** | Med | **done** | — | #378 merged (`9c00b88`). Prune the stale `asvs-415-msg-signing` worktree. |
|
|
115
115
|
| **#74 host CPU/mem metrics** | Med | **do-next** | S | Promoted from the #52 gap synthesis (2026-06-28) — the one zero-identity-tension additive win: host CPU/mem (psutil) on the metrics surface beside the #50 disk meter. Adds `psutil` (vet + re-lock). SQL-internals sub-scope demand-gated. |
|
|
116
116
|
| **Publish the VS Code extension (Marketplace + Open VSX)** | Med | do-next | M | Publish the `ide/` extension to the **VS Code Marketplace** + **Open VSX** (`.vsix` via `vsce`/`ovsx`) so users install it instead of F5-from-source; add a CI publish leg + publisher accounts. **Owner: do soon, AFTER the planned IDE-focused improvements land** (not now — recorded 2026-06-26). Not a PyPI artifact (different ecosystem). |
|
|
117
|
+
| **#95 engine-brokered AI assist** | Low | on-trigger | L | BYO already covers "use our existing AI subscription" (Copilot/Claude via `vscode.lm`, or an in-house model surfaced through VS Code) with **zero** engine work; this is the documented P1/P2 broker — engine-centralized, **per-use-audited** egress to a customer's managed subscription or self-hosted/in-house endpoint, wiring in the reserved `[ai]` `endpoint`/`provider`/`model` keys. ADR-first. **Trigger:** a customer wants engine-brokered AI to their own instance, or we have bandwidth. |
|
|
117
118
|
|
|
118
119
|
**Top strategic calls** *(2026-06-19; updated 2026-06-28)*:
|
|
119
120
|
1. ✅ **v0.2 locked and shipped** through `0.2.10` (#28/#29 evidence published; #22b shipped). The release-close move is done.
|
|
@@ -425,6 +426,14 @@ client. "Moderate risk"; not verifiable in offscreen Qt tests, so it deserves a
|
|
|
425
426
|
**FIFO per outbound connection** (simple, safe). Per-key ordering is the leading-edge refinement to
|
|
426
427
|
revisit once FIFO is solid and a real workload needs the parallelism.
|
|
427
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
|
+
|
|
428
437
|
**What:** preserve order only *within* a partition key (e.g. MRN / encounter / sending facility)
|
|
429
438
|
while processing *across* keys in parallel — the sweet spot between strict per-connection FIFO (safe,
|
|
430
439
|
serial) and unordered parallelism (fast, unsafe). Same idiom as a broker partition key. Recent
|
|
@@ -3062,11 +3071,11 @@ parity analysis.
|
|
|
3062
3071
|
|
|
3063
3072
|
**Cluster:** Minor gaps. **Priority:** P3. **Verdict:** demand-gate.
|
|
3064
3073
|
|
|
3065
|
-
**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).)*
|
|
3066
3075
|
|
|
3067
|
-
**Trigger:** build when a partner needs paced sending
|
|
3076
|
+
**Trigger:** build when a partner needs paced sending or strict response-correlation.
|
|
3068
3077
|
|
|
3069
|
-
**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.
|
|
3070
3079
|
|
|
3071
3080
|
**Source:** promoted from [#52](#52-corepoint-capability-parity-gaps--prioritized-roadmap-input-2026-06-27) gap synthesis (adversarially reviewed, 2026-06-28).
|
|
3072
3081
|
|
|
@@ -3324,6 +3333,315 @@ deep-dive + console-medium evaluation (2026-06-29).
|
|
|
3324
3333
|
|
|
3325
3334
|
---
|
|
3326
3335
|
|
|
3336
|
+
## 93. Engine + database performance monitoring — engine-wide volume/connection KPI roll-up + a throughput-overload (saturation) alert (P2)
|
|
3337
|
+
|
|
3338
|
+
**Type:** feature — observability + alerting. A **connective** item: most of the operator-facing monitoring
|
|
3339
|
+
surface this asks for is **already tracked** (and partly shipped) under sibling items — this entry exists to name
|
|
3340
|
+
the two genuine **net-new** slivers none of them owns and to cross-link the rest, not to re-pitch built work.
|
|
3341
|
+
|
|
3342
|
+
**Already tracked / shipped (don't duplicate).** The request — "display total message volume + connection count;
|
|
3343
|
+
monitor everything that affects throughput; alert when the system is becoming overloaded" — is largely covered:
|
|
3344
|
+
- **#21 (DONE, PR #407)** — the Prometheus `/metrics` exporter (+ optional OpenTelemetry): per-connection
|
|
3345
|
+
received / delivered / errored / `queue_depth` counters + a `delivery_latency_seconds` histogram (p50/p95/p99).
|
|
3346
|
+
A scraping team gets per-connection throughput/latency and can `rate()`/`sum()` it in Grafana today.
|
|
3347
|
+
- **#56 (SHIPPED 0.2.10, ADR 0044)** — resolvable alert-state: the `alert_instance` table, `GET /alerts/active` +
|
|
3348
|
+
ack/resolve, and the real `ConnectionRow.alerts_active` count (no longer the stubbed `0`).
|
|
3349
|
+
- **#74 (do-next)** — host CPU / memory via `psutil` on the metrics surface.
|
|
3350
|
+
- **#75 (scheduled)** — the zero-install **browser ops dashboard**: live per-connection **In/Out msgs/sec** over
|
|
3351
|
+
`/ws/stats`, Queued / Errors / Last-Activity. The natural home for a live throughput view.
|
|
3352
|
+
- **#76 (demand-gate)** — historical-metrics charting + a status-colored data-flow graph.
|
|
3353
|
+
- **#81 (demand-gate)** — alert escalation tiers + day/time thresholds + content (Action-Point) alerting on top of #56.
|
|
3354
|
+
- **#64 (measure-gated)** — the throughput-*performance* roadmap (group-commit, DB durable-write IOPS as the
|
|
3355
|
+
leading driver). That item makes the engine *faster*; this item *warns* when load approaches capacity — they pair.
|
|
3356
|
+
- **#50 (P3)** — app-log disk metering + a message-stall rule. **#28/#29** — the load/throughput runs that set the baseline.
|
|
3357
|
+
|
|
3358
|
+
**Net-new gap (what no sibling owns):**
|
|
3359
|
+
1. **An engine-wide aggregate KPI headline.** Every count above is **per-connection** (#21) or a live per-connection
|
|
3360
|
+
rate (#75); nothing rolls them up into the operator's literal ask — a single **total messages through the engine**
|
|
3361
|
+
figure, a **combined inbound + outbound connection count** (with running / stopped breakdown), and an **engine-wide
|
|
3362
|
+
msg/s rate** — surfaced as first-class top-line KPIs on `/status` (or a sibling route), the console Engine Status
|
|
3363
|
+
page, and the #75 dashboard. Reuse the existing `recent_done` rate window that already powers `backlog_seconds`
|
|
3364
|
+
— don't add a second sampler. Small; mostly rides #75.
|
|
3365
|
+
2. **A throughput-overload / saturation alert.** Every shipped alert (the **#5** framework, **#56** state, **#81**
|
|
3366
|
+
escalation) keys on an **absolute** per-connection/per-resource snapshot — depth/oldest-age ceilings — so a bursty-
|
|
3367
|
+
but-draining lane and a genuinely-overloaded engine look identical until the ceiling trips. Nothing fires on the
|
|
3368
|
+
*derivative*: a **rising** `backlog_seconds`, a **growing** `in_pipeline`, or **ingest rate exceeding drain rate**
|
|
3369
|
+
over a sampling window = "the system is *becoming* overloaded." Add a new ADR 0014 alert event keyed on that
|
|
3370
|
+
comparison (new `AlertSink` event + emit site + `AlertRule` dimension + a small per-lane / engine-wide rate
|
|
3371
|
+
history), bounded by the existing `realert_seconds` throttle and routed through the same notifier/rules path. It is
|
|
3372
|
+
distinct from #81 (a policy layer *on top of* existing alerts, not a new detector) and from #64 (performance tuning,
|
|
3373
|
+
not operational alerting). ADR 0014 already declined timed multi-stage escalation; this adds a rate/saturation
|
|
3374
|
+
**dimension**, which wants that scope decision settled first.
|
|
3375
|
+
|
|
3376
|
+
**Database performance monitoring.** Surface the throughput-affecting **DB** signals — write/commit latency and
|
|
3377
|
+
connection-pool busy/wait/saturation (the pipeline is commit-bound; `[store].pool_size` exists but emits no
|
|
3378
|
+
saturation metric) and router/transform-worker lag — as **metrics first** (extend `/metrics` + `db_status()`), then
|
|
3379
|
+
optionally as overload-alert inputs. `storage_threshold` today alerts only on DB **file size** vs
|
|
3380
|
+
`[retention].max_db_mb`, not commit/pool health. **SQL-internal** DB metrics stay **DBA-delegated / demand-gated**
|
|
3381
|
+
(parity with #74's SQL-internal sub-scope and the DB-tier-HA decline).
|
|
3382
|
+
|
|
3383
|
+
**Why P2 / on-trigger.** #21 + the scheduled #74/#75 already answer the "where's the dashboard?" ask cheaply; the
|
|
3384
|
+
net-new is the small aggregate KPI roll-up (rides #75) + the overload/saturation alert, which is genuine new engine
|
|
3385
|
+
work and matters most once a real high-volume estate exists to overload. **Trigger:** a pilot/production estate
|
|
3386
|
+
approaching the commit-bound capacity ceiling that needs an *early-warning* overload signal rather than after-the-fact
|
|
3387
|
+
`queue_buildup`; calibrating the threshold wants a #28/#29/#64 capacity baseline first. Relates to **#21**, **#56**,
|
|
3388
|
+
**#64**, **#74**, **#75**, **#76**, **#81**, **#50**, **#28**/**#29**, and the **#5** AlertSink/rules framework it extends.
|
|
3389
|
+
|
|
3390
|
+
**Source:** owner request (2026-06-30) — "engine + database performance monitoring and alerting; display the total
|
|
3391
|
+
volume of messages going through the engine and the number of connections; monitor for all the things that affect
|
|
3392
|
+
throughput and alert when the system(s) are becoming overloaded." Overlap against the existing observability/alerting
|
|
3393
|
+
items (#21/#56/#64/#74/#75/#76/#81) reconciled the same day.
|
|
3394
|
+
|
|
3395
|
+
---
|
|
3396
|
+
|
|
3397
|
+
## 94. External BLOB-server offload for embedded documents — replace inline base64 with a stored-object pointer (OBX-5 RP) (P2, on-trigger)
|
|
3398
|
+
|
|
3399
|
+
**Type:** feature — storage minimization + customer-infrastructure integration. The ingest-time **offload**
|
|
3400
|
+
half of **#47** (its deferred fork (b)), but targeting the **customer's existing object/BLOB store** instead
|
|
3401
|
+
of a MessageFoundry-internal attachment table — and replacing the inline blob with an **in-message pointer**,
|
|
3402
|
+
not a private reattach token.
|
|
3403
|
+
|
|
3404
|
+
**The ask.** Large base64 embedded documents (PDF reports, CCD/C-CDA, scanned images) ride inline in **OBX-5**
|
|
3405
|
+
(ED data type) and generically via the ADR 0028 `mfb64:v1:` carriage marker
|
|
3406
|
+
([`adr/0028-base64-binary-carriage-codec.md`](adr/0028-base64-binary-carriage-codec.md)). Today they are stored
|
|
3407
|
+
verbatim in the raw message at **every** persisted stage (`ingress` → `routed` → `outbound`), bloating the store
|
|
3408
|
+
far out of proportion to message count (#47's premise). Instead of pruning them *after* a window (#47(a)) or
|
|
3409
|
+
carrying them more compactly *inside* our store (#62), **offload the blob to the customer's BLOB server at
|
|
3410
|
+
ingest, take back the storage key/URL it returns, and embed that pointer into the corresponding OBX segment** —
|
|
3411
|
+
so the bulky document never persists in our store at all.
|
|
3412
|
+
|
|
3413
|
+
**Why distinct from the siblings.**
|
|
3414
|
+
- **#47(a)** prunes the embedded doc *after* a per-connection window — the blob still bloats all three stages
|
|
3415
|
+
until the window elapses, and it stays in our store meanwhile. This eliminates it *from the start*.
|
|
3416
|
+
- **#47(b)** is the same ingest-time-offload shape but offloads to a **MessageFoundry-managed attachment store**
|
|
3417
|
+
(Mirth's `d_ma<channelId>` table + `${ATTACH:...}` token, reattached on outbound). This offloads to
|
|
3418
|
+
**infrastructure the customer already owns** and leaves a **standards-shaped pointer in the message**, not a
|
|
3419
|
+
private token.
|
|
3420
|
+
- **#62** keeps the bytes in our store, just as `VARBINARY`/`BLOB`/`bytea` instead of base64-in-text. Here the
|
|
3421
|
+
bytes **leave** our store entirely.
|
|
3422
|
+
|
|
3423
|
+
**Design forks (for the ADR):**
|
|
3424
|
+
- **Pointer representation.** Replace the OBX-5 **ED** embed with the HL7 **RP (reference pointer)** data type — a
|
|
3425
|
+
`<pointer>^<application ID>^<type of data>^<subtype>` reference downstream systems understand natively — versus
|
|
3426
|
+
an opaque MessageFoundry token (#47(b)-style) that we must reattach before delivery. RP is interoperable but
|
|
3427
|
+
assumes the partner can dereference the BLOB; a token keeps the message self-contained but makes us re-fetch +
|
|
3428
|
+
re-embed on outbound. For the generic `mfb64:v1:` carriage, a sibling `mfref:`-style pointer marker. **Never
|
|
3429
|
+
string-slice raw HL7** (CLAUDE.md §8) — rewrite via the parsed model/codec and re-encode.
|
|
3430
|
+
- **Credential-bearing pointers — embed a reference, not a capability.** The message must carry a pointer a
|
|
3431
|
+
consumer can resolve, but a BLOB store often hands back (or we would mint) a **presigned URL / SAS token with the
|
|
3432
|
+
access grant baked into the string**. That must **not** be what we persist: a presigned URL in OBX-5 is a bearer
|
|
3433
|
+
credential to PHI living in a persisted-and-forwarded artifact (store, outbox, the partner's inbox, our logs), it
|
|
3434
|
+
**expires** — colliding with at-least-once **replay**, queued **retries**, **dead-letter**, and **retention** (a
|
|
3435
|
+
message re-sent past the TTL carries a dead pointer) — and it can't be revoked independently of the document.
|
|
3436
|
+
Separate the two capabilities: the **upload** grant (the presigned PUT, or MessageFoundry's own write creds) is
|
|
3437
|
+
used **once and discarded**; what we **embed** is a **stable, opaque, non-capability reference** — ideally a
|
|
3438
|
+
content-addressed object key plus the store identity (the HL7 **RP** components map cleanly: *Application ID* =
|
|
3439
|
+
which BLOB store, *Pointer* = the opaque key), with the consumer authenticating to the store with its **own**
|
|
3440
|
+
credentials (it owns the store — the premise of this feature). If a partner genuinely needs a no-auth
|
|
3441
|
+
dereferenceable URL, **mint a short-lived presigned URL late, at delivery** (the reattach-on-outbound fork below),
|
|
3442
|
+
never at ingest and never persisted — so the capability exists only transiently on the wire within a bounded TTL.
|
|
3443
|
+
Clean default: MessageFoundry writes with its own creds, embeds the opaque key, readers use theirs, and no
|
|
3444
|
+
credential URL ever touches the store or the logs.
|
|
3445
|
+
- **Reattach-on-outbound or not.** If the receiving partner reads the BLOB itself, the pointer *is* the
|
|
3446
|
+
deliverable. If it needs the actual document, MessageFoundry must **re-fetch from the BLOB and re-embed** on the
|
|
3447
|
+
outbound — or **mint a fresh short-lived pointer** at send time (above) — a new read side-effect + egress
|
|
3448
|
+
dependency on delivery. Per-outbound choice.
|
|
3449
|
+
- **Where the offload runs vs the reliability invariant.** This is a **write side-effect**, which collides with
|
|
3450
|
+
the "routers/transforms must be pure, every stage is at-least-once / re-runnable" invariant (CLAUDE.md §2). A
|
|
3451
|
+
stage re-run must not double-store or orphan blobs — favor **content-addressed keys** (hash of the bytes) so a
|
|
3452
|
+
PUT is idempotent. And it adds an **external dependency** to the path: if the offload sits *before* the ACK
|
|
3453
|
+
(alongside ingress persistence), a BLOB-server outage blocks intake/ACK; if it sits as its own pipeline stage
|
|
3454
|
+
*after* the ACK, intake survives but a failed offload dead-letters post-ACK (no NAK) — the ADR must pick.
|
|
3455
|
+
|
|
3456
|
+
**Scope (when built):**
|
|
3457
|
+
- A **pluggable BLOB connector** registered like the destination transports (`transports/`, registry — never
|
|
3458
|
+
special-cased in `pipeline/`): S3 / Azure Blob / GCS / on-prem object store / plain HTTP PUT, selected +
|
|
3459
|
+
configured per connection. Gated by `[egress].allowed_*` allow-lists; credentials via `env()` / `MEFOR_*` (the
|
|
3460
|
+
connector-credential SecretProvider-seam candidate). Off the event loop.
|
|
3461
|
+
- A **per-connection offload setting** (size threshold + target BLOB connection), layered over a global default —
|
|
3462
|
+
the same **global-default + per-connection-override** model as FIFO / `RetryPolicy` / #34 / #47, authored on the
|
|
3463
|
+
inbound `ConnectionSpec` and/or `connections.toml` (ADR 0007) so it stays hand-/GUI-editable.
|
|
3464
|
+
- Target **both** carriage forms (HL7 OBX-5 ED and the generic `mfb64:v1:` marker) across **all three** backends
|
|
3465
|
+
(SQLite / Postgres / SQL Server). Preserve every invariant — never delete the row, message stays parseable after
|
|
3466
|
+
the rewrite, **one audit entry per offload** (key + size + content-type + connection, no content). Offload is
|
|
3467
|
+
irreversible from our side once the inline bytes are dropped — surface a distinct flag so an operator viewing the
|
|
3468
|
+
message knows the document was externalized vs never present, and audit any later **retrieval**.
|
|
3469
|
+
|
|
3470
|
+
**PHI note + scope boundary.** Offloading *shrinks our* at-rest PHI footprint (a data-minimization win) — the
|
|
3471
|
+
bulky document leaves our store for the customer's BLOB. **The security of that BLOB server is explicitly out of
|
|
3472
|
+
scope:** PHI handling, **encryption-at-rest**, and access control on the customer's store are the **customer's**
|
|
3473
|
+
responsibility — the same trust posture we already take toward a customer database in `db_lookup`
|
|
3474
|
+
([ADR 0010](adr/0010-handler-callable-db-lookup.md)). MessageFoundry treats the BLOB server as trusted customer-owned
|
|
3475
|
+
infrastructure and does **not** encrypt the offloaded objects or enforce remote-store PHI controls itself. What
|
|
3476
|
+
stays **in** scope (our responsibility): **never log a presigned/SAS URL or an identifier-bearing object key**
|
|
3477
|
+
(§9) — the former is a bearer credential to PHI, the latter is PHI itself; an opaque, auth-gated reference is safe
|
|
3478
|
+
to log. And **audit each retrieval** as a PHI access. (Logging is still stdlib with no structlog redaction yet, so
|
|
3479
|
+
this is a deliberate connector-level "log the object key/length, never the signed URL" discipline, not an
|
|
3480
|
+
automatic scrub.) The customer's BAA must cover the BLOB store; restate this boundary in [`PHI.md`](PHI.md) when
|
|
3481
|
+
built.
|
|
3482
|
+
|
|
3483
|
+
**Why P2 / on-trigger.** This is the strongest store-bloat lever for heavy document feeds (radiology PDFs, CCDs)
|
|
3484
|
+
and the cleanest fit for a customer who **already runs** object/BLOB infrastructure and wants their documents
|
|
3485
|
+
living there. But it is a side-effecting pipeline change touching the purity / at-least-once invariant **plus** a
|
|
3486
|
+
new connector family — it wants its own ADR (the forks above) before code, and is not an open exposure on the
|
|
3487
|
+
shipping config. **Trigger:** an adopter with an existing BLOB/object store and a document-heavy feed who wants the
|
|
3488
|
+
documents offloaded out of our store. Relates to **#47** (the in-store prune/offload sibling — shared
|
|
3489
|
+
per-connection plumbing; this realizes its deferred fork (b) against external storage), **#62** (in-store binary
|
|
3490
|
+
carriage), **#34** (per-connection retention), **ADR 0028** (base64 carriage), **ADR 0007** (`connections.toml`),
|
|
3491
|
+
and the connector-credential **SecretProvider** seam.
|
|
3492
|
+
|
|
3493
|
+
**Source:** owner request (2026-06-30) — "integrate with the customer's existing BLOB servers to offload base64
|
|
3494
|
+
documents; eliminate the base64 documents from our data store — instead get a pointer back from the BLOB and embed
|
|
3495
|
+
that into the corresponding OBX segment." Reconciled against the in-store siblings #47 / #62 the same day.
|
|
3496
|
+
|
|
3497
|
+
---
|
|
3498
|
+
|
|
3499
|
+
## 95. Engine-brokered AI assistance — integrate the IDE coding assistant with a customer's managed AI subscription or in-house LLM instance (P3, on-trigger)
|
|
3500
|
+
|
|
3501
|
+
**Type:** feature — AI governance + customer-infrastructure integration. Turns the **reserved-but-unused**
|
|
3502
|
+
`[ai]` broker config keys into a real integration: let the **engine broker** the IDE assistant's model calls to a
|
|
3503
|
+
provider the *customer already runs* — their own cloud AI subscription (Azure OpenAI, Anthropic/Bedrock, an internal
|
|
3504
|
+
Copilot-compatible gateway) or a **self-hosted / on-prem LLM endpoint** (vLLM, Ollama, an internal inference service)
|
|
3505
|
+
— under central, **per-use-auditable** egress control. The policy model, config schema, RBAC, and policy endpoint
|
|
3506
|
+
**already exist** ([`AI.md`](AI.md)); this builds the broker they were designed for.
|
|
3507
|
+
|
|
3508
|
+
**Already there (don't duplicate).** A customer's existing AI **subscription** is *already* the integration point
|
|
3509
|
+
today, via **BYO** ([`../ide/src/chat.ts`](../ide/src/chat.ts)): the assistant is provider-agnostic and uses whatever
|
|
3510
|
+
model the developer picked in VS Code's Chat view (Copilot / Copilot Enterprise under the org BAA, Claude, etc.)
|
|
3511
|
+
through the `vscode.lm` Language Model API — and **any in-house instance that registers as a VS Code language-model
|
|
3512
|
+
provider** (a Copilot-compatible internal proxy or a custom chat-model extension) is picked up the same way,
|
|
3513
|
+
engine-blind. The governance around it is built too — the `[ai]` policy (`mode` × `data_scope`,
|
|
3514
|
+
production-posture-clamped), the `ai:assist` RBAC permission, `GET /ai/policy` + the `messagefoundry ai-policy` CLI,
|
|
3515
|
+
and the central-*off* switch honored on every workstation. What is **not** built is the **engine-brokered** path:
|
|
3516
|
+
`managed_claude` / `managed_claude_baa` are accepted as policy values but the IDE deliberately refuses to service them
|
|
3517
|
+
(it will **not** silently fall back to BYO), and the `provider` / `model` / `baa_attested` / `endpoint` config keys
|
|
3518
|
+
are **accepted but unused** — placeholders the broker was meant to consume.
|
|
3519
|
+
|
|
3520
|
+
**Net-new gap (what no sibling owns):**
|
|
3521
|
+
1. **The engine-side broker.** AI.md's *Future direction* (P1/P2) puts model egress behind the **engine** — not the
|
|
3522
|
+
dev's IDE — so a central operator controls and **per-use audits** every call, and `phi` scope becomes reachable
|
|
3523
|
+
only under `managed_claude_baa` over a **BAA + zero-data-retention** connection. None of this exists: it needs a
|
|
3524
|
+
new engine API surface (the engine proxies the chat request), the IDE client switching from `vscode.lm` to the
|
|
3525
|
+
engine for managed modes, and per-use egress auditing (today even policy *reads* aren't audited — that arrives
|
|
3526
|
+
*with* the broker).
|
|
3527
|
+
2. **A generic customer-endpoint mode, beyond Anthropic-managed Claude.** The only future modes named today
|
|
3528
|
+
(`managed_claude` / `managed_claude_baa`) are framed around an **Anthropic-managed** Claude. A customer's **own
|
|
3529
|
+
subscription** (their Azure OpenAI / Bedrock keys, their internal gateway) or a **self-hosted endpoint** is a
|
|
3530
|
+
*different* shape: the customer supplies `endpoint` + `provider` + `model` + credentials and MEFOR just brokers to
|
|
3531
|
+
it. That wants either a new `managed_endpoint` (engine-brokered, customer-keyed) mode or an explicit
|
|
3532
|
+
generalization of `managed_claude`, finally wiring in the reserved `endpoint` / `provider` / `model` keys.
|
|
3533
|
+
|
|
3534
|
+
**Design forks (for the ADR):**
|
|
3535
|
+
- **Why broker at all when BYO already works?** BYO's limit is that it is **dev-machine-local and engine-blind** —
|
|
3536
|
+
ops can centrally turn it *off* and cap scope, but cannot *see* or *audit* individual calls, and the model is
|
|
3537
|
+
whatever the dev configured in VS Code. The broker buys central egress control, per-use audit, and a single
|
|
3538
|
+
operator-pinned `endpoint` / `model` — at the cost of routing AI traffic through the engine. Some customers want
|
|
3539
|
+
exactly the opposite (keep AI entirely off the engine), so this is **additive, never a replacement** for BYO.
|
|
3540
|
+
- **`managed_endpoint` vs generalize `managed_claude`.** A new mode keeps the existing Claude modes clean;
|
|
3541
|
+
generalizing avoids mode-proliferation. Either way the IDE's current "managed → disabled" branch flips to
|
|
3542
|
+
"managed → call the engine broker."
|
|
3543
|
+
- **Credentials + egress.** Customer keys / endpoint via `env()` / `MEFOR_*` (the connector-credential
|
|
3544
|
+
**SecretProvider** seam), gated by an `[egress].allowed_http` allow-list like `fhir_lookup` / SMART; the broker
|
|
3545
|
+
call runs **off the event loop**. A self-hosted endpoint (vLLM / Ollama) often needs no BAA (on-prem) — but the
|
|
3546
|
+
**`data_scope` ceiling still applies**: `phi` stays reachable *only* under the BAA + ZDR attestation, never merely
|
|
3547
|
+
because the endpoint is on-prem.
|
|
3548
|
+
- **PHI boundary unchanged for the MVP scopes.** Until de-id wiring into the AI scope path and the broker land
|
|
3549
|
+
together, the assistant still attaches **`code_only`** context regardless of mode — the broker changes *who makes
|
|
3550
|
+
the call and how it's audited*, not *what data* may be sent without a posture change.
|
|
3551
|
+
|
|
3552
|
+
**Why P3 / on-trigger.** BYO already covers "use our existing AI subscription" for the common case
|
|
3553
|
+
(Copilot-under-BAA, or an in-house model surfaced through VS Code) with **zero** engine work — so this is genuine new
|
|
3554
|
+
engine + IDE + audit surface that earns its cost only when a customer specifically wants **engine-centralized,
|
|
3555
|
+
audited** AI egress to **their** managed / self-hosted endpoint (e.g. a security team that mandates all AI traffic
|
|
3556
|
+
flow through one audited choke point, or an estate whose only LLM is an internal one not exposed to VS Code).
|
|
3557
|
+
**Trigger:** a customer asks for engine-brokered AI to their own subscription / in-house instance, **or** we have the
|
|
3558
|
+
bandwidth to build out the documented P1/P2 broker. ADR-first (the forks above). Relates to [`AI.md`](AI.md) (the
|
|
3559
|
+
policy model + reserved keys this realizes), [`PHI.md`](PHI.md) §9 (de-id, the gate to scopes above `code_only`), the
|
|
3560
|
+
**SMART** / `fhir_lookup` egress-allow-list + off-loop precedent ([ADR 0024](adr/0024-smart-backend-services-token-provider.md) /
|
|
3561
|
+
[ADR 0043](adr/0043-fhir-read-lookup.md)), and the connector-credential **SecretProvider** seam.
|
|
3562
|
+
|
|
3563
|
+
**Source:** owner request (2026-06-30) — add the engine-brokered "integrate the IDE coding assistant with a
|
|
3564
|
+
customer's existing AI subscriptions or in-house instances" capability as a demand-/bandwidth-gated item; build when
|
|
3565
|
+
a customer wants it or when we have bandwidth. The already-shipped BYO coverage + the reserved broker config keys were
|
|
3566
|
+
reconciled the same day.
|
|
3567
|
+
|
|
3568
|
+
---
|
|
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
|
+
|
|
3327
3645
|
*Everything else from the 2026-06-10 full-codebase review (1 critical, 13 high, 33 medium, 31 low —
|
|
3328
3646
|
78 findings) has been remediated; see the review report's §6 action order. The two items it still
|
|
3329
3647
|
sourced — **#1 (SQL Server concurrency)** and **#2 (console off-thread)** — are now both **DONE**
|