messagefoundry 0.2.8__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.8 → messagefoundry-0.2.10}/.github/workflows/ci.yml +35 -7
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/CHANGELOG.md +118 -1
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/CLAUDE.md +20 -6
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/PKG-INFO +7 -1
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/BACKLOG.md +160 -76
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CONFIGURATION.md +59 -2
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CONNECTIONS.md +130 -1
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0017-consumer-deployment-model.md +39 -0
- messagefoundry-0.2.10/docs/adr/0023-inbound-http-listener.md +326 -0
- messagefoundry-0.2.10/docs/adr/0027-per-connection-retention.md +208 -0
- messagefoundry-0.2.10/docs/adr/0029-email-smtp-destination.md +267 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0041-load-path-attestation-and-change-attribution.md +36 -7
- messagefoundry-0.2.10/docs/adr/0042-embedded-document-pruning.md +177 -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.8 → messagefoundry-0.2.10}/docs/adr/README.md +10 -4
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/TUNING-BASELINE.md +43 -0
- messagefoundry-0.2.10/docs/releases/MULTISESSION-PLAN-4.md +167 -0
- messagefoundry-0.2.10/docs/releases/MULTISESSION-PLAN-5.md +453 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-L2-PHASE0-CHANGES.md +1 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/__init__.py +26 -2
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/__main__.py +73 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/app.py +446 -27
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/auth_models.py +19 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/auth_routes.py +108 -7
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/models.py +72 -1
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/identity.py +10 -2
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/permissions.py +86 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/service.py +155 -1
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/connections_file.py +27 -1
- messagefoundry-0.2.10/messagefoundry/config/fhir_lookup.py +132 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/models.py +25 -2
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/settings.py +106 -4
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/wiring.py +310 -10
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/alerts_page.py +146 -19
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/client.py +85 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/shell.py +91 -7
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/widgets.py +67 -17
- messagefoundry-0.2.10/messagefoundry/integrity.py +351 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/__init__.py +42 -0
- messagefoundry-0.2.10/messagefoundry/parsing/binary.py +312 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/message.py +62 -0
- {messagefoundry-0.2.8 → 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.8 → 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.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/alert_sinks.py +138 -4
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/alerts.py +63 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/engine.py +44 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/retention.py +185 -10
- messagefoundry-0.2.10/messagefoundry/pipeline/update_check.py +225 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/wiring_runner.py +322 -20
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/__init__.py +2 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/base.py +162 -3
- messagefoundry-0.2.10/messagefoundry/store/content_search.py +131 -0
- messagefoundry-0.2.10/messagefoundry/store/document_strip.py +51 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/postgres.py +411 -26
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/sqlserver.py +387 -15
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/store.py +528 -23
- 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.8 → messagefoundry-0.2.10}/messagefoundry/timezone.py +153 -2
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/__init__.py +2 -0
- messagefoundry-0.2.10/messagefoundry/transports/email.py +196 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/fhir.py +240 -1
- messagefoundry-0.2.10/messagefoundry/transports/http_listener.py +473 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/mllp.py +17 -4
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/smart.py +33 -13
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/tcp.py +12 -3
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/x12.py +12 -3
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/pyproject.toml +14 -1
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/requirements.lock +62 -1
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/security/crypto_inventory_check.py +11 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_alert_rules.py +44 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_alert_sinks.py +27 -0
- messagefoundry-0.2.10/tests/test_alert_state.py +459 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_api.py +68 -0
- messagefoundry-0.2.10/tests/test_api_alerts.py +247 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_config_source_trust.py +10 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_event_emit.py +25 -8
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_event_outbound.py +2 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connections_file.py +134 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_alerts.py +121 -8
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_status.py +1 -1
- {messagefoundry-0.2.8 → 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.8 → messagefoundry-0.2.10}/tests/test_delivery_settings.py +38 -1
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dependabot_automerge_guardrails.py +7 -0
- messagefoundry-0.2.10/tests/test_dual_control_reload.py +190 -0
- messagefoundry-0.2.10/tests/test_email_destination.py +313 -0
- messagefoundry-0.2.10/tests/test_embedded_document_pruning.py +367 -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.10/tests/test_per_connection_retention.py +373 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_postgres_store.py +46 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_settings.py +38 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sqlserver_store.py +42 -0
- messagefoundry-0.2.10/tests/test_startup_attestation.py +254 -0
- messagefoundry-0.2.10/tests/test_support_bundle.py +169 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_timezone.py +139 -1
- messagefoundry-0.2.10/tests/test_update_check.py +199 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_wiring_engine.py +105 -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.8 → messagefoundry-0.2.10}/uv.lock +104 -1
- messagefoundry-0.2.8/messagefoundry/parsing/binary.py +0 -152
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.claude/settings.json +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.dockerignore +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.gitattributes +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/CODEOWNERS +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/SECURITY.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/dependabot.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/benchmark.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/cla.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/codeql.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/dependabot-auto-merge.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/dependabot-lock-resync.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/freethread-smoke.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/release-sync-check.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/release.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/scorecard.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/security.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/workflows/vuln-metrics.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.github/zizmor.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.gitignore +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.gitleaks.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.mefor-hooks/pre-commit +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.pre-commit-config.yaml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/.semgrep/messagefoundry.yml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/CLA.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/CODE_OF_CONDUCT.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/COMMERCIAL-LICENSE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/CONTRIBUTING.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/GOVERNANCE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/LICENSE +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/MAINTAINERS.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/NOTICE +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/README.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/Dockerfile +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/README.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/compose.yaml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/k8s/secret.example.yaml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/k8s/statefulset.yaml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/locks/requirements-core.lock +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/locks/requirements-sqlserver.lock +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/secrets.env.example +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/smoke/Dockerfile +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/smoke/config/IB_Test_ADT.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docker/smoke/send_adt.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/ADOPTER-CI.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/AI.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/ARCHITECTURE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CI-QUALITY.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CLUSTERING.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CODESETS.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CONTAINER-EXPOSURE-EVALUATION.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/DEPLOY-SERVER-DB.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/DEPLOYMENT.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/DICOM.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/DUAL_LICENSING_PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/FEATURE-MAP.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/HL7-VALIDATION.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/INSTALL-GUIDE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/LOAD-TESTING.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/MENTAL-MODEL.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/MessageFoundry-Mental-Model.docx +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/PHI.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/REMOTE-CONSOLE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/SECURITY-REMEDIATION-LEDGER.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/SECURITY.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/SERVICE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/SUPPORT-POLICY.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/SYSTEM-REQUIREMENTS.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/Secure_AI_Development_Standards.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/Secure_Development_Standards.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/TEE-RELAY.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/THROUGHPUT-IMPROVEMENTS.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/USER-GUIDE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/WORKTREES.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0001-staged-pipeline-architecture.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0005-transform-accessible-state.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0006-external-data-lookups.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0008-cluster-observability-api.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0009-run-scoped-context-providers.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0011-timer-scheduled-source.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0012-x12-edi-codec.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0013-increment-2-reingress-design.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0013-query-response-orchestration.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0014-alerting-rules-engine.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0026-off-box-egress-update-check.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0032-console-desktop-launch.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0033-gui-manageable-code-sets.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0034-static-analysis-triage-policy-accepted-risk-register.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0035-ide-extension-workspace-trust-and-scope.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0036-windows-config-source-trust.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0037-multi-process-sharding-l3.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0038-internal-pass-through-connector.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0039-database-tier-sharding-l5.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/0040-free-threaded-engine-support.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/adr/TEMPLATE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-components.png +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-components.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-config-graph.png +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-config-graph.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-diagram.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-message-flow.png +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-message-flow.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-topology.png +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/architecture-topology.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/benchmarks/step-b-write-amplification.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/design/dbshard.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/design/freethread.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/design/multiproc.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/hl7-message-ordering-reference.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/message-ordering-design.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/v0.1-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/research/cloud-deployment-research-2026-06.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/research/config-ux-review.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/research/non-hl7-transform-components.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ADVISORY-PROCESS.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/ASVS-L3-STATUS.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/BEYOND-ASVS-L3.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/DEPENDENCY-METRICS.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/PHASE-8C-RBAC.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/PUBLISHING.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/RCA-TEMPLATE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/RELEASE-GATE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/REVIEW-2026-06-07.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SECURITY-POSTURE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/security/THREAT-MODEL.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/testing/VERIFY.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/environments/dev.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/environments/prod.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/README.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/__main__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/__main__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/matrix.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/probes.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/report.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/acceptance/runner.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/compose.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/config/coverage.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/config/load/_shape.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/config/load/graph.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/config/passthrough/graph.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/config/store_once/graph.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/file_panel.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/file_transport.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/corpus.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/correlator.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/enginepoll.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/failover.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/failover_track.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/governor.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/ids.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/metrics.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profile.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/README.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/adt-fanout-stress.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/closed-loop.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/failover.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/fanout-baseline.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/malformed-load.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/reference.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/smoke-sqlserver.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/smoke.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/soak.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/spike-burst.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/sustained-overload.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/profiles/writeamp.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/report.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/runner.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/sender.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/load/sink.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/mllp.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/monitor.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/receive.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/__main__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/capture.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/compare.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/normalize.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/reconcile/report.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/scenarios.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/send.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/harness/window.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/.gitignore +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/.vscodeignore +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/README.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/esbuild.js +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/media/hl7schema.json +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/media/icon-amber.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/media/icon.png +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/media/icon.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/package-lock.json +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/package.json +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/snippets/messagefoundry.code-snippets +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/aiPolicy.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/alertEditor.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/auth.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/chat.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/cli.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/codeSetEditor.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/codesetsTree.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/completion.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/connectionEditor.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/editorToolbar.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/engineClient.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/engineTarget.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/extension.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/generate.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/git.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/graphTree.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/home.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/insertElement.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/newRoute.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/promote.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/promoteTarget.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/sourceControl.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/runTest.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/ai-policy.test.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/chat.test.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/editor-toolbar.test.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/engine-target.test.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/extension.test.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/index.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/insert-element.test.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/promote-target.test.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/pythonpath.test.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/test/suite/settings-scope.test.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/testBench.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/src/validate.ts +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/tsconfig.json +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/ide/tsconfig.test.json +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/mefor.code-workspace +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/adr_analyze.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/_pools.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/hl7.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/keying.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/leak.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/rules.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/anon/surrogates.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/approvals.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/field_authz.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/metrics.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/security.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/api/tls.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/data/common_passwords.txt +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/ldap.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/notifications.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/passwords.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/policy.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/ratelimit.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/tokens.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/auth/totp.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/checks.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/active_environment.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/ai_policy.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/alerts_edit.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/code_sets.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/codeset_edit.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/connections_edit.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/db_lookup.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/environments.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/fingerprint.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/ingest_time.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/reference.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/response.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/run_context.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/state.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/config/tls_policy.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/__main__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/_async.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/change_password.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/connections.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/dead_letters_page.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/delegates.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/event_log_page.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/alerts.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/connections.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/dead-letters.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/engine-status.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/log-search.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/logo-lockup.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/icons/users.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/login.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/mfa.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/reauth.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/resources/README.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/resources/app.ico +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/resources/app.svg +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/search.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/service_control.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/sessions.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/shards.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/status.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/theme.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/console/users_page.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/README.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/_core.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/_hl7data.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/adt.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/all_types.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/bar.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/dft.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/documents.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/mdm.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/mfn.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/oml.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/orl.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/orm.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/oru.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/ras.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/rde.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/siu.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/generators/vxu.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/hl7schema.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/last_resort.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/logging_setup.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/consistency.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/_deps.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/_util.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/dataset.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/errors.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/dicom/peek.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/_deps.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/errors.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/peek.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/fhir/resource.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/groups.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/peek.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/split.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/summary.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/tree.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/validate.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/delimiters.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/interchange.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/message.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/parsing/x12/peek.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/cert_expiry.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/cluster.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/config_convergence.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/dryrun.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/leader_tasks.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/reference_sync.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/security_notify.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/sharding.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/state_convergence.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/pipeline/supervisor.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/py.typed +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/redaction.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/scaffold.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/secrets_dpapi.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/audit_tee.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/crypto.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/store/keyprovider.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/base.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/database.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/dicom.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/dicomweb.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/file.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/framing.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/loopback.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/passthrough.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/remotefile.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/rest.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/signing.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/soap.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/transports/timer.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/checks.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/model.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/report.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/runner.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/messagefoundry/verify/smoke.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/packaging/messagefoundry-harness/README.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/packaging/messagefoundry-harness/pyproject.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_ACME_ADT.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_FHIR_INTAKE.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_PARTNER_X12.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_RADIOLOGY_SR.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/adt.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/codesets/event_labels.csv +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/codesets/facility_mnemonics.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/config/connections.toml +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/consistency/validated_adt.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/dicom/generate_sr_sample.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/adt_a01.hl7 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/adt_batch.hl7 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/README.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/messages/x12_270_eligibility.edi +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/results_relay/README.md +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/results_relay/codesets/test_codes.csv +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/results_relay/messages/oru_results.hl7 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/results_relay/results_relay.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/samples/send_mllp.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/console/install-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/console/pack_ico.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/dev/postgres.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/dev/sqlserver-docker.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/dev/sqlserver.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/publish/check_release_sync.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/publish/publish-denylist.txt +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/publish/publish.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/publish/scan_forbidden.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/security/vuln_metrics.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/service/import-db-ca.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/service/install-service.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/service/uninstall-service.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/trace_icon.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/worktree/new.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/worktree/remove.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/worktree/session-context.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/scripts/worktree/spawn.ps1 +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/__main__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/__init__.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/_hl7data.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/_pools.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/hl7.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/keying.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/leak.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/rules.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/anon/surrogates.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/compare.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/correlate.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/hl7_fields.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/mefor_api.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/mllp.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/relay.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/report.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tee/store.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/_dicom_sample.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/_failover_load_support.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/_fhir_fixtures.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/conftest.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_acceptance_framework.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ack_capture_runner.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ack_sent_store.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_active_environment.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ad_group_scope.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_admin_new_ip.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_adr_analyze.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ai_policy.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_alerts_edit.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_alerts_rules_api.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_anon_core.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_anon_integration.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_anon_parity.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_api_auth.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_api_reload.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_api_tls.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_approvals.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_asvs_phase0.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_audit_integrity.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_audit_offbox_tee.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_core.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_entry_hardening.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_hardening.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_service.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_session_lifecycle.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_auth_store.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_binary_carriage.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_bootstrap_admin_perms.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cert_expiry.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_channel_rbac.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_checks.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_checks_lint.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cli.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cluster.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cluster_failover_postgres.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cluster_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cluster_graph_gating.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_cluster_lease.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_code_sets.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_codeset_edit.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_config_fingerprint.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_api.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_event_api.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_event_scope.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_event_store.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connection_resilience.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_connections_cli.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_consistency.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_auth.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_client.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_dead_letters.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_event_log.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_hardening.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_icon.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_password.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_sessions.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_shards.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_step_up.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_theme.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_console_users.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_database_connector_integration.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_database_transport.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_db_lookup.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_db_lookup_live_runner.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dependency_boundaries.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicom_codec.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicom_scp.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicom_scp_security.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicom_scu.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicom_wiring.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dicomweb.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_docs_runbooks.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_dryrun.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ed_documents.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ed_documents_e2e.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_egress_allowlist.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_enginepoll_aggregate.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_environments.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_fhir_parsing.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_fhir_resource.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_fhir_transport.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_field_authz.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_field_authz_metadata.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_fifo_ordering.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_generate_cli.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_generated_adt.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_generators_core.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_generators_types.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_groups.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_compose.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_config.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_faults.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_file.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_monitor.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_harness_scenarios.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_hl7_core_features.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_hl7schema.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_inbound_bind.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ingest_time.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_keyprovider.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_last_admin_guard.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_last_resort.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_leader_tasks.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_listener_tls_exposure.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_config.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_corpus.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_failover_postgres.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_failover_unit.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_metrics.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_profile.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_report.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_runner.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_sender.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_load_sink.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_logging.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_message.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_message_split.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_metrics_exporter.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_mfa.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_mllp_encoding_override.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_mllp_tls.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_nonhl7_ingress_size_cap.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_operability_config.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_outbound_signing.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_outbound_simulate.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_packaging.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_parse_tree.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_parsing.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_passthrough.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_passthrough_graph.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_payload_agnostic_ingress.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_reconcile_capture.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_reconcile_compare.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_reconcile_harness.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_redaction.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_reference_sets.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_reingress.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_remotefile_transport.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_response_capture.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_rest_transport.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_retention.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_run_context.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_scaffold.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_scaffold_requirements.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_scan_forbidden.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_secrets_dpapi.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_security_notify.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_security_static.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_service_control.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sharding.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sibling_helper_finder.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_smart_backend.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_soap_transport.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_soap_wssecurity.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sqlserver_coordinator.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sqlserver_cursor_close.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_sqlserver_schema_init.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_staged_pipeline.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_startup_fault_isolation.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_stats_reset.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_step_up.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_backend.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_encryption.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_file_hardening.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_once_deliver_many.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_once_graph.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_read_pool.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_store_ssl.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_summary.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_supervisor.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_task_resilience.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tcp_transport.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_cli.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_compare.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_correlate.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_hl7_fields.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_mefor_api.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_mllp.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_relay.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_report.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tee_store.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_timer_source.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_tls_policy.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_totp.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_totp_window.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_transform_offloop.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_transform_state.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_transports.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_verify.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_version.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_win2025_acceptance.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_wiring.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_wiring_reload.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_wiring_serve.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_ws_stats_revalidation.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_x12_parsing.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_x12_rte.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_x12_source_ip_allowlist.py +0 -0
- {messagefoundry-0.2.8 → messagefoundry-0.2.10}/tests/test_x12_transport.py +0 -0
|
@@ -23,9 +23,11 @@ jobs:
|
|
|
23
23
|
test:
|
|
24
24
|
name: test (${{ matrix.os }}, py${{ matrix.python-version }})
|
|
25
25
|
runs-on: ${{ matrix.os }}
|
|
26
|
-
# Wall-clock backstop: bound each leg so a hung test fails in minutes, not the 6h default.
|
|
27
|
-
#
|
|
28
|
-
#
|
|
26
|
+
# Wall-clock backstop: bound each leg so a hung test fails in minutes, not the 6h default. Three
|
|
27
|
+
# nested watchdogs catch a hang at increasing scope (#55): the pytest-timeout per-test cap (60s,
|
|
28
|
+
# pyproject addopts) + the faulthandler belt fire FIRST and name the stuck frame; the pytest STEP
|
|
29
|
+
# has its own `timeout-minutes: 13` so a process-level deadlock below pytest fails the step fast;
|
|
30
|
+
# this job cap is the outermost belt if even that is somehow out-raced.
|
|
29
31
|
timeout-minutes: 15
|
|
30
32
|
strategy:
|
|
31
33
|
fail-fast: false
|
|
@@ -56,7 +58,7 @@ jobs:
|
|
|
56
58
|
sudo apt-get update
|
|
57
59
|
sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libdbus-1-3
|
|
58
60
|
|
|
59
|
-
- name: Install project (dev + console + fhir + dicom extras)
|
|
61
|
+
- name: Install project (dev + console + fhir + dicom + x12 + xml extras)
|
|
60
62
|
run: |
|
|
61
63
|
python -m pip install --upgrade pip
|
|
62
64
|
# [fhir] so the FHIR typed-tier tests (incl. the PHI-no-leak invariant, ADR 0022) actually
|
|
@@ -64,7 +66,9 @@ jobs:
|
|
|
64
66
|
# [dicom] (pydicom + pynetdicom; ADR 0025) does the same for the DICOM codec + C-STORE SCP
|
|
65
67
|
# tests, and lets mypy type-check transports/dicom.py + parsing/dicom/ against the real
|
|
66
68
|
# (py.typed) libraries rather than treating them as Any.
|
|
67
|
-
|
|
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]"
|
|
68
72
|
|
|
69
73
|
- name: Lint (ruff)
|
|
70
74
|
run: ruff check messagefoundry tests
|
|
@@ -75,10 +79,27 @@ jobs:
|
|
|
75
79
|
- name: Type-check (mypy, strict)
|
|
76
80
|
run: mypy messagefoundry
|
|
77
81
|
|
|
82
|
+
# Step-level watchdog UNDER the 15-min job cap (#55): the windows-2022 leg intermittently
|
|
83
|
+
# wedges ~25% in (a Windows ProactorEventLoop listener-teardown / socket wait that the shared
|
|
84
|
+
# session event loop can't get past), emits no output for ~12 min, then the JOB cap CANCELS it
|
|
85
|
+
# — a red ✗ with no stack and no named test. Two belts make that fail FAST and NAMED instead:
|
|
86
|
+
# * `--timeout-method=thread` (the ONLY method on Windows — SIGALRM is POSIX-only) dumps ALL
|
|
87
|
+
# thread stacks at the per-test cap (60s, set in pyproject addopts), naming the stuck frame.
|
|
88
|
+
# * PYTHONFAULTHANDLER=1 + `-o faulthandler_timeout=90` is the belt that fires even when the
|
|
89
|
+
# thread-timer CANNOT interrupt a main-thread C-level wait (a Proactor overlapped op /
|
|
90
|
+
# blocking accept / subprocess.wait): pytest's faulthandler plugin arms a separate watchdog
|
|
91
|
+
# thread that dumps the NATIVE stack of every thread at 90s (> the 60s pytest-timeout, so the
|
|
92
|
+
# per-test dump is attributed first; this is the last-resort stack when the thread method is
|
|
93
|
+
# itself out-raced). NB the plugin exposes this as the `faulthandler_timeout` ini key, not a
|
|
94
|
+
# `--faulthandler-*` CLI flag, so it is passed with `-o`; it only DUMPS (never kills), safe.
|
|
95
|
+
# The step `timeout-minutes: 13` is the outer backstop, well under the job's 15-min cap, so a
|
|
96
|
+
# hang both watchdogs somehow miss still fails the STEP (not the whole job at the silent cap).
|
|
78
97
|
- name: Tests (pytest)
|
|
98
|
+
timeout-minutes: 13
|
|
79
99
|
env:
|
|
80
100
|
QT_QPA_PLATFORM: offscreen
|
|
81
|
-
|
|
101
|
+
PYTHONFAULTHANDLER: "1"
|
|
102
|
+
run: pytest -q -o faulthandler_timeout=90
|
|
82
103
|
|
|
83
104
|
# Build + type-check the VS Code extension, and run its integration tests. The Python jobs never
|
|
84
105
|
# touch ide/, so a dep bump or IDE code change that breaks the bundle or the types would otherwise
|
|
@@ -592,7 +613,14 @@ jobs:
|
|
|
592
613
|
# install-service.ps1 -Environment threads it into the service command + resolves
|
|
593
614
|
# environments/prod.toml). INFO not DEBUG: `serve` refuses DEBUG in prod (Gate #1 — DEBUG can
|
|
594
615
|
# surface PHI); INFO is enough to smoke service start + MLLP.
|
|
595
|
-
|
|
616
|
+
# -LockConfigDir: the runner checks out samples/config with the default ACL, which grants
|
|
617
|
+
# BUILTIN\Users (S-1-5-32-545) write. The in-process config-source trust guard (SEC-003,
|
|
618
|
+
# wiring._assert_safe_config_source_windows) then REFUSES to load it ("writable-by-others
|
|
619
|
+
# path") and `serve` crash-loops to SERVICE_PAUSED, so /health never comes up. Locking the
|
|
620
|
+
# config dir (strip inheritance -> SYSTEM/Administrators only; the LocalSystem service still
|
|
621
|
+
# reads it) is the production-correct posture docs/SERVICE.md prescribes, and exercises the
|
|
622
|
+
# real -LockConfigDir install path rather than the MEFOR_ALLOW_INSECURE_CONFIG_SOURCE dev escape.
|
|
623
|
+
.\scripts\service\install-service.ps1 -AppExe $exe -LogLevel INFO -Environment prod -LockConfigDir
|
|
596
624
|
# The shipped samples graph includes a mutual-TLS WS-* SOAP feed (IB_IMMUNIZATION_VXU) whose
|
|
597
625
|
# connector LOADS its client cert at wiring time, so the engine refuses to start the graph
|
|
598
626
|
# without a readable cert+key. Mint a throwaway pair for the smoke — the smoke sends only an
|
|
@@ -6,6 +6,121 @@ 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
|
+
|
|
67
|
+
## [0.2.9] — 2026-06-27 — Early Access
|
|
68
|
+
|
|
69
|
+
A retention + security-hardening + observability release: per-connection retention and
|
|
70
|
+
embedded-document pruning windows, dual-control config reloads with startup code-attestation,
|
|
71
|
+
operational-health metrics, and a fix for the intermittent Windows listener-teardown / CI hang.
|
|
72
|
+
|
|
73
|
+
### Added
|
|
74
|
+
- **Per-connection retention windows (ADR 0027).** Optional `messages_days` (inbound) and
|
|
75
|
+
`dead_letter_days` (outbound) on a connection, layered over the global `[retention]` window and
|
|
76
|
+
authored on the connection spec or `connections.toml` (the same override idiom as the delivery
|
|
77
|
+
knobs): `None` inherits the global window, `0` keeps forever. The `RetentionRunner` threads a
|
|
78
|
+
per-connection cutoff through the body and dead-letter purge on **all three** store backends; the
|
|
79
|
+
never-purge-an-in-flight-body guard and the single per-pass audit row (now recording the overrides)
|
|
80
|
+
are unchanged. (#34)
|
|
81
|
+
- **Embedded-document pruning (ADR 0042).** Optional `prune_documents_after` (+ a size threshold)
|
|
82
|
+
per inbound connection: after the window, bulky **base64 embedded documents** — HL7 **OBX-5 ED**
|
|
83
|
+
and the generic `mfb64:v1:` carriage — are stripped **in place** to a small size/content-type
|
|
84
|
+
tombstone (via the parsed model / codec, **never** string-slicing HL7), keeping the rest of the
|
|
85
|
+
message parseable; the row is never deleted and a `documents_pruned` flag is set. All three
|
|
86
|
+
backends. (The ingest-time offload variant remains deferred.) (#47)
|
|
87
|
+
- **Dual-control `config:reload` (ADR 0041 D2).** `config_reload` is now a gateable
|
|
88
|
+
`[approvals].operations` op — a **distinct** second approver must release a live config reload
|
|
89
|
+
(the requester can never self-approve; both identities land in the hash-chained audit). Opt-in /
|
|
90
|
+
deny-by-default, so single-operator deployments are unchanged. (#53)
|
|
91
|
+
- **Startup code self-attestation (ADR 0041 D3).** At startup the engine hashes its loaded modules
|
|
92
|
+
against the wheel's `dist-info/RECORD`; on drift it records a hash-chained, off-box-teed
|
|
93
|
+
`startup_integrity` audit row and raises an alert (**alert-only by default**; opt-in
|
|
94
|
+
`[integrity].fail_closed_on_drift` refuses to start). A no-op on an editable (`pip install -e .`)
|
|
95
|
+
install, so development is never bricked. (#54)
|
|
96
|
+
- **Operational-health metrics.** `GET /status` now meters the app-log directory's disk usage
|
|
97
|
+
alongside the database, and a per-connection **message-stall** alert rule fires when a connection's
|
|
98
|
+
oldest-undelivered age crosses a configurable threshold. (#50)
|
|
99
|
+
|
|
100
|
+
### Changed
|
|
101
|
+
- **Non-editable, hash-locked wheel is the enforced production default (ADR 0017 amendment).** The
|
|
102
|
+
prior recommendation is now the default for production deployments; editable installs remain a
|
|
103
|
+
no-op for development. (#54)
|
|
104
|
+
|
|
105
|
+
### Fixed
|
|
106
|
+
- **Intermittent Windows listener-teardown hang.** `MLLPSource` / `TcpSource` / `X12Source` no longer
|
|
107
|
+
`await server.wait_closed()` / `writer.wait_closed()` **unbounded** on the Windows Proactor loop
|
|
108
|
+
during teardown — a wait that never completes can no longer stall a shared event loop (the same
|
|
109
|
+
class as the resolved py3.11 hang). Added CI guards (a per-test `faulthandler` stack dump and a
|
|
110
|
+
step-level watchdog) so a future hang fails fast and names itself instead of silently timing out. (#55)
|
|
111
|
+
|
|
112
|
+
### Docs
|
|
113
|
+
- Refreshed `benchmarks/TUNING-BASELINE.md` with measured multi-process sharding throughput from the
|
|
114
|
+
Windows Server 2025 box (η ≈ 0.85 speedup shape; per-shard E_core ≈ 42 msg/s — a test-box SQLite
|
|
115
|
+
floor), plus the still-unmeasured hardware-gated follow-ups (enterprise E_core, the shared-DB
|
|
116
|
+
commit-wall sweep). (#28, #29)
|
|
117
|
+
- Authored **ADR 0027** (per-connection retention) and **ADR 0042** (embedded-document pruning); added
|
|
118
|
+
EARS acceptance criteria to **ADR 0041** D2/D3; amended **ADR 0017** for the enforced wheel.
|
|
119
|
+
|
|
120
|
+
### CI
|
|
121
|
+
- Locked the smoke job's config directory (#603) and skipped a mirror-only Dependabot guardrail test
|
|
122
|
+
on the OSS mirror (#606), greening `main` CI post-0.2.8.
|
|
123
|
+
|
|
9
124
|
## [0.2.8] — 2026-06-27 — Early Access
|
|
10
125
|
|
|
11
126
|
A tooling/ops release: the load harness gains a **multi-shard driver** so one harness can drive a
|
|
@@ -339,7 +454,9 @@ tests, but the external code review + penetration test (the bar for a security-c
|
|
|
339
454
|
- Releases are built, SBOM'd (CycloneDX), and signed with [Sigstore](https://www.sigstore.dev/) — see the
|
|
340
455
|
`release` workflow.
|
|
341
456
|
|
|
342
|
-
[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
|
|
343
460
|
[0.2.8]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.7...v0.2.8
|
|
344
461
|
[0.2.7]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.6...v0.2.7
|
|
345
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**
|