messagefoundry 0.2.9__tar.gz → 0.2.10__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.9 → messagefoundry-0.2.10}/.github/workflows/ci.yml +4 -2
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/CHANGELOG.md +61 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/CLAUDE.md +20 -6
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/PKG-INFO +7 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/BACKLOG.md +160 -76
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/CONFIGURATION.md +14 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/CONNECTIONS.md +44 -0
- messagefoundry-0.2.10/docs/adr/0023-inbound-http-listener.md +326 -0
- messagefoundry-0.2.10/docs/adr/0029-email-smtp-destination.md +267 -0
- messagefoundry-0.2.10/docs/adr/0043-fhir-read-lookup.md +303 -0
- messagefoundry-0.2.10/docs/adr/0044-operator-alert-state.md +262 -0
- messagefoundry-0.2.10/docs/adr/0045-custom-rbac-roles.md +266 -0
- messagefoundry-0.2.10/docs/adr/0046-message-content-search.md +251 -0
- messagefoundry-0.2.10/docs/adr/0048-third-tier-disaster-recovery-standby.md +216 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/README.md +7 -2
- messagefoundry-0.2.10/docs/releases/MULTISESSION-PLAN-5.md +453 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/__init__.py +24 -2
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/__main__.py +70 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/api/app.py +276 -3
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/api/auth_models.py +19 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/api/auth_routes.py +108 -7
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/api/models.py +58 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/identity.py +10 -2
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/permissions.py +86 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/service.py +155 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/connections_file.py +2 -0
- messagefoundry-0.2.10/messagefoundry/config/fhir_lookup.py +132 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/models.py +10 -2
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/settings.py +46 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/wiring.py +212 -5
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/alerts_page.py +146 -19
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/client.py +85 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/shell.py +91 -7
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/widgets.py +67 -17
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/__init__.py +42 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/message.py +62 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/__init__.py +18 -2
- messagefoundry-0.2.10/messagefoundry/parsing/x12/_deps.py +43 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/errors.py +12 -1
- messagefoundry-0.2.10/messagefoundry/parsing/x12/validate.py +217 -0
- messagefoundry-0.2.10/messagefoundry/parsing/xml/__init__.py +50 -0
- messagefoundry-0.2.10/messagefoundry/parsing/xml/_deps.py +62 -0
- messagefoundry-0.2.10/messagefoundry/parsing/xml/errors.py +52 -0
- messagefoundry-0.2.10/messagefoundry/parsing/xml/harden.py +73 -0
- messagefoundry-0.2.10/messagefoundry/parsing/xml/message.py +154 -0
- messagefoundry-0.2.10/messagefoundry/parsing/xml/schema.py +69 -0
- messagefoundry-0.2.10/messagefoundry/parsing/xml/signature.py +68 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/alert_sinks.py +109 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/alerts.py +29 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/engine.py +31 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/retention.py +20 -0
- messagefoundry-0.2.10/messagefoundry/pipeline/update_check.py +225 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/wiring_runner.py +279 -20
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/store/base.py +118 -1
- messagefoundry-0.2.10/messagefoundry/store/content_search.py +131 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/store/postgres.py +253 -3
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/store/sqlserver.py +276 -6
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/store/store.py +342 -5
- messagefoundry-0.2.10/messagefoundry/support/__init__.py +21 -0
- messagefoundry-0.2.10/messagefoundry/support/bundle.py +231 -0
- messagefoundry-0.2.10/messagefoundry/support/redact.py +75 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/timezone.py +153 -2
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/__init__.py +2 -0
- messagefoundry-0.2.10/messagefoundry/transports/email.py +196 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/fhir.py +240 -1
- messagefoundry-0.2.10/messagefoundry/transports/http_listener.py +473 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/smart.py +33 -13
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/pyproject.toml +14 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/requirements.lock +62 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/security/crypto_inventory_check.py +7 -0
- messagefoundry-0.2.10/tests/test_alert_state.py +459 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_api.py +31 -0
- messagefoundry-0.2.10/tests/test_api_alerts.py +247 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_connection_event_outbound.py +2 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_alerts.py +121 -8
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_status.py +1 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_widgets.py +58 -1
- messagefoundry-0.2.10/tests/test_content_search.py +378 -0
- messagefoundry-0.2.10/tests/test_custom_roles.py +417 -0
- messagefoundry-0.2.10/tests/test_email_destination.py +313 -0
- messagefoundry-0.2.10/tests/test_fhir_lookup.py +423 -0
- messagefoundry-0.2.10/tests/test_inbound_http_source.py +424 -0
- messagefoundry-0.2.10/tests/test_message_timestamps.py +79 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_postgres_store.py +46 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_sqlserver_store.py +42 -0
- messagefoundry-0.2.10/tests/test_support_bundle.py +169 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_timezone.py +139 -1
- messagefoundry-0.2.10/tests/test_update_check.py +199 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_wiring_engine.py +2 -0
- messagefoundry-0.2.10/tests/test_x12_validate.py +110 -0
- messagefoundry-0.2.10/tests/test_xml_message.py +169 -0
- messagefoundry-0.2.10/tests/test_xml_schema_signature.py +63 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/uv.lock +104 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.claude/settings.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.dockerignore +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.gitattributes +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/CODEOWNERS +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/SECURITY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/dependabot.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/workflows/benchmark.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/workflows/cla.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/workflows/codeql.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/workflows/dependabot-auto-merge.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/workflows/dependabot-lock-resync.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/workflows/freethread-smoke.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/workflows/release-sync-check.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/workflows/release.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/workflows/scorecard.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/workflows/security.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/workflows/vuln-metrics.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.github/zizmor.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.gitignore +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.gitleaks.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.mefor-hooks/pre-commit +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.pre-commit-config.yaml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/.semgrep/messagefoundry.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/CLA.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/CODE_OF_CONDUCT.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/COMMERCIAL-LICENSE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/CONTRIBUTING.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/GOVERNANCE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/LICENSE +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/MAINTAINERS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/NOTICE +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docker/Dockerfile +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docker/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docker/compose.yaml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docker/k8s/secret.example.yaml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docker/k8s/statefulset.yaml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docker/locks/requirements-core.lock +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docker/locks/requirements-sqlserver.lock +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docker/secrets.env.example +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docker/smoke/Dockerfile +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docker/smoke/config/IB_Test_ADT.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docker/smoke/send_adt.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/ADOPTER-CI.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/AI.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/ARCHITECTURE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/CI-QUALITY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/CLUSTERING.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/CODESETS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/CONTAINER-EXPOSURE-EVALUATION.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/DEPLOY-SERVER-DB.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/DEPLOYMENT.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/DICOM.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/DUAL_LICENSING_PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/FEATURE-MAP.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/HL7-VALIDATION.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/INSTALL-GUIDE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/LOAD-TESTING.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/MENTAL-MODEL.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/MessageFoundry-Mental-Model.docx +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/PHI.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/REMOTE-CONSOLE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/SECURITY-REMEDIATION-LEDGER.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/SECURITY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/SERVICE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/SUPPORT-POLICY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/SYSTEM-REQUIREMENTS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/Secure_AI_Development_Standards.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/Secure_Development_Standards.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/TEE-RELAY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/THROUGHPUT-IMPROVEMENTS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/USER-GUIDE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/WORKTREES.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0001-staged-pipeline-architecture.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0005-transform-accessible-state.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0006-external-data-lookups.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0008-cluster-observability-api.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0009-run-scoped-context-providers.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0011-timer-scheduled-source.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0012-x12-edi-codec.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0013-increment-2-reingress-design.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0013-query-response-orchestration.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0014-alerting-rules-engine.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0017-consumer-deployment-model.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0026-off-box-egress-update-check.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0027-per-connection-retention.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0032-console-desktop-launch.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0033-gui-manageable-code-sets.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0034-static-analysis-triage-policy-accepted-risk-register.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0035-ide-extension-workspace-trust-and-scope.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0036-windows-config-source-trust.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0037-multi-process-sharding-l3.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0038-internal-pass-through-connector.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0039-database-tier-sharding-l5.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0040-free-threaded-engine-support.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0041-load-path-attestation-and-change-attribution.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/0042-embedded-document-pruning.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/adr/TEMPLATE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/architecture-components.png +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/architecture-components.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/architecture-config-graph.png +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/architecture-config-graph.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/architecture-diagram.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/architecture-message-flow.png +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/architecture-message-flow.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/architecture-topology.png +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/architecture-topology.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/benchmarks/TUNING-BASELINE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/benchmarks/step-b-write-amplification.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/design/dbshard.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/design/freethread.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/design/multiproc.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/hl7-message-ordering-reference.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/message-ordering-design.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/MULTISESSION-PLAN-4.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/v0.1-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/research/cloud-deployment-research-2026-06.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/research/config-ux-review.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/research/non-hl7-transform-components.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/ADVISORY-PROCESS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/ASVS-L3-STATUS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/DEPENDENCY-METRICS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/PHASE-8C-RBAC.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/PUBLISHING.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/RCA-TEMPLATE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/RELEASE-GATE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/REVIEW-2026-06-07.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/SECURITY-POSTURE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/security/THREAT-MODEL.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/testing/VERIFY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/environments/dev.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/environments/prod.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/__main__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/acceptance/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/acceptance/__main__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/acceptance/matrix.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/acceptance/probes.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/acceptance/report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/acceptance/runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/compose.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/config/coverage.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/config/load/_shape.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/config/load/graph.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/config/passthrough/graph.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/config/store_once/graph.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/file_panel.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/file_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/corpus.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/correlator.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/enginepoll.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/failover.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/failover_track.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/governor.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/ids.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/metrics.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profile.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/adt-fanout-stress.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/closed-loop.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/failover.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/fanout-baseline.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/malformed-load.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/reference.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/smoke-sqlserver.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/smoke.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/soak.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/spike-burst.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/sustained-overload.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/profiles/writeamp.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/sender.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/load/sink.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/mllp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/monitor.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/receive.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/reconcile/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/reconcile/__main__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/reconcile/capture.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/reconcile/compare.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/reconcile/normalize.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/reconcile/report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/scenarios.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/send.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/harness/window.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/.gitignore +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/.vscodeignore +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/esbuild.js +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/media/hl7schema.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/media/icon-amber.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/media/icon.png +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/media/icon.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/package-lock.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/package.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/snippets/messagefoundry.code-snippets +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/aiPolicy.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/alertEditor.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/auth.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/chat.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/cli.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/codeSetEditor.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/codesetsTree.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/completion.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/connectionEditor.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/editorToolbar.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/engineClient.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/engineTarget.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/extension.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/generate.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/git.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/graphTree.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/home.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/insertElement.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/newRoute.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/promote.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/promoteTarget.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/sourceControl.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/test/runTest.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/test/suite/ai-policy.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/test/suite/chat.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/test/suite/editor-toolbar.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/test/suite/engine-target.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/test/suite/extension.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/test/suite/index.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/test/suite/insert-element.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/test/suite/promote-target.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/test/suite/pythonpath.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/test/suite/settings-scope.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/testBench.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/src/validate.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/tsconfig.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/ide/tsconfig.test.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/mefor.code-workspace +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/adr_analyze.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/anon/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/anon/_pools.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/anon/hl7.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/anon/keying.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/anon/leak.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/anon/rules.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/anon/surrogates.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/api/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/api/approvals.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/api/field_authz.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/api/metrics.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/api/security.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/api/tls.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/data/common_passwords.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/ldap.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/notifications.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/passwords.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/policy.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/ratelimit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/tokens.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/auth/totp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/checks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/active_environment.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/ai_policy.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/alerts_edit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/code_sets.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/codeset_edit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/connections_edit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/db_lookup.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/environments.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/fingerprint.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/ingest_time.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/reference.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/response.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/run_context.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/state.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/config/tls_policy.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/__main__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/_async.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/change_password.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/connections.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/dead_letters_page.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/delegates.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/event_log_page.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/icons/alerts.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/icons/connections.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/icons/dead-letters.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/icons/engine-status.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/icons/log-search.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/icons/logo-lockup.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/icons/users.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/login.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/mfa.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/reauth.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/resources/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/resources/app.ico +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/resources/app.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/search.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/service_control.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/sessions.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/shards.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/status.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/theme.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/console/users_page.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/_core.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/_hl7data.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/adt.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/all_types.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/bar.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/dft.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/documents.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/mdm.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/mfn.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/oml.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/orl.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/orm.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/oru.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/ras.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/rde.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/siu.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/generators/vxu.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/hl7schema.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/integrity.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/last_resort.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/logging_setup.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/binary.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/consistency.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/_deps.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/_util.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/dataset.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/errors.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/peek.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/_deps.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/errors.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/peek.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/resource.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/groups.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/peek.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/split.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/summary.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/tree.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/validate.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/delimiters.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/interchange.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/message.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/peek.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/cert_expiry.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/cluster.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/config_convergence.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/dryrun.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/leader_tasks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/reference_sync.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/security_notify.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/sharding.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/state_convergence.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/pipeline/supervisor.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/py.typed +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/redaction.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/scaffold.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/secrets_dpapi.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/store/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/store/audit_tee.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/store/crypto.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/store/document_strip.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/store/keyprovider.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/base.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/database.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/dicom.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/dicomweb.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/file.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/framing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/loopback.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/mllp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/passthrough.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/remotefile.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/rest.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/signing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/soap.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/tcp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/timer.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/transports/x12.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/verify/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/verify/checks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/verify/model.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/verify/report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/verify/runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/messagefoundry/verify/smoke.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/packaging/messagefoundry-harness/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/packaging/messagefoundry-harness/pyproject.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/config/IB_ACME_ADT.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/config/IB_FHIR_INTAKE.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/config/IB_PARTNER_X12.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/config/IB_RADIOLOGY_SR.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/config/adt.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/config/codesets/event_labels.csv +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/config/codesets/facility_mnemonics.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/config/connections.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/consistency/validated_adt.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/dicom/generate_sr_sample.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/adt_a01.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/adt_batch.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/messages/x12_270_eligibility.edi +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/results_relay/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/results_relay/codesets/test_codes.csv +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/results_relay/messages/oru_results.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/results_relay/results_relay.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/samples/send_mllp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/console/install-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/console/pack_ico.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/dev/postgres.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/dev/sqlserver-docker.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/dev/sqlserver.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/publish/check_release_sync.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/publish/publish-denylist.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/publish/publish.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/publish/scan_forbidden.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/security/vuln_metrics.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/service/import-db-ca.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/service/install-service.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/service/uninstall-service.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/trace_icon.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/worktree/new.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/worktree/remove.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/worktree/session-context.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/scripts/worktree/spawn.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/__main__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/anon/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/anon/_hl7data.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/anon/_pools.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/anon/hl7.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/anon/keying.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/anon/leak.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/anon/rules.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/anon/surrogates.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/compare.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/correlate.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/hl7_fields.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/mefor_api.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/mllp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/relay.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tee/store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/_dicom_sample.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/_failover_load_support.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/_fhir_fixtures.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/conftest.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_acceptance_framework.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_ack_capture_runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_ack_sent_store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_active_environment.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_ad_group_scope.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_admin_new_ip.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_adr_analyze.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_ai_policy.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_alert_rules.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_alert_sinks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_alerts_edit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_alerts_rules_api.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_anon_core.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_anon_integration.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_anon_parity.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_api_auth.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_api_reload.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_api_tls.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_approvals.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_asvs_phase0.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_audit_integrity.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_audit_offbox_tee.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_auth_core.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_auth_entry_hardening.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_auth_hardening.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_auth_service.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_auth_session_lifecycle.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_auth_store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_binary_carriage.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_bootstrap_admin_perms.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_cert_expiry.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_channel_rbac.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_checks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_checks_lint.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_cli.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_cluster.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_cluster_failover_postgres.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_cluster_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_cluster_graph_gating.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_cluster_lease.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_code_sets.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_codeset_edit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_config_fingerprint.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_config_source_trust.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_connection_api.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_connection_event_api.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_connection_event_emit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_connection_event_scope.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_connection_event_store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_connection_resilience.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_connections_cli.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_connections_file.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_consistency.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_auth.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_client.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_dead_letters.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_event_log.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_hardening.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_icon.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_password.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_sessions.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_shards.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_step_up.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_theme.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_console_users.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_database_connector_integration.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_database_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_db_lookup.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_db_lookup_live_runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_delivery_settings.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_dependabot_automerge_guardrails.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_dependency_boundaries.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_dicom_codec.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_dicom_scp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_dicom_scp_security.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_dicom_scu.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_dicom_wiring.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_dicomweb.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_docs_runbooks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_dryrun.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_dual_control_reload.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_ed_documents.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_ed_documents_e2e.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_egress_allowlist.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_embedded_document_pruning.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_enginepoll_aggregate.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_environments.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_fhir_parsing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_fhir_resource.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_fhir_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_field_authz.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_field_authz_metadata.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_fifo_ordering.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_generate_cli.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_generated_adt.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_generators_core.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_generators_types.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_groups.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_harness.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_harness_compose.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_harness_config.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_harness_faults.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_harness_file.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_harness_monitor.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_harness_scenarios.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_hl7_core_features.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_hl7schema.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_inbound_bind.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_ingest_time.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_keyprovider.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_last_admin_guard.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_last_resort.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_leader_tasks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_listener_tls_exposure.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_load_config.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_load_corpus.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_load_failover_postgres.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_load_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_load_failover_unit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_load_metrics.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_load_profile.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_load_report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_load_runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_load_sender.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_load_sink.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_logging.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_message.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_message_split.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_metrics_exporter.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_mfa.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_mllp_encoding_override.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_mllp_tls.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_nonhl7_ingress_size_cap.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_operability_config.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_outbound_signing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_outbound_simulate.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_packaging.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_parse_tree.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_parsing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_passthrough.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_passthrough_graph.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_payload_agnostic_ingress.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_per_connection_retention.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_reconcile_capture.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_reconcile_compare.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_reconcile_harness.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_redaction.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_reference_sets.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_reingress.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_remotefile_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_response_capture.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_rest_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_retention.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_run_context.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_scaffold.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_scaffold_requirements.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_scan_forbidden.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_secrets_dpapi.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_security_notify.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_security_static.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_service_control.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_settings.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_sharding.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_sibling_helper_finder.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_smart_backend.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_soap_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_soap_wssecurity.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_sqlserver_coordinator.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_sqlserver_cursor_close.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_sqlserver_schema_init.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_staged_pipeline.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_startup_attestation.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_startup_fault_isolation.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_stats_reset.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_step_up.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_store_backend.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_store_encryption.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_store_file_hardening.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_store_once_deliver_many.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_store_once_graph.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_store_read_pool.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_store_ssl.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_summary.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_supervisor.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_task_resilience.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_tcp_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_tee_cli.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_tee_compare.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_tee_correlate.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_tee_hl7_fields.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_tee_mefor_api.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_tee_mllp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_tee_relay.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_tee_report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_tee_store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_timer_source.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_tls_policy.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_totp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_totp_window.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_transform_offloop.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_transform_state.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_transports.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_verify.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_version.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_win2025_acceptance.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_wiring.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_wiring_reload.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_wiring_serve.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_ws_stats_revalidation.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_x12_parsing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_x12_rte.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_x12_source_ip_allowlist.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.10}/tests/test_x12_transport.py +0 -0
|
@@ -58,7 +58,7 @@ jobs:
|
|
|
58
58
|
sudo apt-get update
|
|
59
59
|
sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libdbus-1-3
|
|
60
60
|
|
|
61
|
-
- name: Install project (dev + console + fhir + dicom extras)
|
|
61
|
+
- name: Install project (dev + console + fhir + dicom + x12 + xml extras)
|
|
62
62
|
run: |
|
|
63
63
|
python -m pip install --upgrade pip
|
|
64
64
|
# [fhir] so the FHIR typed-tier tests (incl. the PHI-no-leak invariant, ADR 0022) actually
|
|
@@ -66,7 +66,9 @@ jobs:
|
|
|
66
66
|
# [dicom] (pydicom + pynetdicom; ADR 0025) does the same for the DICOM codec + C-STORE SCP
|
|
67
67
|
# tests, and lets mypy type-check transports/dicom.py + parsing/dicom/ against the real
|
|
68
68
|
# (py.typed) libraries rather than treating them as Any.
|
|
69
|
-
|
|
69
|
+
# [x12] (pyx12) + [xml] (lxml/xmlschema/signxml) likewise so the strict X12 validation (#32)
|
|
70
|
+
# and the hardened XML/SOAP codec (#31) tests run their assertions instead of importorskip-skipping.
|
|
71
|
+
pip install -e ".[dev,console,fhir,dicom,x12,xml]"
|
|
70
72
|
|
|
71
73
|
- name: Lint (ruff)
|
|
72
74
|
run: ruff check messagefoundry tests
|
|
@@ -6,6 +6,64 @@ All notable changes to MessageFoundry are documented here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.2.10] — 2026-06-27 — Early Access
|
|
10
|
+
|
|
11
|
+
The **Plan-5 "v0.3 candidate" wave** — completing the deferred connector/codec set and the Corepoint
|
|
12
|
+
parity gaps, built across two multisession waves (L1–L9) and adversarially reviewed. All on-prem,
|
|
13
|
+
code-first, no behavior change to existing graphs.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- **Inbound HTTP / REST listener** (#7, [ADR 0023](docs/adr/0023-inbound-http-listener.md)) — a
|
|
17
|
+
connector-owned bound `asyncio` HTTP/1.1 socket **source** in `transports/` (not `api/`), feeding the
|
|
18
|
+
payload-agnostic ingress (ADR 0004) as a `RawMessage`. ACK-on-receipt (respond-with-receipt **after** the
|
|
19
|
+
raw is durably committed), with oversize/malformed/slow-loris hardening surfaced as `connection_event`s;
|
|
20
|
+
new `ConnectorType.HTTP`. The substrate for the future inbound FHIR facade (#20) / DICOMweb receiver (#24).
|
|
21
|
+
*(SOAP-envelope sync-reply, intake-socket auth, and method/path routing metadata are deferred follow-ons.)*
|
|
22
|
+
- **`fhir_lookup(connection, query)`** (#58, [ADR 0043](docs/adr/0043-fhir-read-lookup.md)) — a Handler-callable,
|
|
23
|
+
**read-only** FHIR read/search that extends the ADR 0010 `db_lookup` carve-out to FHIR: off the event loop,
|
|
24
|
+
raises on a Router / in dry-run, reuses the SMART Backend bearer (ADR 0024) + `[egress].allowed_http`, GET-only.
|
|
25
|
+
- **Email / SMTP outbound destination** (#23, [ADR 0029](docs/adr/0029-email-smtp-destination.md)) — a stdlib
|
|
26
|
+
`Email()`/`SMTP()` connector; STARTTLS-by-default, AUTH-over-TLS-only, a new deny-by-default
|
|
27
|
+
`[egress].allowed_smtp` arm. (IMAP/POP read + XOAUTH2 is a deferred Phase 2.)
|
|
28
|
+
- **X12 strict implementation-guide validation** via `pyx12` (#32) behind the tolerant `X12Peek`/`X12Message`
|
|
29
|
+
hot path (`messagefoundry[x12]`; yields 997/999 acks), and a **structured `[xml]` codec layer** (#31) —
|
|
30
|
+
`XmlMessage` (XPath read/set + ns-aware re-encode) over **hardened lxml** + optional `xmlschema`/`signxml`
|
|
31
|
+
(`messagefoundry[xml]`; XXE / entity-expansion / external-DTD refused).
|
|
32
|
+
- **Operator alert-state** (#56, [ADR 0044](docs/adr/0044-operator-alert-state.md)) — a new `alert_instance`
|
|
33
|
+
store table (open / acknowledged / resolved + first/last-seen + count) across all three backends, de-duped on
|
|
34
|
+
the ADR-0014 throttle key; `GET /alerts/active` + ack/resolve (RBAC `MONITORING_DIAGNOSE`); the per-connection
|
|
35
|
+
`alerts_active` count is now real; a console Alerts tab. Metadata-only.
|
|
36
|
+
- **User-definable custom RBAC roles** (#57, [ADR 0045](docs/adr/0045-custom-rbac-roles.md)) — an admin-defined
|
|
37
|
+
named role = a chosen **subset** of the existing Permission catalog (no new permission kinds), persisted via an
|
|
38
|
+
additive `roles` migration (3 backends), gated by `USERS_MANAGE`; the six built-ins stay; narrowing revokes on
|
|
39
|
+
live sessions.
|
|
40
|
+
- **Message-content search** (#51, [ADR 0046](docs/adr/0046-message-content-search.md)) — HL7 field-path /
|
|
41
|
+
raw-content matching by **scan-and-decrypt-per-row** (the store is AES-GCM-encrypted at rest, so a plain `LIKE`
|
|
42
|
+
is impossible): metadata-pre-filtered, hard row/result caps (truncate-and-tell), decrypt off the event loop,
|
|
43
|
+
behind `messages:view_*` + **step-up** + a `message_search` audit row that never logs the search needle.
|
|
44
|
+
- **HL7 timestamp helpers on `Message`** (#59) — `age`-from-DOB, length-of-stay, and the tolerant HL7-TS parse
|
|
45
|
+
surfaced on the `Message` API (reusing `timezone.py`; no duplicate parser).
|
|
46
|
+
- **`messagefoundry support-bundle`** CLI (#49) — a PHI-safe diagnostic zip (no message bodies, no secrets;
|
|
47
|
+
redacted log tail) — and a **zero-egress version update-check** (#30,
|
|
48
|
+
[ADR 0026](docs/adr/0026-off-box-egress-update-check.md)): a no-network pinned-vs-current diff surfaced as a
|
|
49
|
+
`/status` field + an `update_available` alert + a console banner (on by default; `mode=live` rejected at load).
|
|
50
|
+
|
|
51
|
+
### Changed
|
|
52
|
+
- `[egress]` gains `allowed_smtp` (email); the read-only-lookup carve-out (CLAUDE.md §2/§8) now names
|
|
53
|
+
`fhir_lookup` alongside `db_lookup`.
|
|
54
|
+
- New connectors/codecs are documented in [`docs/CONNECTIONS.md`](docs/CONNECTIONS.md) and the update-check in
|
|
55
|
+
[`docs/CONFIGURATION.md`](docs/CONFIGURATION.md) (`[update_check]`).
|
|
56
|
+
|
|
57
|
+
### Security
|
|
58
|
+
- All new live-lookup / search paths stay on-prem and gated: `fhir_lookup` and the update-check are zero-/
|
|
59
|
+
allow-listed-egress; content search is step-up-gated + audited and never weakens at-rest encryption (the
|
|
60
|
+
cleartext key-field index was **declined**; a keyed-token index is a deferred 2nd slice). New crypto sites
|
|
61
|
+
(`transports/http_listener.py` TLS) are registered in the ASVS-11.1.3 crypto inventory.
|
|
62
|
+
|
|
63
|
+
### Dependencies
|
|
64
|
+
- New optional extras only: `messagefoundry[x12]` (`pyx12`) and `messagefoundry[xml]`
|
|
65
|
+
(`lxml`/`xmlschema`/`signxml`); the base install is unchanged. Lockfile re-exported.
|
|
66
|
+
|
|
9
67
|
## [0.2.9] — 2026-06-27 — Early Access
|
|
10
68
|
|
|
11
69
|
A retention + security-hardening + observability release: per-connection retention and
|
|
@@ -396,7 +454,9 @@ tests, but the external code review + penetration test (the bar for a security-c
|
|
|
396
454
|
- Releases are built, SBOM'd (CycloneDX), and signed with [Sigstore](https://www.sigstore.dev/) — see the
|
|
397
455
|
`release` workflow.
|
|
398
456
|
|
|
399
|
-
[Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.
|
|
457
|
+
[Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.10...HEAD
|
|
458
|
+
[0.2.10]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.9...v0.2.10
|
|
459
|
+
[0.2.9]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.8...v0.2.9
|
|
400
460
|
[0.2.8]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.7...v0.2.8
|
|
401
461
|
[0.2.7]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.6...v0.2.7
|
|
402
462
|
[0.2.6]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.5...v0.2.6
|
|
@@ -100,10 +100,12 @@ drains independently (a slow/failing one never blocks siblings); routing and tra
|
|
|
100
100
|
queued stages, so a slow/hung router or transform can no longer stall intake — or each other. At-
|
|
101
101
|
least-once now relies on a re-run re-deriving identical output, so **routers and transforms must be
|
|
102
102
|
pure** (message in → message out, no external side effects); outbound connections must still be
|
|
103
|
-
**idempotent**. *Carve-out (
|
|
104
|
-
`db_lookup(connection, statement, params)`
|
|
105
|
-
(
|
|
106
|
-
|
|
103
|
+
**idempotent**. *Carve-out (ADRs 0010/0043):* a Handler may make a **live, read-only** lookup — a
|
|
104
|
+
database read via `db_lookup(connection, statement, params)` (gated by `[egress].allowed_db`) or a FHIR
|
|
105
|
+
read/search via `fhir_lookup(connection, query)` (ADR 0043; gated by `[egress].allowed_http`, reusing the
|
|
106
|
+
SMART bearer, GET-only) — the result may differ on a re-run, **accepted by design** (it reflects the source
|
|
107
|
+
at that pass). These are the sanctioned non-pure inputs: read-only, run **off the event loop**, and
|
|
108
|
+
unavailable on a Router or in dry-run (they raise).
|
|
107
109
|
|
|
108
110
|
**Count-and-log invariant (do not break):** **every received message is persisted before the ACK**
|
|
109
111
|
(status `RECEIVED` at the ingress stage), so inbound counts still reflect the true received volume and
|
|
@@ -201,6 +203,17 @@ diverge enough to warrant it; keep this root file general.
|
|
|
201
203
|
- Paste/point at the relevant existing code alongside a plan request; it measurably improves
|
|
202
204
|
results.
|
|
203
205
|
|
|
206
|
+
### Prefer Ultracode for substantive work
|
|
207
|
+
- Before starting any substantive / non-trivial task, **check whether ultracode is enabled this
|
|
208
|
+
session** (an `ultracode` system-reminder confirms it). If it is **not**, **warn the user up
|
|
209
|
+
front and offer to do the work in ultracode** — a **Workflow** (multi-agent, adversarially
|
|
210
|
+
verified) is the preferred mode here — before proceeding.
|
|
211
|
+
- You **cannot enable ultracode yourself**: it is **session-only** and opt-in by keyword. So the
|
|
212
|
+
offer is *re-send the request with the keyword "ultracode"*, **or** confirm they want to proceed
|
|
213
|
+
solo — never claim to "switch it on", and don't auto-run a Workflow without the opt-in.
|
|
214
|
+
- **Solo only on conversational turns or trivial mechanical edits** — don't nag there. The warn-
|
|
215
|
+
and-offer gate is for non-trivial build/design/debug work, alongside the planning gate above.
|
|
216
|
+
|
|
204
217
|
### Keep context clean
|
|
205
218
|
- One logical task per session. After ~two failed attempts at the same problem, `/clear` and
|
|
206
219
|
restart with a better prompt incorporating what was learned — don't grind in a polluted
|
|
@@ -319,8 +332,9 @@ python samples/send_mllp.py samples/messages/adt_a01.hl7
|
|
|
319
332
|
- **Preserve the original raw message** in the store alongside the transformed form, so an
|
|
320
333
|
operator always sees what actually arrived.
|
|
321
334
|
- Keep transforms **pure where possible**: message in → message out; side effects (DB, network)
|
|
322
|
-
belong in connections/transports. The
|
|
323
|
-
0010) for live enrichment/gating (provider/eligibility lookups) — never a
|
|
335
|
+
belong in connections/transports. The sanctioned exceptions are the **read-only** `db_lookup` (ADR
|
|
336
|
+
0010) and `fhir_lookup` (ADR 0043) for live enrichment/gating (provider/eligibility lookups) — never a
|
|
337
|
+
write or other side effect.
|
|
324
338
|
- **ACK/NAK:** generate proper AA/AE/AR for MLLP inbound connections; the ack mode (original vs
|
|
325
339
|
enhanced vs none) is **configurable per inbound connection** (`AckMode`). Under the staged
|
|
326
340
|
pipeline the ACK is **on receipt** (`ack_after=ingest`, the default — `AckAfter`): decode/parse/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: messagefoundry
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.10
|
|
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/
|
|
@@ -66,6 +66,12 @@ Provides-Extra: sftp
|
|
|
66
66
|
Requires-Dist: paramiko>=5.0; extra == 'sftp'
|
|
67
67
|
Provides-Extra: sqlserver
|
|
68
68
|
Requires-Dist: aioodbc>=0.5; extra == 'sqlserver'
|
|
69
|
+
Provides-Extra: x12
|
|
70
|
+
Requires-Dist: pyx12>=4.0.0; extra == 'x12'
|
|
71
|
+
Provides-Extra: xml
|
|
72
|
+
Requires-Dist: lxml>=6.0.0; extra == 'xml'
|
|
73
|
+
Requires-Dist: signxml>=4.0.0; extra == 'xml'
|
|
74
|
+
Requires-Dist: xmlschema>=4.0.0; extra == 'xml'
|
|
69
75
|
Description-Content-Type: text/markdown
|
|
70
76
|
|
|
71
77
|
# MessageFoundry
|
|
@@ -37,10 +37,10 @@ code has since been removed** (per-lane ownership, the `renew_leases` heartbeat,
|
|
|
37
37
|
> - **Workstream G** (console HA operability) — **DONE**: leader/cluster view on Engine Status + off-thread
|
|
38
38
|
> reads (#299), with the per-page off-thread polling completed in #341 — which also closes deferred **#2**.
|
|
39
39
|
>
|
|
40
|
-
> The public `0.1.0` tag shipped **without** gating on the licensing/legal decision
|
|
41
|
-
> counsel review
|
|
42
|
-
> the drafted AGPL-3.0-or-later + `NOTICE`/`COMMERCIAL-LICENSE`/`CLA` posture **without** counsel sign-off
|
|
43
|
-
>
|
|
40
|
+
> The public `0.1.0` tag shipped **without** gating on the licensing/legal decision — that formal
|
|
41
|
+
> counsel review was **deferred as a dated accepted-risk decision (2026-06-17)**: `v0.1.0` shipped on
|
|
42
|
+
> the drafted AGPL-3.0-or-later + `NOTICE`/`COMMERCIAL-LICENSE`/`CLA` posture **without** counsel sign-off.
|
|
43
|
+
> *Optional non-gating follow-up:* re-run the Postgres failover after fix #293 to refresh the
|
|
44
44
|
> published ~60 s recovery figure (the hard conformance tier — zero loss, order-preserving, drain-to-zero —
|
|
45
45
|
> passes on all three backends regardless).
|
|
46
46
|
|
|
@@ -52,7 +52,7 @@ With `v0.1.0` shipped, the active priority moves to **v0.2**. Its headline is th
|
|
|
52
52
|
client (#20)** plus the operator-visibility quick wins — **observability/metrics export (#21)**, the
|
|
53
53
|
**console Alerts/Dead-Letters pages (#22)**, and the **user guide (#19)**. The candidate work is the
|
|
54
54
|
Mirth feature-gap items **#20–#27** below, plus deferred **#3** (per-key ordering), **#16** (Corepoint
|
|
55
|
-
event-log parity, ADRs 0020/0021),
|
|
55
|
+
event-log parity, ADRs 0020/0021), and the security-posture
|
|
56
56
|
follow-ups below. **Active-active horizontal scale-out is dropped and its code removed** — no longer a
|
|
57
57
|
planned milestone (2026-06-18). Full build sequencing across parallel sessions:
|
|
58
58
|
[`releases/MULTISESSION-PLAN-3.md`](releases/MULTISESSION-PLAN-3.md) (the living plan; supersedes
|
|
@@ -75,9 +75,9 @@ separate owner exercise** — this is the candidate set, not a committed plan.
|
|
|
75
75
|
|
|
76
76
|
| Item | Value | Verdict | Effort | Why / trigger |
|
|
77
77
|
|---|---|---|---|---|
|
|
78
|
-
| **Meta — lock v0.2 scope** | Med | **do-now** | S | Ratify #20–#27 as committed (marquee shipped, declines recorded, **#24 promoted 2026-06-20 — ADR 0025, adopter-driven**); decide #22b ship-or-slip. Governance, not a feature.
|
|
79
|
-
| **#28 load test** | Med | **
|
|
80
|
-
| **#29 throughput test** | Med | **
|
|
78
|
+
| **Meta — lock v0.2 scope** | Med | **do-now** | S | Ratify #20–#27 as committed (marquee shipped, declines recorded, **#24 promoted 2026-06-20 — ADR 0025, adopter-driven**); decide #22b ship-or-slip. Governance, not a feature. |
|
|
79
|
+
| **#28 load test** | Med | **done** | S | ✅ Executed on the local test boxes (2026-06-27) — no-loss/latency result in `TUNING-BASELINE.md`. These are the **consumer-hardware floor**; the enterprise-hardware run is slated for the **#40** self-hosted box. |
|
|
80
|
+
| **#29 throughput test** | Med | **done** | S | ✅ Re-measured on the local test boxes + `TUNING-BASELINE.md` refreshed (2026-06-27). Consumer-hardware floor numbers; the enterprise re-measure is slated for the **#40** self-hosted box. |
|
|
81
81
|
| **#22b Alerts GUI page** | Med | do-next | S | Endpoint `/alerts/rules` shipped (#415); thin console page in flight (PR #420). Operator-parity polish, not a migration-unblocker. |
|
|
82
82
|
| **#33 config-UX audit** | Med | do-next | M | Right timing to audit config sprawl — but value realizes **only if** the spawned follow-ups are funded. Keep bounded to transport/service config (logic stays code-first — never drift toward #26). |
|
|
83
83
|
| **FEATURE-MAP refresh** | Med | do-next → **done** | S | Verified stale (Dead-Letters row); ASVS score synced to 212/0/0/133 (#425). |
|
|
@@ -85,7 +85,6 @@ separate owner exercise** — this is the candidate set, not a committed plan.
|
|
|
85
85
|
| **#16 eventlog (0021 half)** | Med | on-trigger | L | Trigger: a partner needs ACK-reconciliation evidence. 0021 (inbound ACK "Response Sent") is cheap (extends ADR 0013); **0020 (raw protocol-trace) = near-drop** (new raw-PHI-at-rest tier nobody named). The #14 tee already surfaces ACK signal. |
|
|
86
86
|
| **#34 per-connection retention** | Med | on-trigger | M | Trigger: a real multi-feed estate needs differential windows (keep ADT 90d, prune a chatty lab feed 7d). Bounded; follows the per-connection-over-global pattern. |
|
|
87
87
|
| **least-priv service-account default** | Med | on-trigger | S | Account + ACLs already built; only the default flip off LocalSystem remains. Ride the next green `windows-service-smoke`. |
|
|
88
|
-
| **#13 licensing close-out** | Med | on-trigger | S | Blocked on counsel's reply; owner can only chase, not build (v0.1.0 already shipped the posture as accepted risk). |
|
|
89
88
|
| **#11 WebAuthn (WP-14b)** | Low | on-trigger | L | Buys **zero** ASVS movement (6.3.3 already Pass via TOTP); only on off-loopback exposure. |
|
|
90
89
|
| **connector SecretProvider seam** | Low | on-trigger | M | Already a conditional Pass; managed-identity (gMSA/Entra) covers the audience. Build on real Vault/KMS demand. |
|
|
91
90
|
| **#31 `.xml()` accessor** | Low | on-trigger | S | Trigger: the first inbound XML feed (lands with #7). Core `.xml()` only, hardened defaults — **no** `[xml]`/lxml SOAP/CDA model. |
|
|
@@ -96,7 +95,6 @@ separate owner exercise** — this is the candidate set, not a committed plan.
|
|
|
96
95
|
| **#24 DICOM** | **Med–High** | **done (Phases 1 + 2)** | L | **Adopter-driven** — a radiology practice on Corepoint DICOM Gear wants to adopt. ✅ **Phases 1 + 2 SHIPPED** ([ADR 0025](adr/0025-dicom-codec-store-connectors.md) Accepted): pure codec + DIMSE **C-STORE SCP** + code-first SR→HL7 Handler (Phase 1, PR #439); **C-STORE SCU + C-ECHO + DICOMweb STOW-RS** outbound (Phase 2, `rest.py` reuse — no new dep). **MWL/Q-R/inbound-DICOMweb declined/deferred.** Did **not** need #7. |
|
|
97
96
|
| **Meta — v0.3 cut** | Low | defer | S | Don't formalize now — a themed candidate set anchored on **ADR 0023 / inbound-HTTP**, gated on real feeds. |
|
|
98
97
|
| **#30 dependency-update check** | Low | defer → drop | M | Zero demand; an outbound PyPI call **tensions the on-prem/no-egress identity**. `requirements.lock` + DEP-1 already cover it. |
|
|
99
|
-
| **#9 ASVS `.docx` re-stamp** | Low | **drop** | S | Out-of-repo pandoc run before a CISO meeting — not backlog work (the in-repo assessment is already current). |
|
|
100
98
|
| **ASVS 11.7.1 in-use memory encryption** | Low | **drop (N/A)** | XL | Already scored **N/A** — a hardware/OS/hypervisor capability, unachievable for pure-Python on-prem. |
|
|
101
99
|
| **#18 git-offering** | Low | **confirm-decline** | M | Buyers already run git/ADO/GHE — a non-problem. Fold conventions into #33; AGPL-compat entanglement. |
|
|
102
100
|
| **#25 JMS** | Low | **confirm-decline** (as named) | M | Java-broker artifact vs the **no-broker identity** (the staged SQLite queue *is* the durability story). Keep only a *generic* AMQP/Kafka on-trigger candidate. |
|
|
@@ -612,37 +610,6 @@ wanted, gating the approve route with `require_step_up` too is a one-line change
|
|
|
612
610
|
|
|
613
611
|
---
|
|
614
612
|
|
|
615
|
-
## 9. Regenerate the InfoSec standards-conformance deliverables to ASVS L3
|
|
616
|
-
|
|
617
|
-
> ✅ **DONE (2026-06-17), then advanced.** The in-repo **`docs/security/ASVS-L3-STATUS.md`** memo was
|
|
618
|
-
> re-stamped — first to **186 / 21 / 5 / 133** (post-WP-14 MFA, 6.3.3 MFA-as-Fail framing rewritten), then
|
|
619
|
-
> to **189 / 20 / 3 / 133** after WP-L3-13 admin defense (8.4.2) and sec-offbox-log off-box
|
|
620
|
-
> forwarding (16.4.3 + 16.2.4) landed. The OneDrive reviewer-facing `.docx` deliverables (the ASVS-L3 status memo, the InfoSec
|
|
621
|
-
> standards summary, and the executive summary) were re-stamped to the same scorecard via pandoc
|
|
622
|
-
> (originals backed up `*.pre-restamp.docx`). **Note (current posture, 2026-06-19):** the score has since
|
|
623
|
-
> advanced to **212 / 0 / 0 / 133** (16.4.3 + 16.2.4 closed by sec-offbox-log → 189/20/3/133; the 4.1.5 #378,
|
|
624
|
-
> 12.1.4 #376, 13.3.3 #377 Fail→Pass flips → 192/20/0/133; then the #383 partials sweep closed the last 20
|
|
625
|
-
> Partials with documented residuals → 212/0/0/133); the in-repo
|
|
626
|
-
> `ASVS-L3-STATUS.md` / `ASVS-L3-ASSESSMENT.md` are updated, but the OneDrive `.docx` set needs another re-stamp.
|
|
627
|
-
> *(The `STANDARDS-CONFORMANCE-SUMMARY.md` named below was never committed to the repo — the canonical
|
|
628
|
-
> source of truth is `ASVS-L3-ASSESSMENT.md`; the summaries live in the OneDrive deliverable set.)*
|
|
629
|
-
|
|
630
|
-
**Type:** documentation / reviewer-facing deliverable refresh. No code.
|
|
631
|
-
|
|
632
|
-
**What:** `docs/security/STANDARDS-CONFORMANCE-SUMMARY.md` and its two `.docx` companions still carry
|
|
633
|
-
the **L2** headline (`138 Pass / 18 Partial / 2 Fail / 95 N-A`) and L2 framing. The assessment was
|
|
634
|
-
re-targeted to **Level 3** (PR #273) and the L3 remediation arc is largely closed — the current
|
|
635
|
-
combined scorecard is **212 Pass / 0 Partial / 0 Fail / 133 N-A** (345 reqs — 0 open Fails *and* 0 open Partials after the #383 partials sweep, atop sec-offbox-log off-box forwarding + the 4.1.5 #378 / 12.1.4 #376 / 13.3.3 #377 Fail→Pass flips). Regenerate the summary +
|
|
636
|
-
Word deliverables against `ASVS-L3-ASSESSMENT.md` / `ASVS-L3-REMEDIATION-PLAN.md` (re-run the
|
|
637
|
-
`infosec-standards-doc` workflow), keeping the point-in-time SELF-assessment disclaimer.
|
|
638
|
-
|
|
639
|
-
**Why deferred:** a derived deliverable, not a gate — regenerate when next presenting to a
|
|
640
|
-
reviewer/CISO so the numbers don't drift again mid-arc.
|
|
641
|
-
|
|
642
|
-
**Source:** ASVS L2→L3 re-target (PR #273) + the L3 remediation arc (#284 / #305 / #308 / #312).
|
|
643
|
-
|
|
644
|
-
---
|
|
645
|
-
|
|
646
613
|
## 10. Worktree tooling: `new.ps1 -Base` resolves the *local* branch, which can lag `origin`
|
|
647
614
|
|
|
648
615
|
> ✅ **DONE (2026-06-17, PR #348).** `new.ps1`/`spawn.ps1` now `git fetch origin` first and default `-Base`
|
|
@@ -728,40 +695,6 @@ traced.
|
|
|
728
695
|
|
|
729
696
|
---
|
|
730
697
|
|
|
731
|
-
## 13. Licensing posture — config-as-separate-work + commercial edition (counsel review deferred to v0.2 — accepted risk)
|
|
732
|
-
|
|
733
|
-
> 📂 **ENGAGEMENT OPENED 2026-06-19 (coordinator), PR #406.** The formal counsel review is now scoped and
|
|
734
|
-
> opened — see [`COUNSEL-ENGAGEMENT-BRIEF.md`](COUNSEL-ENGAGEMENT-BRIEF.md), packaging the four review
|
|
735
|
-
> artifacts (CLA, COMMERCIAL-LICENSE, ADR 0017 §6, DUAL_LICENSING_PLAN) + 11 questions for counsel (the six
|
|
736
|
-
> plan questions incl. config-as-separate-work, plus five surfaced: no Corporate CLA, comment-assent
|
|
737
|
-
> enforceability, the §3 patent grant, the steward's own §13, dependency license-compat). Doc-only; recording
|
|
738
|
-
> counsel's answers + lifting "pending legal review" is the deferred close-out (Lane L).
|
|
739
|
-
|
|
740
|
-
> **⚠️ DECISION 2026-06-17 (owner — accepted risk), CARRIED OUT 2026-06-18:** the formal licensing/counsel
|
|
741
|
-
> review was **deferred to v0.2**, and **`v0.1.0` was not gated on it**. `v0.1.0` was cut and published
|
|
742
|
-
> 2026-06-18 on the drafted **AGPL-3.0-or-later** posture (`NOTICE`, per-file SPDX headers, `CLA.md`,
|
|
743
|
-
> `COMMERCIAL-LICENSE.md` — landed in #350). The owner **accepted the risk** that publishing `v0.1.0` and
|
|
744
|
-
> reserving the package name — effectively irreversible, setting the licensing precedent adopters build on —
|
|
745
|
-
> happened **before** counsel reviews ADR 0017 decision #6. This superseded the "settle with counsel *before*
|
|
746
|
-
> first public release" stance recorded below (and ADR 0017 §6); the review moves to the v0.2 cycle.
|
|
747
|
-
|
|
748
|
-
**Type:** licensing / release-gating decision. No code.
|
|
749
|
-
|
|
750
|
-
**What:** ADR 0017's ratified **decision #6** — adopter **config is a "separate work"** from the AGPL
|
|
751
|
-
engine, paired with a planned **commercial edition** — is recorded as **PENDING LEGAL REVIEW**. The
|
|
752
|
-
licensing posture (how the AGPL engine, an adopter's own private config repo, and a possible commercial
|
|
753
|
-
offering relate) should be settled with counsel **before** the first public release: publishing a version
|
|
754
|
-
and reserving the package name is effectively irreversible and sets the licensing precedent adopters build
|
|
755
|
-
on.
|
|
756
|
-
|
|
757
|
-
**Why deferred:** it is a legal/business decision, not engineering — it gates *how* the licensing posture is
|
|
758
|
-
counsel-blessed, not *whether* the engine works. **Per the 2026-06-17 decision above it did not hold the
|
|
759
|
-
`v0.1.0` tag** (accepted-risk — `v0.1.0` shipped 2026-06-18); the review is rescheduled to the v0.2 cycle.
|
|
760
|
-
|
|
761
|
-
**Source:** ADR 0017 ("Ratified decisions", decision #6); the v0.1 release-readiness discussion.
|
|
762
|
-
|
|
763
|
-
---
|
|
764
|
-
|
|
765
698
|
## 14. Parallel-run "tee" for the Corepoint → MEFOR cutover
|
|
766
699
|
|
|
767
700
|
> ✅ **BUILT — shipped #335 (relay) + #340 (purge/export).** The standalone, dependency-free MLLP tee relay
|
|
@@ -1087,7 +1020,7 @@ adopter supplies git out-of-band.
|
|
|
1087
1020
|
embedded lightweight git server for the config repo, or just documented git conventions + IDE wiring
|
|
1088
1021
|
over the adopter's existing remote — these are very different commitments.
|
|
1089
1022
|
- **Licensing fit:** any bundled component must be license-compatible with the AGPL engine and the
|
|
1090
|
-
config-as-separate-work posture (ties into
|
|
1023
|
+
config-as-separate-work posture (ties into ADR 0017 decision #6, pending legal).
|
|
1091
1024
|
- **Dependency/footprint cost:** adding a git dependency to the base install vs. keeping the engine
|
|
1092
1025
|
lean and leaving VCS to the operator.
|
|
1093
1026
|
|
|
@@ -1416,6 +1349,13 @@ priority; situational.
|
|
|
1416
1349
|
|
|
1417
1350
|
## 28. Run a load test (execute the load harness on the current build)
|
|
1418
1351
|
|
|
1352
|
+
> ✅ **DONE — executed on the local test boxes (2026-06-27).** The no-loss / latency-under-load harness was
|
|
1353
|
+
> run against the current `0.2.9` build and [`benchmarks/TUNING-BASELINE.md`](benchmarks/TUNING-BASELINE.md)
|
|
1354
|
+
> carries the result. **Caveat:** these are the **consumer-hardware floor** figures (a ~15 W APU + consumer
|
|
1355
|
+
> SSD with the engine + DB co-located — a deliberately conservative floor, *not* the enterprise number). A
|
|
1356
|
+
> single-box-NVMe / enterprise-shaped run to pin the real ceiling is **slated for #40** (the self-hosted
|
|
1357
|
+
> Windows Server 2025 + SQL Server 2025 CI leg), which will be the standing home for the recurring perf runs.
|
|
1358
|
+
|
|
1419
1359
|
**Type:** validation / verification — *running* existing tooling, not new code. The load harness is
|
|
1420
1360
|
**BUILT** ([`harness/load/`](../harness/load/), [`docs/LOAD-TESTING.md`](LOAD-TESTING.md)) and a Gate-#3
|
|
1421
1361
|
baseline is published ([`benchmarks/TUNING-BASELINE.md`](benchmarks/TUNING-BASELINE.md)).
|
|
@@ -1435,6 +1375,12 @@ pass is the evidence for a pilot/cutover and the regression guard for pipeline/s
|
|
|
1435
1375
|
|
|
1436
1376
|
## 29. Run a throughput test (re-measure + refresh the tuning baseline)
|
|
1437
1377
|
|
|
1378
|
+
> ✅ **DONE — re-measured on the local test boxes (2026-06-27).** Throughput (msg/s + p50/p95/p99) was
|
|
1379
|
+
> re-run across the store backends and [`benchmarks/TUNING-BASELINE.md`](benchmarks/TUNING-BASELINE.md)
|
|
1380
|
+
> refreshed. As with #28 these are the **consumer-hardware floor** numbers; the enterprise-hardware
|
|
1381
|
+
> re-measure is **slated for #40** (the self-hosted Windows Server 2025 + SQL Server 2025 leg), the standing
|
|
1382
|
+
> home for recurring throughput runs.
|
|
1383
|
+
|
|
1438
1384
|
**Type:** validation / benchmark — *running* the existing benchmark, not new tooling.
|
|
1439
1385
|
|
|
1440
1386
|
**What:** re-run the throughput benchmark (msg/sec + p50/p95/p99 latency) across the supported store
|
|
@@ -1975,6 +1921,9 @@ dedicated Windows Server + SQL Server test box and add a leg that:
|
|
|
1975
1921
|
- runs the SQL Server store + coordinator + DATABASE-connector suites against the **local SQL Server
|
|
1976
1922
|
2025** instance (`MEFOR_TEST_SQLSERVER=1`, real DSN) — exercising RCSI on a real engine, real
|
|
1977
1923
|
`db_lookup`, and the AVX-capable hardware 2025 requires.
|
|
1924
|
+
- hosts the recurring **load + throughput runs (#28 / #29)** — the local-box runs published the
|
|
1925
|
+
consumer-hardware *floor*; this box is where the enterprise-hardware *ceiling* gets pinned on a
|
|
1926
|
+
recurring basis.
|
|
1978
1927
|
|
|
1979
1928
|
**Scope / open questions (when built):**
|
|
1980
1929
|
- **Self-hosted runner security:** it executes repo code — gate to **push / `workflow_dispatch` on
|
|
@@ -2501,6 +2450,141 @@ attachment-handler + data-pruner behavior researched the same day (citations abo
|
|
|
2501
2450
|
|
|
2502
2451
|
---
|
|
2503
2452
|
|
|
2453
|
+
## 56. Operator alert-state — resolvable alert instances (ack / resolve) + a real `alerts_active` count (Corepoint parity) (P2)
|
|
2454
|
+
|
|
2455
|
+
> 📌 **PRE-RESERVED (Plan-5, 2026-06-27).** Number reserved + ADR authored; build scheduled. See
|
|
2456
|
+
> [`releases/MULTISESSION-PLAN-5.md`](releases/MULTISESSION-PLAN-5.md) Lane **L7** (Wave 2) and
|
|
2457
|
+
> [ADR 0044](adr/0044-operator-alert-state.md) (Proposed).
|
|
2458
|
+
|
|
2459
|
+
**Type:** feature — operator monitoring. Today alerts are stateless emit-points (ADR 0014) and the
|
|
2460
|
+
`ConnectionRow.alerts_active` field is **stubbed `0`**. Add a persisted `alert_instance` store table
|
|
2461
|
+
(open / acknowledged / resolved + first/last-seen + count) de-duped on the existing `_emit` throttle key,
|
|
2462
|
+
`GET /alerts/active` + ack/resolve endpoints (RBAC `MONITORING_DIAGNOSE`), the real `alerts_active` count,
|
|
2463
|
+
and a console Alerts-page tab. **Metadata only — no new at-rest PHI tier.** Surfaced by the #52 Corepoint
|
|
2464
|
+
parity gap analysis.
|
|
2465
|
+
|
|
2466
|
+
---
|
|
2467
|
+
|
|
2468
|
+
## 57. User-definable custom RBAC roles over the existing Permission catalog (Corepoint parity) (P2)
|
|
2469
|
+
|
|
2470
|
+
> 📌 **PRE-RESERVED (Plan-5, 2026-06-27).** See [`releases/MULTISESSION-PLAN-5.md`](releases/MULTISESSION-PLAN-5.md)
|
|
2471
|
+
> Lane **L8** (Wave 2) and [ADR 0045](adr/0045-custom-rbac-roles.md) (Proposed).
|
|
2472
|
+
|
|
2473
|
+
**Type:** feature — RBAC. Today there are **6 fixed built-in roles**. Add admin-defined named roles, each a
|
|
2474
|
+
chosen **subset** of the existing `Permission` catalog (no new permission kinds), persisted via a `roles`-table
|
|
2475
|
+
migration across all three backends (SQLite + Postgres + SQL Server), gated by `USERS_MANAGE`; the built-ins
|
|
2476
|
+
stay; custom roles are an additive overlay; deny-by-default preserved. Surfaced by the #52 Corepoint parity
|
|
2477
|
+
gap analysis.
|
|
2478
|
+
|
|
2479
|
+
---
|
|
2480
|
+
|
|
2481
|
+
## 58. FHIR client read / search lookup — `fhir_lookup` (read-only, like `db_lookup`) (P2)
|
|
2482
|
+
|
|
2483
|
+
> ✅ **SHIPPED (Plan-5 Wave 1, PR #618, 2026-06-27).** `fhir_lookup(connection, query)` is built — a read-only
|
|
2484
|
+
> GET / search that extends the `db_lookup` carve-out to FHIR ([ADR 0043](adr/0043-fhir-read-lookup.md),
|
|
2485
|
+
> Accepted), off the event loop, raises on a Router / in dry-run. See
|
|
2486
|
+
> [`releases/MULTISESSION-PLAN-5.md`](releases/MULTISESSION-PLAN-5.md) Lane L2.
|
|
2487
|
+
|
|
2488
|
+
**Type:** feature — live enrichment. The FHIR client (ADR 0022) is **write-only** today. Add a handler-callable,
|
|
2489
|
+
read-only `fhir_lookup(connection, query)` (read-by-id GET / search) that **extends** the ADR 0010 `db_lookup`
|
|
2490
|
+
carve-out to FHIR: reuses the SMART Backend bearer (ADR 0024) + `[egress].allowed_http`, runs off the event
|
|
2491
|
+
loop, raises on a Router / in dry-run, re-run-divergent by design (read-side only). GET-only — writes stay on
|
|
2492
|
+
`FhirDestination`. Surfaced by the #52 Corepoint parity gap analysis.
|
|
2493
|
+
|
|
2494
|
+
---
|
|
2495
|
+
|
|
2496
|
+
## 59. HL7 timestamp / age / length-of-stay helpers on `Message` (P3)
|
|
2497
|
+
|
|
2498
|
+
> ✅ **SHIPPED (Plan-5 Wave 1, PR #618, 2026-06-27).** `Message` now exposes age-from-DOB, length-of-stay, and
|
|
2499
|
+
> the tolerant HL7-TS parse (reusing `timezone.py`, no duplicate parser). See
|
|
2500
|
+
> [`releases/MULTISESSION-PLAN-5.md`](releases/MULTISESSION-PLAN-5.md) Lane L1.
|
|
2501
|
+
|
|
2502
|
+
**Type:** feature — transform ergonomics. **`messagefoundry/timezone.py` already provides the tolerant
|
|
2503
|
+
HL7-TS→`datetime` parse** (`_parse_hl7_timestamp` / `convert_hl7_timestamp` / `to_zone`); this item adds only
|
|
2504
|
+
the **new** helpers (age-from-DOB, length-of-stay between two timestamps, an `hl7_now()` / TS-format if missing)
|
|
2505
|
+
and surfaces the existing parser on the `Message` surface. MSH-encoding-aware, **no I/O**, console-importable
|
|
2506
|
+
(§4 carve-out). **Do not** build a duplicate parser. Surfaced by the #52 Corepoint parity gap analysis.
|
|
2507
|
+
|
|
2508
|
+
---
|
|
2509
|
+
|
|
2510
|
+
## 60. Turnkey disaster recovery — scheduled config/store backup + restore-verify (config-tier slice) (P3, owner decision)
|
|
2511
|
+
|
|
2512
|
+
> 📌 **PRE-RESERVED (Plan-5, 2026-06-27).** See [`releases/MULTISESSION-PLAN-5.md`](releases/MULTISESSION-PLAN-5.md)
|
|
2513
|
+
> §G (deferred tail). **Owner-gated** (backup cadence / retention / restore-verify posture).
|
|
2514
|
+
|
|
2515
|
+
**Type:** operations — DR. An engine-managed scheduled backup of the config bundle + store (config-tier slice
|
|
2516
|
+
first) with a restore-verify pass. Tracked for a future wave; **not staffed** until the owner sets the backup
|
|
2517
|
+
cadence / retention / restore-verify posture.
|
|
2518
|
+
|
|
2519
|
+
---
|
|
2520
|
+
|
|
2521
|
+
## 61. Third-tier DR standby — right-sized box that takes over when the HA pair fails, running only high-priority feeds (P3, owner decision)
|
|
2522
|
+
|
|
2523
|
+
> 📌 **Owner-gated / NEW candidate (2026-06-27).** A **third recovery tier** *below* the shipped
|
|
2524
|
+
> active-passive HA — distinct from **#60** (scheduled backup + restore-verify) and from the v0.1 HA
|
|
2525
|
+
> failover. **Not staffed** until the owner sets the DR posture (warm vs cold, activation trigger,
|
|
2526
|
+
> feed-priority tiers, fail-back); wants an **ADR** before code.
|
|
2527
|
+
|
|
2528
|
+
**Type:** operations — disaster recovery (site / HA-pair-loss tier).
|
|
2529
|
+
|
|
2530
|
+
**What:** a **right-sized DR box** that takes over when the **HA setup itself fails** — i.e. the primary
|
|
2531
|
+
*and* its active-passive partner are both gone (whole-site / shared-store loss, e.g. the production database
|
|
2532
|
+
goes down), not just a single engine-process crash. The DR server is intentionally **under-provisioned** — a
|
|
2533
|
+
small box, not a second full-size hot standby that mostly sits idle — so DR survivability doesn't require
|
|
2534
|
+
provisioning duplicate full-capacity hardware. On activation it brings up only a **prioritized subset** of
|
|
2535
|
+
connections — the **high-priority feeds** — and runs in a deliberately **degraded mode**, accepting reduced
|
|
2536
|
+
throughput/coverage as the cost of cheap DR.
|
|
2537
|
+
|
|
2538
|
+
**The three tiers (this item = tier 3):**
|
|
2539
|
+
1. **Primary** — normal operation.
|
|
2540
|
+
2. **Active-passive HA (shipped, v0.1)** — same-tier engine failover at *full* capacity; DB-tier HA delegated
|
|
2541
|
+
to the DBA. Handles a node failure, **not** loss of the whole HA pair/site.
|
|
2542
|
+
3. **Third-tier DR (this item)** — a smaller box elsewhere that activates only when tier 2 is also gone, and
|
|
2543
|
+
runs *less* (high-priority feeds only), not more.
|
|
2544
|
+
|
|
2545
|
+
This is **not** active-active scale-out (dropped 2026-06-18, code removed) — DR here runs a *reduced* feed
|
|
2546
|
+
set on smaller hardware, the opposite of scale-out. It would **consume #60's backups** (or DB replication
|
|
2547
|
+
delegated to the DBA) to seed the DR store; #60 is the backup/restore mechanic, this is the
|
|
2548
|
+
**standby-takeover + degraded-operation** mechanic on top of it.
|
|
2549
|
+
|
|
2550
|
+
**New building block this needs — a per-connection priority tier.** For DR to "run only the high-priority
|
|
2551
|
+
feeds," each Connection needs a **priority / DR-tier** classification (e.g. `priority = critical|normal|low`
|
|
2552
|
+
or explicit `dr_profile` membership), layered as the same **global-default + per-connection-override** model
|
|
2553
|
+
used for FIFO, `RetryPolicy`, `BuildupThreshold`, per-connection retention (**#34**), and embedded-doc
|
|
2554
|
+
pruning (**#47**). Authored on the `ConnectionSpec` and/or as `connections.toml` keys (ADR 0007) so it stays
|
|
2555
|
+
hand-/GUI-editable. A **DR run-profile** is then "start only connections at tier ≥ X" — leaning on the
|
|
2556
|
+
per-connection start + startup fault-isolation path already built (ADR 0031). The priority signal is reusable
|
|
2557
|
+
beyond DR (load-shedding, ordered startup, alert severity).
|
|
2558
|
+
|
|
2559
|
+
**Open questions for the ADR:**
|
|
2560
|
+
- **How the DR box gets state** — DB replication to the DR site (delegated to the DBA, consistent with the
|
|
2561
|
+
declined "DB-tier backup/HA/restore" stance) vs. restore-from-#60-backups; the warm/cold choice sets RPO/RTO.
|
|
2562
|
+
The engine owns the feed-priority + selective-startup half, not the DB-replication half.
|
|
2563
|
+
- **Activation trigger & arbitration** — who declares the HA pair down and promotes DR (manual runbook vs.
|
|
2564
|
+
automated probe), and how split-brain is prevented so DR and a recovering primary don't both run the
|
|
2565
|
+
high-priority feeds.
|
|
2566
|
+
- **Degraded-mode partner behavior** — low-priority inbound feeds are *down* on DR; senders see a refused
|
|
2567
|
+
connection (their own resend/queue covers the gap) vs. an explicit maintenance NAK.
|
|
2568
|
+
- **Fail-back** — returning to the restored primary without losing or double-processing what DR handled (the
|
|
2569
|
+
at-least-once + idempotency invariants must hold across the handoff).
|
|
2570
|
+
|
|
2571
|
+
**Why P3 / owner-gated.** DR-beyond-HA is a recognized enterprise expectation and a Corepoint-parity gap (the
|
|
2572
|
+
gap analysis lists "standby failover/failback"), but it's a larger build touching deployment topology, the
|
|
2573
|
+
store-replication boundary (partly the DBA's), and a new priority-tier config surface — and it's not an open
|
|
2574
|
+
exposure on the shipping config. **Trigger:** an adopter requires site / HA-pair-loss DR on a budget (no
|
|
2575
|
+
second full hot standby) with a defined critical-feed set.
|
|
2576
|
+
|
|
2577
|
+
**Relation to siblings:** **#60** (backup/restore-verify — seeds the DR state), the shipped active-passive HA
|
|
2578
|
+
(tier 2), **#34** / **#47** (shared per-connection-override plumbing for the priority tier), **ADR 0031**
|
|
2579
|
+
(startup fault isolation — DR starts a *subset* of connections via the same path), **ADR 0007**
|
|
2580
|
+
(`connections.toml` for the GUI-editable priority key).
|
|
2581
|
+
|
|
2582
|
+
**Source:** owner request (2026-06-27) — "a disaster recovery option beyond HA: a third tier that takes over
|
|
2583
|
+
when the HA pair fails (e.g. the primary database goes down). A small, right-sized DR box — not a full-size
|
|
2584
|
+
server sitting unused — spins up and runs only the high-priority feeds."
|
|
2585
|
+
|
|
2586
|
+
---
|
|
2587
|
+
|
|
2504
2588
|
*Everything else from the 2026-06-10 full-codebase review (1 critical, 13 high, 33 medium, 31 low —
|
|
2505
2589
|
78 findings) has been remediated; see the review report's §6 action order. The two items it still
|
|
2506
2590
|
sourced — **#1 (SQL Server concurrency)** and **#2 (console off-thread)** — are now both **DONE**
|
|
@@ -433,6 +433,20 @@ so retention is opt-in.
|
|
|
433
433
|
> writes one `retention_purge` `audit_log` entry (cutoffs + counts, **no** message content). Design:
|
|
434
434
|
> [PHI.md §8](PHI.md#8-retention--purge).
|
|
435
435
|
|
|
436
|
+
### `[update_check]`
|
|
437
|
+
Engine-side version-update check ([ADR 0026](adr/0026-off-box-egress-update-check.md)). The MVP is a
|
|
438
|
+
**no-network "pinned-vs-current" diff**: it compares the running `messagefoundry.__version__` against the
|
|
439
|
+
version in the installed distribution metadata (`importlib.metadata`) / the bundled `requirements.lock` —
|
|
440
|
+
**zero outbound traffic**. The result is one additive `/status` field and (optionally) one `update_available`
|
|
441
|
+
AlertSink event that the console/IDE render as a dismissible banner — **the console/IDE never call PyPI**.
|
|
442
|
+
Because the local diff is cheap and PHI-safe it is **on by default** (zero phone-home risk).
|
|
443
|
+
| Key | Type | Default | Notes |
|
|
444
|
+
|---|---|---|---|
|
|
445
|
+
| `enabled` | bool | `true` | emit the `/status` field + the `update_available` alert. `false` = suppress both |
|
|
446
|
+
| `check_interval_seconds` | float | `86400` | diff cadence (the diff is trivial; daily is ample). Must be `> 0` |
|
|
447
|
+
| `mode` | str | `"local"` | the no-network diff (the only MVP value). `"live"` (the constrained-egress path, ADR 0026 §2) is **defined but rejected at load**, so a config can never silently turn the check into a phone-home out of a PHI system |
|
|
448
|
+
| `index_url`, `index_allowed_hosts` | str / list | unset | forward-compat for the future `"live"` mode only — **accepted-but-unused** in the MVP |
|
|
449
|
+
|
|
436
450
|
### `[delivery]`
|
|
437
451
|
| Key | Type | Default | Notes |
|
|
438
452
|
|---|---|---|---|
|
|
@@ -673,6 +673,50 @@ outbound(
|
|
|
673
673
|
# The Handler returns ONLY the <Body> fragment, e.g. "<submitSingleMessage>…HL7…</submitSingleMessage>".
|
|
674
674
|
```
|
|
675
675
|
|
|
676
|
+
### Email / SMTP — `Email(...)` / `SMTP(...)` (outbound send, ADR 0029)
|
|
677
|
+
|
|
678
|
+
An **outbound destination only** — sends the Handler's output as a plain-text SMTP message (IMAP/POP read is
|
|
679
|
+
a deferred Phase 2). The Handler produces the email **body** (content-agnostic — an HL7 string, a JSON/XML
|
|
680
|
+
report, plain text); this connector delivers it to `host:port` from `sender` to `recipients` with a static
|
|
681
|
+
`subject`. `Email(...)` and `SMTP(...)` are the same factory (`ConnectorType.EMAIL`).
|
|
682
|
+
|
|
683
|
+
| Param | Type | Default | Notes |
|
|
684
|
+
|---|---|---|---|
|
|
685
|
+
| `host` | str / `env()` | — (required) | SMTP server host. |
|
|
686
|
+
| `sender` | str / `env()` | — (required) | `From:` address. |
|
|
687
|
+
| `recipients` | list[str] / str / `env()` | — (required) | `To:` address(es). |
|
|
688
|
+
| `port` | int / `env()` | `587` | `587` = STARTTLS submission; `465` = implicit TLS (`SMTP_SSL`). |
|
|
689
|
+
| `subject` | str / `env()` | `""` | Static subject (a per-message subject is a Phase-2 follow-up). |
|
|
690
|
+
| `username` | str / `env()` / None | `None` | SMTP `AUTH` user — put the secret in `env()`. |
|
|
691
|
+
| `password` | str / `env()` / None | `None` | SMTP `AUTH` password — `env()` only. AUTH is sent **over TLS only**; a cleartext-credential config is refused. |
|
|
692
|
+
| `use_tls` | bool | `True` | STARTTLS by default. `False` (MITM-able) is refused unless `MEFOR_ALLOW_INSECURE_TLS` is set (loud warning), like LDAPS / SQL Server / MLLP. |
|
|
693
|
+
| `timeout_seconds` | float | `30.0` | |
|
|
694
|
+
| `encoding` | str | `"utf-8"` | |
|
|
695
|
+
|
|
696
|
+
The egress host is **gated by `[egress].allowed_smtp`** (deny-by-default — add the host or it is refused).
|
|
697
|
+
Delivery is **at-least-once**: a retry re-sends the email, and since a mailbox has no idempotency key a rare
|
|
698
|
+
duplicate is possible and **accepted by design** (a duplicate beats a drop). `test_connection` does
|
|
699
|
+
connect/EHLO/NOOP only (reachability — it never sends `MAIL FROM`/`DATA`).
|
|
700
|
+
|
|
701
|
+
```python
|
|
702
|
+
# samples/config/connections.py (excerpt)
|
|
703
|
+
from messagefoundry import outbound, Email, env
|
|
704
|
+
|
|
705
|
+
outbound(
|
|
706
|
+
"OB_ALERTS_EMAIL",
|
|
707
|
+
Email(
|
|
708
|
+
host=env("SMTP_HOST"),
|
|
709
|
+
port=587,
|
|
710
|
+
sender="mefor@example.org",
|
|
711
|
+
recipients=["oncall@example.org"],
|
|
712
|
+
subject="MessageFoundry alert",
|
|
713
|
+
username=env("SMTP_USER"),
|
|
714
|
+
password=env("SMTP_PASS"), # AUTH over STARTTLS
|
|
715
|
+
),
|
|
716
|
+
)
|
|
717
|
+
# In config dir TOML: [egress] allowed_smtp = ["smtp.example.org"]
|
|
718
|
+
```
|
|
719
|
+
|
|
676
720
|
### FHIR — `FHIR(...)`
|
|
677
721
|
|
|
678
722
|
An **outbound** FHIR REST client ([ADR 0022](adr/0022-fhir-resource-codec-rest-client.md)) that delivers a
|