messagefoundry 0.2.2__tar.gz → 0.2.3__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.2 → messagefoundry-0.2.3}/.gitignore +6 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/CHANGELOG.md +33 -1
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/PKG-INFO +41 -67
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/README.md +40 -66
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/BACKLOG.md +82 -0
- messagefoundry-0.2.3/docs/CODESETS.md +109 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CONFIGURATION.md +28 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CONNECTIONS.md +10 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/USER-GUIDE.md +45 -2
- messagefoundry-0.2.3/docs/adr/0033-gui-manageable-code-sets.md +212 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/README.md +1 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/package.json +68 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/cli.ts +50 -0
- messagefoundry-0.2.3/ide/src/codeSetEditor.ts +459 -0
- messagefoundry-0.2.3/ide/src/codesetsTree.ts +109 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/extension.ts +82 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/test/suite/extension.test.ts +16 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/__init__.py +1 -1
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/__main__.py +101 -1
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/app.py +55 -1
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/models.py +16 -0
- messagefoundry-0.2.3/messagefoundry/config/codeset_edit.py +488 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/connections_file.py +16 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/settings.py +39 -5
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/wiring.py +222 -14
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/client.py +13 -0
- messagefoundry-0.2.3/messagefoundry/console/event_log_page.py +143 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/shell.py +5 -1
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/alert_sinks.py +5 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/alerts.py +11 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/engine.py +31 -1
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/retention.py +20 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/wiring_runner.py +330 -14
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/base.py +78 -1
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/postgres.py +171 -1
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/sqlserver.py +183 -9
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/store.py +211 -5
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/base.py +15 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/mllp.py +47 -2
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/tcp.py +36 -2
- messagefoundry-0.2.3/tests/test_ack_capture_runner.py +101 -0
- messagefoundry-0.2.3/tests/test_ack_sent_store.py +150 -0
- messagefoundry-0.2.3/tests/test_codeset_edit.py +641 -0
- messagefoundry-0.2.3/tests/test_connection_event_api.py +83 -0
- messagefoundry-0.2.3/tests/test_connection_event_emit.py +212 -0
- messagefoundry-0.2.3/tests/test_connection_event_outbound.py +100 -0
- messagefoundry-0.2.3/tests/test_connection_event_store.py +208 -0
- messagefoundry-0.2.3/tests/test_console_event_log.py +141 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_widgets.py +4 -2
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_startup_fault_isolation.py +60 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_wiring.py +143 -1
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_wiring_engine.py +4 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.claude/settings.json +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.dockerignore +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.gitattributes +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/CODEOWNERS +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/SECURITY.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/dependabot.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/benchmark.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/ci.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/cla.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/dependabot-auto-merge.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/dependabot-lock-resync.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/release-sync-check.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/release.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/security.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.github/workflows/vuln-metrics.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.gitleaks.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.pre-commit-config.yaml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/.semgrep/messagefoundry.yml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/CLA.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/CLAUDE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/CODE_OF_CONDUCT.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/COMMERCIAL-LICENSE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/CONTRIBUTING.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/GOVERNANCE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/LICENSE +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/MAINTAINERS.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/NOTICE +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/Dockerfile +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/README.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/compose.yaml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/k8s/secret.example.yaml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/k8s/statefulset.yaml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/locks/requirements-core.lock +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/locks/requirements-sqlserver.lock +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/secrets.env.example +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/smoke/Dockerfile +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/smoke/config/IB_Test_ADT.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docker/smoke/send_adt.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/ADOPTER-CI.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/AI.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/ARCHITECTURE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CI-QUALITY.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CLUSTERING.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CONTAINER-EXPOSURE-EVALUATION.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/DEPLOY-SERVER-DB.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/DEPLOYMENT.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/DICOM.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/DUAL_LICENSING_PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/FEATURE-MAP.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/HL7-VALIDATION.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/INSTALL-GUIDE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/LOAD-TESTING.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/MENTAL-MODEL.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/MessageFoundry-Mental-Model.docx +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/PHI.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/REMOTE-CONSOLE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/SECURITY.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/SERVICE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/SUPPORT-POLICY.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/SYSTEM-REQUIREMENTS.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/Secure_AI_Development_Standards.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/Secure_Development_Standards.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/TEE-RELAY.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/THROUGHPUT-IMPROVEMENTS.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/WORKTREES.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0001-staged-pipeline-architecture.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0005-transform-accessible-state.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0006-external-data-lookups.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0008-cluster-observability-api.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0009-run-scoped-context-providers.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0011-timer-scheduled-source.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0012-x12-edi-codec.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0013-increment-2-reingress-design.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0013-query-response-orchestration.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0014-alerting-rules-engine.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0017-consumer-deployment-model.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0026-off-box-egress-update-check.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/0032-console-desktop-launch.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/adr/TEMPLATE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-components.png +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-components.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-config-graph.png +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-config-graph.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-diagram.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-message-flow.png +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-message-flow.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-topology.png +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/architecture-topology.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/TUNING-BASELINE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/benchmarks/step-b-write-amplification.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/hl7-message-ordering-reference.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/message-ordering-design.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/v0.1-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/research/cloud-deployment-research-2026-06.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/research/config-ux-review.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/research/non-hl7-transform-components.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ADVISORY-PROCESS.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/ASVS-L3-STATUS.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/BEYOND-ASVS-L3.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/DEPENDENCY-METRICS.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/PHASE-8C-RBAC.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/PUBLISHING.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/RCA-TEMPLATE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/RELEASE-GATE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/REVIEW-2026-06-07.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SECURITY-POSTURE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/security/THREAT-MODEL.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/testing/VERIFY.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/environments/dev.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/environments/prod.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/README.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/__main__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/__main__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/matrix.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/probes.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/report.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/acceptance/runner.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/compose.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/config/coverage.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/config/load/_shape.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/config/load/graph.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/file_panel.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/file_transport.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/corpus.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/correlator.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/enginepoll.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/failover.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/failover_track.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/governor.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/ids.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/metrics.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profile.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/README.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/closed-loop.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/failover.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/fanout-baseline.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/malformed-load.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/reference.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/smoke-sqlserver.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/smoke.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/soak.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/spike-burst.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/sustained-overload.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/profiles/writeamp.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/report.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/runner.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/sender.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/load/sink.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/mllp.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/monitor.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/receive.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/__main__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/capture.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/compare.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/normalize.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/reconcile/report.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/scenarios.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/send.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/harness/window.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/.gitignore +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/.vscodeignore +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/README.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/esbuild.js +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/media/hl7schema.json +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/media/icon.png +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/media/icon.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/package-lock.json +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/snippets/messagefoundry.code-snippets +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/aiPolicy.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/alertEditor.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/auth.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/chat.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/completion.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/connectionEditor.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/engineClient.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/generate.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/git.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/graphTree.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/home.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/newRoute.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/promote.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/sourceControl.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/test/runTest.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/test/suite/chat.test.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/test/suite/index.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/testBench.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/src/validate.ts +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/tsconfig.json +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/ide/tsconfig.test.json +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/mefor.code-workspace +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/adr_analyze.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/_pools.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/hl7.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/keying.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/leak.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/rules.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/anon/surrogates.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/approvals.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/auth_models.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/auth_routes.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/field_authz.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/metrics.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/security.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/api/tls.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/data/common_passwords.txt +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/identity.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/ldap.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/notifications.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/passwords.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/permissions.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/policy.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/ratelimit.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/service.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/tokens.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/auth/totp.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/checks.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/active_environment.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/ai_policy.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/alerts_edit.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/code_sets.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/connections_edit.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/db_lookup.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/environments.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/ingest_time.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/models.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/reference.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/response.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/run_context.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/state.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/config/tls_policy.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/__main__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/_async.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/alerts_page.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/change_password.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/connections.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/dead_letters_page.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/delegates.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/alerts.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/connections.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/dead-letters.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/engine-status.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/log-search.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/logo-lockup.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/icons/users.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/login.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/mfa.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/reauth.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/resources/README.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/resources/app.ico +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/resources/app.svg +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/search.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/service_control.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/sessions.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/status.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/theme.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/users_page.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/console/widgets.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/README.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/_core.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/_hl7data.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/adt.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/all_types.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/bar.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/dft.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/documents.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/mdm.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/mfn.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/oml.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/orl.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/orm.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/oru.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/ras.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/rde.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/siu.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/generators/vxu.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/hl7schema.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/last_resort.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/logging_setup.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/binary.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/consistency.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/_deps.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/_util.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/dataset.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/errors.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/dicom/peek.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/fhir/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/fhir/_deps.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/fhir/errors.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/fhir/peek.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/fhir/resource.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/groups.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/message.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/peek.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/split.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/summary.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/tree.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/validate.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/delimiters.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/errors.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/interchange.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/message.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/parsing/x12/peek.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/cert_expiry.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/cluster.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/config_convergence.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/dryrun.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/leader_tasks.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/reference_sync.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/security_notify.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/pipeline/state_convergence.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/py.typed +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/redaction.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/scaffold.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/secrets_dpapi.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/audit_tee.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/crypto.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/store/keyprovider.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/timezone.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/database.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/dicom.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/dicomweb.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/fhir.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/file.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/framing.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/loopback.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/remotefile.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/rest.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/signing.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/smart.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/soap.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/timer.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/transports/x12.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/checks.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/model.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/report.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/runner.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/messagefoundry/verify/smoke.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/pyproject.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/requirements.lock +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_ACME_ADT.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_FHIR_INTAKE.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_PARTNER_X12.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_RADIOLOGY_SR.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/adt.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/codesets/event_labels.csv +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/codesets/facility_mnemonics.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/config/connections.toml +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/consistency/validated_adt.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/dicom/generate_sr_sample.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/adt_a01.hl7 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/adt_batch.hl7 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/README.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/messages/x12_270_eligibility.edi +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/results_relay/README.md +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/results_relay/codesets/test_codes.csv +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/results_relay/messages/oru_results.hl7 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/results_relay/results_relay.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/samples/send_mllp.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/console/install-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/console/pack_ico.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/dev/postgres.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/dev/sqlserver-docker.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/dev/sqlserver.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/publish/check_release_sync.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/publish/publish-denylist.txt +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/publish/publish.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/publish/scan_forbidden.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/security/crypto_inventory_check.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/security/vuln_metrics.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/service/import-db-ca.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/service/install-service.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/service/uninstall-service.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/trace_icon.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/worktree/new.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/worktree/remove.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/worktree/session-context.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/scripts/worktree/spawn.ps1 +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/__main__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/__init__.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/_hl7data.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/_pools.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/hl7.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/keying.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/leak.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/rules.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/anon/surrogates.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/compare.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/correlate.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/hl7_fields.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/mefor_api.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/mllp.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/relay.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/report.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tee/store.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/_dicom_sample.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/_failover_load_support.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/_fhir_fixtures.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/conftest.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_acceptance_framework.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_active_environment.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_ad_group_scope.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_admin_new_ip.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_adr_analyze.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_ai_policy.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_alert_rules.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_alert_sinks.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_alerts_edit.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_alerts_rules_api.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_anon_core.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_anon_integration.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_anon_parity.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_api.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_api_auth.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_api_reload.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_api_tls.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_approvals.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_asvs_phase0.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_audit_integrity.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_audit_offbox_tee.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_core.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_entry_hardening.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_hardening.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_service.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_session_lifecycle.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_auth_store.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_binary_carriage.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cert_expiry.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_channel_rbac.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_checks.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cli.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cluster.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cluster_failover_postgres.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cluster_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cluster_graph_gating.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_cluster_lease.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_code_sets.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_connection_api.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_connection_resilience.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_connections_cli.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_connections_file.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_consistency.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_alerts.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_auth.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_client.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_dead_letters.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_hardening.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_icon.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_password.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_sessions.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_status.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_step_up.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_theme.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_console_users.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_database_connector_integration.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_database_transport.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_db_lookup.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_db_lookup_live_runner.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_delivery_settings.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dependency_boundaries.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dicom_codec.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dicom_scp.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dicom_scu.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dicom_wiring.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dicomweb.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_docs_runbooks.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_dryrun.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_ed_documents.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_ed_documents_e2e.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_egress_allowlist.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_environments.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_fhir_parsing.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_fhir_resource.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_fhir_transport.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_field_authz.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_fifo_ordering.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_generate_cli.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_generated_adt.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_generators_core.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_generators_types.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_groups.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_compose.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_config.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_faults.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_file.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_monitor.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_harness_scenarios.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_hl7_core_features.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_hl7schema.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_inbound_bind.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_ingest_time.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_keyprovider.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_last_resort.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_leader_tasks.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_config.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_corpus.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_failover_postgres.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_failover_unit.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_metrics.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_profile.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_report.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_runner.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_sender.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_load_sink.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_logging.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_message.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_message_split.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_metrics_exporter.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_mfa.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_mllp_encoding_override.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_mllp_tls.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_operability_config.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_outbound_signing.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_outbound_simulate.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_packaging.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_parse_tree.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_parsing.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_payload_agnostic_ingress.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_postgres_store.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_reconcile_capture.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_reconcile_compare.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_reconcile_harness.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_redaction.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_reference_sets.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_reingress.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_remotefile_transport.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_response_capture.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_rest_transport.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_retention.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_run_context.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_scaffold.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_scan_forbidden.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_secrets_dpapi.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_security_notify.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_security_static.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_service_control.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_settings.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_smart_backend.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_soap_transport.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_soap_wssecurity.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_sqlserver_coordinator.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_sqlserver_store.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_staged_pipeline.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_stats_reset.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_step_up.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store_backend.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store_encryption.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store_file_hardening.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store_read_pool.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_store_ssl.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_summary.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_task_resilience.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tcp_transport.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_cli.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_compare.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_correlate.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_hl7_fields.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_mefor_api.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_mllp.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_relay.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_report.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tee_store.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_timer_source.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_timezone.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_tls_policy.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_totp.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_transform_state.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_transports.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_verify.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_version.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_win2025_acceptance.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_wiring_reload.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_wiring_serve.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_x12_parsing.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_x12_rte.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/tests/test_x12_transport.py +0 -0
- {messagefoundry-0.2.2 → messagefoundry-0.2.3}/uv.lock +0 -0
|
@@ -74,3 +74,9 @@ TRANSCRIPTS.md
|
|
|
74
74
|
/docs/security/DEPENDENCY-RESPONSE-A4-HANDOFF.md
|
|
75
75
|
# vuln_metrics.py local CSV output (the CI run uploads it as an artifact; not committed)
|
|
76
76
|
/docs/security/metrics/
|
|
77
|
+
|
|
78
|
+
# Operator-local load/throughput profiles — tuned to a specific deployment's volume; kept OUT of the
|
|
79
|
+
# OSS repo + public mirror (the plan itself lives on the operator share, WIN2025-LOAD-THROUGHPUT-MATRIX.md).
|
|
80
|
+
# Still usable by name (they sit in PROFILES_DIR) and copy-on to the test box.
|
|
81
|
+
/harness/load/profiles/hospital-baseline.toml
|
|
82
|
+
/harness/load/profiles/soak-12h.toml
|
|
@@ -6,6 +6,36 @@ All notable changes to MessageFoundry are documented here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.2.3] — 2026-06-26 — Early Access
|
|
10
|
+
|
|
11
|
+
A bug-fix + feature release: the SQL Server store no longer raises "connection busy" errors under
|
|
12
|
+
concurrent load, plus connection/transport event logging, GUI-managed translation tables, and inbound
|
|
13
|
+
listener port-conflict detection.
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- **SQL Server: "Connection is busy with results for another command" under concurrent load (EF-6).**
|
|
17
|
+
`claim_next_fifo` — and three sibling sites (`_maybe_finalize`, `consume_recovery_code_hash`,
|
|
18
|
+
`consume_totp_step`) — read a result-set-returning statement with a lone `fetchone()` and could return
|
|
19
|
+
the pooled connection to the pool with the result set still pending, so the next borrower's first
|
|
20
|
+
command raced an `HY000` busy error (ODBC Driver 18, no MARS). All affected sites now fully drain the
|
|
21
|
+
result set (`fetchall`) before commit/release. SQLite and PostgreSQL were unaffected (asyncpg
|
|
22
|
+
materializes rows; SQLite has no shared pooled-connection single-result-set constraint). (#543)
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
- **Connection/transport event log + "Response Sent" ACK capture** (ADR 0020 / ADR 0021). A new id-keyed,
|
|
26
|
+
metadata-only `connection_event` table records inbound connection lifecycle, pre-ingress failures, and
|
|
27
|
+
outbound lane transitions, with a `[diagnostics]` config block (per-connection overrides + retention),
|
|
28
|
+
a `GET /events` read API, and a console **Event Log** page. Event reasons are scrubbed and encrypted at
|
|
29
|
+
rest. (#541)
|
|
30
|
+
- **GUI-managed translation tables (code sets)** (ADR 0033). A code-set CLI + writer and a VS Code
|
|
31
|
+
extension grid editor / **Translation Tables** view for maintaining code-set mappings. (#540)
|
|
32
|
+
- **Inbound listener port-conflict detection** — static + runtime checks that flag two inbound
|
|
33
|
+
connections bound to the same host:port before they collide at startup. (#538)
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
- Docs: README install instructions are now version-agnostic and link the website docs; the roadmap
|
|
37
|
+
section is replaced with a features summary. (#542, #544)
|
|
38
|
+
|
|
9
39
|
## [0.2.2] — 2026-06-24 — Early Access
|
|
10
40
|
|
|
11
41
|
A security-hardening release: PHI-at-rest encryption is closed across every backend, the active-passive
|
|
@@ -141,7 +171,9 @@ tests, but the external code review + penetration test (the bar for a security-c
|
|
|
141
171
|
- Releases are built, SBOM'd (CycloneDX), and signed with [Sigstore](https://www.sigstore.dev/) — see the
|
|
142
172
|
`release` workflow.
|
|
143
173
|
|
|
144
|
-
[Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.
|
|
174
|
+
[Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.3...HEAD
|
|
175
|
+
[0.2.3]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.2...v0.2.3
|
|
176
|
+
[0.2.2]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.1...v0.2.2
|
|
145
177
|
[0.2.1]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.0...v0.2.1
|
|
146
178
|
[0.2.0]: https://github.com/wshallwshall/MessageFoundry/compare/v0.1.0...v0.2.0
|
|
147
179
|
[0.1.0]: https://github.com/wshallwshall/MessageFoundry/releases/tag/v0.1.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: messagefoundry
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: Open-source healthcare integration engine — route, transform, and validate messages across many formats and connection types
|
|
5
5
|
License-Expression: AGPL-3.0-or-later
|
|
6
6
|
License-File: LICENSE
|
|
@@ -102,62 +102,34 @@ renders on GitHub and in the VS Code preview). The prose source of truth is
|
|
|
102
102
|
and **transport TLS** (HTTPS/WSS for the API plus MLLP-over-TLS) are **built**; MFA and off-box log
|
|
103
103
|
shipping remain on the roadmap. See [docs/PHI.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/PHI.md) for the full data-protection map.
|
|
104
104
|
|
|
105
|
-
##
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
-
|
|
111
|
-
|
|
112
|
-
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
**
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
- [
|
|
126
|
-
|
|
127
|
-
- [
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
failover-load test harness (kill-the-primary-under-load), on **both** PostgreSQL and SQL Server
|
|
134
|
-
- [x] **Native transport TLS** — in-process API TLS (HTTPS/WSS) and MLLP-over-TLS, with an off-loopback
|
|
135
|
-
bind guard and a certificate-expiry monitor
|
|
136
|
-
- [x] Published throughput + active-passive failover **baseline** ([docs/benchmarks/TUNING-BASELINE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/benchmarks/TUNING-BASELINE.md))
|
|
137
|
-
- [x] **SMART Backend Services token provider** — OAuth2 `client_credentials` + signed-JWT
|
|
138
|
-
`client_assertion` (RS384/ES384) authenticating the FHIR/REST outbound against real SMART-secured
|
|
139
|
-
servers (Epic, Oracle Health); a `with_smart_backend()` composer over `FHIR()`/`Rest()` that mints,
|
|
140
|
-
caches, and re-mints (on 401) a short-lived bearer, token endpoint gated by `[egress].allowed_http`
|
|
141
|
-
([ADR 0024](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0024-smart-backend-services-token-provider.md))
|
|
142
|
-
- [x] **base64 binary-carriage codec** — an `mfb64:v1:` marker carries arbitrary NUL-safe **bytes** over
|
|
143
|
-
the str/TEXT ingress + store (`RawMessage.from_bytes()`/`.raw_bytes`/`.binary()`/`.is_binary`), plus
|
|
144
|
-
HL7 OBX-5 ED (Encapsulated Data) embedding helpers ([ADR 0028](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0028-base64-binary-carriage-codec.md))
|
|
145
|
-
- [x] **DICOM codec + C-STORE SCP** (Phase 1) — a pure codec (routing peek, headers/Structured Report,
|
|
146
|
-
code-first SR→HL7 mapping helpers; **headers + SR only, no pixel data**) on `content_type=dicom`
|
|
147
|
-
payload-agnostic ingress, plus an inbound C-STORE SCP listener (`DICOM()`) ([ADR 0025](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0025-dicom-codec-store-connectors.md))
|
|
148
|
-
- [x] **Anonymizer / de-identification** — builds PHI-free test datasets from real traffic with
|
|
149
|
-
deterministic secret-per-dataset pseudonymization, field-anchored site-code scrub, and fail-closed
|
|
150
|
-
emission (never an un-scrubbed body), via a `tee anonymize-captures` subcommand and test-harness
|
|
151
|
-
hooks ([ADR 0030](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0030-anonymization-test-harness-tee.md))
|
|
152
|
-
|
|
153
|
-
**Later** — higher-throughput delivery (a pooled/persistent MLLP connector); a read-only **component
|
|
154
|
-
SDK** (fork-to-customize); DICOM Phase 2 (C-STORE SCU + C-ECHO + DICOMweb STOW-RS, designed); MFA and
|
|
155
|
-
off-box log shipping. See [docs/EARLY-ADOPTER-GUIDE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/EARLY-ADOPTER-GUIDE.md) §2 for the current
|
|
156
|
-
built-vs-experimental map.
|
|
157
|
-
|
|
158
|
-
Horizontal **active-active** scale-out (the multi-node cluster path) was **dropped on 2026-06-18 and
|
|
159
|
-
its code removed** — it is not a planned milestone; single-leader **active-passive** HA (above) is the
|
|
160
|
-
supported HA model.
|
|
105
|
+
## Features
|
|
106
|
+
|
|
107
|
+
MessageFoundry ships a reliable, PHI-aware engine today: the Connection/Router/Handler graph
|
|
108
|
+
over a durable staged pipeline (at-least-once delivery, retries, dead-letter, replay), backed by
|
|
109
|
+
SQLite, PostgreSQL, or SQL Server. It speaks MLLP (plain and over TLS), file/SFTP, REST, SOAP,
|
|
110
|
+
FHIR, database, and DICOM (C-STORE SCP), parses HL7 v2 tolerantly (with opt-in strict validation)
|
|
111
|
+
and carries other formats payload-agnostically (JSON, XML/SOAP, X12, binary). Security is
|
|
112
|
+
first-class — authentication, RBAC, a user-attributed audit log, at-rest body encryption, and
|
|
113
|
+
transport TLS — and it runs single-node or in active-passive high availability.
|
|
114
|
+
|
|
115
|
+
**See the full, up-to-date feature breakdown — built vs. planned — at
|
|
116
|
+
[messagefoundry.org/features-table.html](https://messagefoundry.org/features-table.html).**
|
|
117
|
+
|
|
118
|
+
## Documentation
|
|
119
|
+
|
|
120
|
+
Full documentation lives on **[messagefoundry.org](https://messagefoundry.org/)**:
|
|
121
|
+
|
|
122
|
+
- **[Mental map](https://messagefoundry.org/assets/docs/MessageFoundry-Mental-Model.pdf)** — a one-page
|
|
123
|
+
picture of how the pieces fit: Connections → Router → Handlers → Connections, with the headless
|
|
124
|
+
engine and the console/IDE that drive it.
|
|
125
|
+
- **[Install Guide](https://messagefoundry.org/assets/docs/MessageFoundry-Install-Guide.pdf)** — install,
|
|
126
|
+
configure, secure, and roll out to production.
|
|
127
|
+
- **[User Guide](https://messagefoundry.org/assets/docs/MessageFoundry-User-Guide.pdf)** — author and
|
|
128
|
+
operate interfaces day to day.
|
|
129
|
+
|
|
130
|
+
**Get started:** [Quickstart](https://messagefoundry.org/getting-started.html) ·
|
|
131
|
+
[Guides](https://messagefoundry.org/guides/) ·
|
|
132
|
+
[Documents](https://messagefoundry.org/documents.html)
|
|
161
133
|
|
|
162
134
|
## Installing & rolling out
|
|
163
135
|
|
|
@@ -167,21 +139,23 @@ supported production artifact, with no source checkout required. Install it as a
|
|
|
167
139
|
dependency**, then scaffold your own config repo ([ADR 0017](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0017-consumer-deployment-model.md)):
|
|
168
140
|
|
|
169
141
|
```bash
|
|
170
|
-
pip install "messagefoundry
|
|
171
|
-
messagefoundry init ./my-config-repo
|
|
142
|
+
pip install "messagefoundry==<version>" # pin the exact engine version (core runtime, SQLite store)
|
|
143
|
+
messagefoundry init ./my-config-repo # scaffold a standalone config repo
|
|
172
144
|
cd ./my-config-repo
|
|
173
145
|
messagefoundry serve --config config --env dev
|
|
174
146
|
```
|
|
175
147
|
|
|
176
|
-
|
|
177
|
-
|
|
148
|
+
MessageFoundry is in **Early Access**. Always **pin the exact version** so upgrades stay
|
|
149
|
+
deliberate — replace `<version>` with the current release shown at the top of the
|
|
150
|
+
[PyPI project page](https://pypi.org/project/messagefoundry/). Add the extras your deployment
|
|
151
|
+
needs (each is opt-in and lazy-imported):
|
|
178
152
|
|
|
179
153
|
```bash
|
|
180
|
-
pip install "messagefoundry[postgres]
|
|
181
|
-
pip install "messagefoundry[sqlserver]
|
|
182
|
-
pip install "messagefoundry[console]
|
|
183
|
-
pip install "messagefoundry[sftp]
|
|
184
|
-
pip install "messagefoundry[dicom]
|
|
154
|
+
pip install "messagefoundry[postgres]==<version>" # PostgreSQL store backend (production server DB)
|
|
155
|
+
pip install "messagefoundry[sqlserver]==<version>" # SQL Server store backend (+ OS-level ODBC Driver 18)
|
|
156
|
+
pip install "messagefoundry[console]==<version>" # PySide6 admin console
|
|
157
|
+
pip install "messagefoundry[sftp]==<version>" # SFTP transport for the REMOTEFILE connector
|
|
158
|
+
pip install "messagefoundry[dicom]==<version>" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
|
|
185
159
|
```
|
|
186
160
|
|
|
187
161
|
> **Verify before you install (supply chain).** Every release is built by a GitHub Actions workflow,
|
|
@@ -193,7 +167,7 @@ pip install "messagefoundry[dicom]==0.2.1" # DICOM codec + C-STORE SCP (py
|
|
|
193
167
|
>
|
|
194
168
|
> *(Engine developers install from a checkout instead — see [Development](#development).)*
|
|
195
169
|
|
|
196
|
-
Piloting MessageFoundry? The **[
|
|
170
|
+
Piloting MessageFoundry? The **[Install Guide](https://messagefoundry.org/assets/docs/MessageFoundry-Install-Guide.pdf)**
|
|
197
171
|
takes you from first install through a staged, go/no-go-gated path to full production
|
|
198
172
|
(Lab → Shadow/Parallel → Limited → Full). It leads with an honest built-vs-experimental
|
|
199
173
|
maturity map and covers prerequisites, install, security/PHI hardening, reliability
|
|
@@ -49,62 +49,34 @@ renders on GitHub and in the VS Code preview). The prose source of truth is
|
|
|
49
49
|
and **transport TLS** (HTTPS/WSS for the API plus MLLP-over-TLS) are **built**; MFA and off-box log
|
|
50
50
|
shipping remain on the roadmap. See [docs/PHI.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/PHI.md) for the full data-protection map.
|
|
51
51
|
|
|
52
|
-
##
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
**
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
- [
|
|
73
|
-
|
|
74
|
-
- [
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
failover-load test harness (kill-the-primary-under-load), on **both** PostgreSQL and SQL Server
|
|
81
|
-
- [x] **Native transport TLS** — in-process API TLS (HTTPS/WSS) and MLLP-over-TLS, with an off-loopback
|
|
82
|
-
bind guard and a certificate-expiry monitor
|
|
83
|
-
- [x] Published throughput + active-passive failover **baseline** ([docs/benchmarks/TUNING-BASELINE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/benchmarks/TUNING-BASELINE.md))
|
|
84
|
-
- [x] **SMART Backend Services token provider** — OAuth2 `client_credentials` + signed-JWT
|
|
85
|
-
`client_assertion` (RS384/ES384) authenticating the FHIR/REST outbound against real SMART-secured
|
|
86
|
-
servers (Epic, Oracle Health); a `with_smart_backend()` composer over `FHIR()`/`Rest()` that mints,
|
|
87
|
-
caches, and re-mints (on 401) a short-lived bearer, token endpoint gated by `[egress].allowed_http`
|
|
88
|
-
([ADR 0024](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0024-smart-backend-services-token-provider.md))
|
|
89
|
-
- [x] **base64 binary-carriage codec** — an `mfb64:v1:` marker carries arbitrary NUL-safe **bytes** over
|
|
90
|
-
the str/TEXT ingress + store (`RawMessage.from_bytes()`/`.raw_bytes`/`.binary()`/`.is_binary`), plus
|
|
91
|
-
HL7 OBX-5 ED (Encapsulated Data) embedding helpers ([ADR 0028](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0028-base64-binary-carriage-codec.md))
|
|
92
|
-
- [x] **DICOM codec + C-STORE SCP** (Phase 1) — a pure codec (routing peek, headers/Structured Report,
|
|
93
|
-
code-first SR→HL7 mapping helpers; **headers + SR only, no pixel data**) on `content_type=dicom`
|
|
94
|
-
payload-agnostic ingress, plus an inbound C-STORE SCP listener (`DICOM()`) ([ADR 0025](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0025-dicom-codec-store-connectors.md))
|
|
95
|
-
- [x] **Anonymizer / de-identification** — builds PHI-free test datasets from real traffic with
|
|
96
|
-
deterministic secret-per-dataset pseudonymization, field-anchored site-code scrub, and fail-closed
|
|
97
|
-
emission (never an un-scrubbed body), via a `tee anonymize-captures` subcommand and test-harness
|
|
98
|
-
hooks ([ADR 0030](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0030-anonymization-test-harness-tee.md))
|
|
99
|
-
|
|
100
|
-
**Later** — higher-throughput delivery (a pooled/persistent MLLP connector); a read-only **component
|
|
101
|
-
SDK** (fork-to-customize); DICOM Phase 2 (C-STORE SCU + C-ECHO + DICOMweb STOW-RS, designed); MFA and
|
|
102
|
-
off-box log shipping. See [docs/EARLY-ADOPTER-GUIDE.md](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/EARLY-ADOPTER-GUIDE.md) §2 for the current
|
|
103
|
-
built-vs-experimental map.
|
|
104
|
-
|
|
105
|
-
Horizontal **active-active** scale-out (the multi-node cluster path) was **dropped on 2026-06-18 and
|
|
106
|
-
its code removed** — it is not a planned milestone; single-leader **active-passive** HA (above) is the
|
|
107
|
-
supported HA model.
|
|
52
|
+
## Features
|
|
53
|
+
|
|
54
|
+
MessageFoundry ships a reliable, PHI-aware engine today: the Connection/Router/Handler graph
|
|
55
|
+
over a durable staged pipeline (at-least-once delivery, retries, dead-letter, replay), backed by
|
|
56
|
+
SQLite, PostgreSQL, or SQL Server. It speaks MLLP (plain and over TLS), file/SFTP, REST, SOAP,
|
|
57
|
+
FHIR, database, and DICOM (C-STORE SCP), parses HL7 v2 tolerantly (with opt-in strict validation)
|
|
58
|
+
and carries other formats payload-agnostically (JSON, XML/SOAP, X12, binary). Security is
|
|
59
|
+
first-class — authentication, RBAC, a user-attributed audit log, at-rest body encryption, and
|
|
60
|
+
transport TLS — and it runs single-node or in active-passive high availability.
|
|
61
|
+
|
|
62
|
+
**See the full, up-to-date feature breakdown — built vs. planned — at
|
|
63
|
+
[messagefoundry.org/features-table.html](https://messagefoundry.org/features-table.html).**
|
|
64
|
+
|
|
65
|
+
## Documentation
|
|
66
|
+
|
|
67
|
+
Full documentation lives on **[messagefoundry.org](https://messagefoundry.org/)**:
|
|
68
|
+
|
|
69
|
+
- **[Mental map](https://messagefoundry.org/assets/docs/MessageFoundry-Mental-Model.pdf)** — a one-page
|
|
70
|
+
picture of how the pieces fit: Connections → Router → Handlers → Connections, with the headless
|
|
71
|
+
engine and the console/IDE that drive it.
|
|
72
|
+
- **[Install Guide](https://messagefoundry.org/assets/docs/MessageFoundry-Install-Guide.pdf)** — install,
|
|
73
|
+
configure, secure, and roll out to production.
|
|
74
|
+
- **[User Guide](https://messagefoundry.org/assets/docs/MessageFoundry-User-Guide.pdf)** — author and
|
|
75
|
+
operate interfaces day to day.
|
|
76
|
+
|
|
77
|
+
**Get started:** [Quickstart](https://messagefoundry.org/getting-started.html) ·
|
|
78
|
+
[Guides](https://messagefoundry.org/guides/) ·
|
|
79
|
+
[Documents](https://messagefoundry.org/documents.html)
|
|
108
80
|
|
|
109
81
|
## Installing & rolling out
|
|
110
82
|
|
|
@@ -114,21 +86,23 @@ supported production artifact, with no source checkout required. Install it as a
|
|
|
114
86
|
dependency**, then scaffold your own config repo ([ADR 0017](https://github.com/wshallwshall/MessageFoundry/blob/main/docs/adr/0017-consumer-deployment-model.md)):
|
|
115
87
|
|
|
116
88
|
```bash
|
|
117
|
-
pip install "messagefoundry
|
|
118
|
-
messagefoundry init ./my-config-repo
|
|
89
|
+
pip install "messagefoundry==<version>" # pin the exact engine version (core runtime, SQLite store)
|
|
90
|
+
messagefoundry init ./my-config-repo # scaffold a standalone config repo
|
|
119
91
|
cd ./my-config-repo
|
|
120
92
|
messagefoundry serve --config config --env dev
|
|
121
93
|
```
|
|
122
94
|
|
|
123
|
-
|
|
124
|
-
|
|
95
|
+
MessageFoundry is in **Early Access**. Always **pin the exact version** so upgrades stay
|
|
96
|
+
deliberate — replace `<version>` with the current release shown at the top of the
|
|
97
|
+
[PyPI project page](https://pypi.org/project/messagefoundry/). Add the extras your deployment
|
|
98
|
+
needs (each is opt-in and lazy-imported):
|
|
125
99
|
|
|
126
100
|
```bash
|
|
127
|
-
pip install "messagefoundry[postgres]
|
|
128
|
-
pip install "messagefoundry[sqlserver]
|
|
129
|
-
pip install "messagefoundry[console]
|
|
130
|
-
pip install "messagefoundry[sftp]
|
|
131
|
-
pip install "messagefoundry[dicom]
|
|
101
|
+
pip install "messagefoundry[postgres]==<version>" # PostgreSQL store backend (production server DB)
|
|
102
|
+
pip install "messagefoundry[sqlserver]==<version>" # SQL Server store backend (+ OS-level ODBC Driver 18)
|
|
103
|
+
pip install "messagefoundry[console]==<version>" # PySide6 admin console
|
|
104
|
+
pip install "messagefoundry[sftp]==<version>" # SFTP transport for the REMOTEFILE connector
|
|
105
|
+
pip install "messagefoundry[dicom]==<version>" # DICOM codec + C-STORE SCP (pydicom + pynetdicom)
|
|
132
106
|
```
|
|
133
107
|
|
|
134
108
|
> **Verify before you install (supply chain).** Every release is built by a GitHub Actions workflow,
|
|
@@ -140,7 +114,7 @@ pip install "messagefoundry[dicom]==0.2.1" # DICOM codec + C-STORE SCP (py
|
|
|
140
114
|
>
|
|
141
115
|
> *(Engine developers install from a checkout instead — see [Development](#development).)*
|
|
142
116
|
|
|
143
|
-
Piloting MessageFoundry? The **[
|
|
117
|
+
Piloting MessageFoundry? The **[Install Guide](https://messagefoundry.org/assets/docs/MessageFoundry-Install-Guide.pdf)**
|
|
144
118
|
takes you from first install through a staged, go/no-go-gated path to full production
|
|
145
119
|
(Lab → Shadow/Parallel → Limited → Full). It leads with an honest built-vs-experimental
|
|
146
120
|
maturity map and covers prerequisites, install, security/PHI hardening, reliability
|
|
@@ -931,6 +931,10 @@ console-view scope.
|
|
|
931
931
|
|
|
932
932
|
**Source:** Corepoint event-log gap analysis (2026-06-17); ADRs 0020 + 0021.
|
|
933
933
|
|
|
934
|
+
**See also #46** — the complementary *happy-path* connection-state lifecycle log (established / connecting /
|
|
935
|
+
retrying / lost). #16's retained scope is pre-message *failure* events + "Response Sent" ACK; #46 is the
|
|
936
|
+
routine Transport-event transitions. Build them together (one event log) if either is un-deferred.
|
|
937
|
+
|
|
934
938
|
---
|
|
935
939
|
|
|
936
940
|
## 17. CI: the `py3.11` test leg hangs (pytest deadlock) — OBSOLETE (py3.11/3.13 legs removed)
|
|
@@ -1255,6 +1259,14 @@ too. Fold the alert-rule view/test (ADR 0014 rules) into the Alerts page.
|
|
|
1255
1259
|
**Why P2:** no new engine work — purely the console surface. Matters for operator parity, but the
|
|
1256
1260
|
API/CLI already cover the underlying capability.
|
|
1257
1261
|
|
|
1262
|
+
> **#22c Event Log page (committed, from #46 — do NOT drop).** When the **#46** Corepoint-style event logging
|
|
1263
|
+
> lands engine-side ("logging like Corepoint", owner go 2026-06-25), it ships **engine capture first** with the
|
|
1264
|
+
> operator-facing **console Event Log page as a committed fast-follow, not optional.** A filterable PySide6 page
|
|
1265
|
+
> (by connection / direction / kind / time, Corepoint Transport/Diagnostic/Alert/Misc filter) over
|
|
1266
|
+
> `GET /events` + `GET /connections/{name}/events`, plus the Response-Sent ("ACK returned") view off
|
|
1267
|
+
> `GET /messages/{id}/responses?kind=ack_sent`. Replaces a `PlaceholderPage`, same pattern as #22a/#22b.
|
|
1268
|
+
> Tracked here so the GUI surface is built once the #46 engine API exists. See **#46**.
|
|
1269
|
+
|
|
1258
1270
|
**Source:** Mirth brochure gap analysis (2026-06-18); FEATURE-MAP §10.
|
|
1259
1271
|
|
|
1260
1272
|
---
|
|
@@ -2127,6 +2139,76 @@ avoid. Build when a private-CA adopter is blocked.
|
|
|
2127
2139
|
|
|
2128
2140
|
---
|
|
2129
2141
|
|
|
2142
|
+
## 46. Connection lifecycle event log — "established / lost / connecting / retrying" (Corepoint Transport-event parity)
|
|
2143
|
+
|
|
2144
|
+
> **✅ SCOPED FOR BUILD (owner go, 2026-06-25): "logging like Corepoint."** Build a unified, metadata-only
|
|
2145
|
+
> `connection_event` log capturing **inbound lifecycle** (established/closed) + the **ADR 0021 §7 failures**
|
|
2146
|
+
> (allowlist/capacity/oversize/peer-reset/framing) + **outbound lifecycle** (connection_lost/restored,
|
|
2147
|
+
> edge-triggered — no per-delivery spam), plus **Response Sent ACK/NAK** (ADR 0021 §§1-6, PHI, encrypted).
|
|
2148
|
+
> **ON by default** for the no-PHI connection events (master `[diagnostics].connection_events`). Engine
|
|
2149
|
+
> capture-first; the **console "Event Log" viewer is a committed fast-follow, NOT optional** — see
|
|
2150
|
+
> *Console deliverable* below. Raw protocol trace (ADR 0020) stays declined. Build increments + the two
|
|
2151
|
+
> confirm-items are in the 2026-06-25 plan.
|
|
2152
|
+
>
|
|
2153
|
+
> **Console deliverable (do NOT drop).** The point of "like Corepoint" is the *operator-facing* event log, so
|
|
2154
|
+
> the engine increments are not "done" until the **PySide6 console Event Log page** ships: a filterable view
|
|
2155
|
+
> (by connection / direction / kind / time) over `GET /events` + `GET /connections/{name}/events`, with the
|
|
2156
|
+
> Corepoint-style Transport / Diagnostic / Alert / Misc filter, plus the Response-Sent ("ACK returned") view
|
|
2157
|
+
> off `GET /messages/{id}/responses?kind=ack_sent`. This rides the **#22** console-page workstream (its natural
|
|
2158
|
+
> home) — tracked there too so it can't fall through the gap between the engine work and the GUI work.
|
|
2159
|
+
|
|
2160
|
+
**Type:** feature — operational/diagnostic observability. Closely related to **#16** (Corepoint event-log
|
|
2161
|
+
parity) — see *Relationship* below; this is the broader, happy-path slice #16's narrowed scope does **not**
|
|
2162
|
+
cover.
|
|
2163
|
+
|
|
2164
|
+
**What:** MessageFoundry's technical log does **not** emit the routine per-connection lifecycle play-by-play
|
|
2165
|
+
that Corepoint/Mirth surface under their **Transport** event filter — "connection established", "connection
|
|
2166
|
+
lost", "trying to connect", "reconnecting". Today the connection layer is silent on the happy path and only
|
|
2167
|
+
records the *exceptional* edges:
|
|
2168
|
+
- **Inbound (MLLP/TCP listeners):** a successful client accept is **not logged** — only refusals
|
|
2169
|
+
(`source_ip_allowlist`), at-capacity (silent), frame-over-cap, and unexpected per-connection errors are
|
|
2170
|
+
([`transports/mllp.py`](../messagefoundry/transports/mllp.py) `_serve_client`,
|
|
2171
|
+
[`transports/tcp.py`](../messagefoundry/transports/tcp.py)). When a peer connects and sends normally, the
|
|
2172
|
+
**message** is what's counted/dispositioned in the store — there is no "accepted connection from <peer>" event.
|
|
2173
|
+
- **Outbound (delivery):** [`MLLPDestination`](../messagefoundry/transports/mllp.py) opens a **fresh connection
|
|
2174
|
+
per delivery** (connect → send → ACK → close), so there is no persistent connection to "lose" or
|
|
2175
|
+
"reconnect". A connect/IO failure becomes a `DeliveryError` → retry-with-backoff, and **each failed attempt
|
|
2176
|
+
is not written to the technical log** — the detail goes to the store row's `last_error`, surfaced to
|
|
2177
|
+
operators only via the `AlertSink` `queue_buildup` when a lane backs up
|
|
2178
|
+
([`pipeline/wiring_runner.py`](../messagefoundry/pipeline/wiring_runner.py) delivery loop, the
|
|
2179
|
+
`except DeliveryError` arm). So there is no "trying to connect… refused… retrying" stream.
|
|
2180
|
+
|
|
2181
|
+
What the technical log *does* carry at connection level: engine/wiring lifecycle (`wiring started: N inbound,
|
|
2182
|
+
M outbound`, `wiring stopped/reloaded`), connection-failed-to-bind (isolated, ADR 0031), worker
|
|
2183
|
+
crashed/respawned, STOP-policy halts, and egress/connect allowlist denials.
|
|
2184
|
+
|
|
2185
|
+
**Proposed shape (when triggered):** a lightweight **structured connection *event* log — metadata only, no raw
|
|
2186
|
+
bytes / no PHI** (peer, direction, connection name, transition, timestamp, reason) recording the lifecycle
|
|
2187
|
+
transitions: inbound accept/close, outbound connect-attempt/connected/failed/retry-scheduled, and lane
|
|
2188
|
+
stop/resume. Reuse the existing `AlertSink` seam + the planned lightweight connection-error event log from
|
|
2189
|
+
#16's narrowed ADR 0020 scope rather than a second mechanism; emit-points are connector lifecycle hooks in
|
|
2190
|
+
`transports/` (accept/close on the listeners; connect/send/close on the outbound) plus the delivery-worker
|
|
2191
|
+
retry transitions in `wiring_runner.py`. Keep it **off-by-default / metadata-only** so it never reintroduces a
|
|
2192
|
+
raw-PHI-at-rest tier (the exact reason #16 dropped ADR 0020's raw-frame capture).
|
|
2193
|
+
|
|
2194
|
+
**Relationship to #16:** #16's *retained* slice is **pre-message *failure* events that have no `message_id`**
|
|
2195
|
+
(bad framing, TLS-accept failure, peer reset, allowlist refuse) + ADR 0021's "Response Sent" ACK/NAK capture.
|
|
2196
|
+
This item is the complementary **happy-path connection-state lifecycle** (established / connecting / retrying /
|
|
2197
|
+
lost) — the routine Transport-event transitions a successful connection goes through, which today are silent.
|
|
2198
|
+
Build the two together (one event log, two event classes) if either is un-deferred, to avoid a split design.
|
|
2199
|
+
|
|
2200
|
+
**Why deferred (on-trigger):** no customer pull yet — internal Corepoint-checklist origin, same posture as
|
|
2201
|
+
ADR 0020. Operator visibility for *failures* is already met via per-message disposition + `last_error` + the
|
|
2202
|
+
`queue_buildup`/`connection_stopped` alerts; this adds **diagnostic** visibility of normal connection churn,
|
|
2203
|
+
valuable mainly to operators migrating from an engine that shows it. Build when an adopter needs Corepoint-style
|
|
2204
|
+
connection-event visibility. **Trigger:** a pilot/adopter asks for a connection-state/transport event log.
|
|
2205
|
+
|
|
2206
|
+
**Source:** session question 2026-06-25 ("do our connection logs show connection established / lost / trying to
|
|
2207
|
+
connect?") — confirmed against `transports/mllp.py`, `transports/tcp.py`, and the `wiring_runner.py` delivery
|
|
2208
|
+
loop; relationship to the #16 Corepoint event-log gap analysis (2026-06-17) + ADRs 0020/0021.
|
|
2209
|
+
|
|
2210
|
+
---
|
|
2211
|
+
|
|
2130
2212
|
*Everything else from the 2026-06-10 full-codebase review (1 critical, 13 high, 33 medium, 31 low —
|
|
2131
2213
|
78 findings) has been remediated; see the review report's §6 action order. The two items it still
|
|
2132
2214
|
sourced — **#1 (SQL Server concurrency)** and **#2 (console off-thread)** — are now both **DONE**
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Code sets — translation tables (operator reference)
|
|
2
|
+
|
|
3
|
+
A **code set** is read-only reference data a code-first Router/Handler looks up by name — an Epic
|
|
4
|
+
diet code → a food-service value, a facility code → a downstream mnemonic. This is the operator
|
|
5
|
+
reference for **editing** code sets: the VS Code grid editor and the `messagefoundry codeset` CLI it
|
|
6
|
+
shells. For how a Handler *consumes* a code set (`code_set("name")`), the on-disk format, and the
|
|
7
|
+
purity/reload semantics, see [CONFIGURATION.md → "Code sets"](CONFIGURATION.md#code-sets--reference-lookup-tables-codesets).
|
|
8
|
+
The design record is [ADR 0033](adr/0033-gui-manageable-code-sets.md) (a sibling of the connection
|
|
9
|
+
editor, [ADR 0007](adr/0007-gui-manageable-connections-toml.md)).
|
|
10
|
+
|
|
11
|
+
## Where the files live
|
|
12
|
+
|
|
13
|
+
Code sets live in `codesets/` **relative to the `--config` dir** — a config bundle carries its own
|
|
14
|
+
reference tables and they **reload with the graph** (`POST /config/reload`). The code-set **name** is
|
|
15
|
+
the file's stem (`codesets/epic_diets.csv` → `"epic_diets"`). A missing `codesets/` dir is fine (no
|
|
16
|
+
code sets); the directory is created on the first `upsert`.
|
|
17
|
+
|
|
18
|
+
- **CSV** (`<name>.csv`) — the editable, GUI-canonical format. A header row; the **first column is the
|
|
19
|
+
lookup key**. One other column → the value is that scalar (`str`); several other columns → the value
|
|
20
|
+
is a `dict` `{header: cell}`. A duplicate key is a **load error** (fail loud).
|
|
21
|
+
- **TOML** (`<name>.toml`) — hand-authored / legacy. Summarized by `list` and shown **read-only** in
|
|
22
|
+
the grid; the CLI never *writes* TOML. (A TOML-in-grid editor is a fast-follow.)
|
|
23
|
+
|
|
24
|
+
Both editors — a hand edit and a GUI save — write the same `codesets/<name>.csv`, so they are
|
|
25
|
+
interchangeable.
|
|
26
|
+
|
|
27
|
+
## The grid editor (VS Code)
|
|
28
|
+
|
|
29
|
+
The extension opens a **grid** (rows × columns of strings; the first column is the lookup key) to
|
|
30
|
+
**create / edit / rename / delete** a translation table. It never writes a file itself: it shells the
|
|
31
|
+
`messagefoundry codeset` CLI, which owns all validation and the atomic write. A CLI error comes back
|
|
32
|
+
inline and the grid stays open (file unchanged) so you can fix it. When the opened set is a `.toml`
|
|
33
|
+
file the grid is **read-only** (Save disabled).
|
|
34
|
+
|
|
35
|
+
## The `messagefoundry codeset` CLI
|
|
36
|
+
|
|
37
|
+
The CLI is **offline** (no engine start, no egress check — a code set is standalone data) and
|
|
38
|
+
validates against the **same loader** that runs at startup. Under `--json` it prints a single-line
|
|
39
|
+
JSON result on success, or `{"error": "<message>"}` (exit 1) on failure, so the IDE can surface the
|
|
40
|
+
loader's own wording inline.
|
|
41
|
+
|
|
42
|
+
| Command | What it does |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `messagefoundry codeset list --config DIR` | Summarize every set under `codesets/` (`.csv` **and** `.toml`), sorted by name. |
|
|
45
|
+
| `messagefoundry codeset show --config DIR --name N` | The grid for set `N` (headers + rows); `format:"toml"` ⇒ read-only. |
|
|
46
|
+
| `messagefoundry codeset upsert --config DIR [--data JSON]` | Validate → write `codesets/N.csv` atomically (temp + replace, owner-only perms) → **re-load the written file as the final check**; a bad save rolls back. DETAIL JSON comes from `--data` or stdin. |
|
|
47
|
+
| `messagefoundry codeset rename --config DIR --name N --to M` | Atomic `os.replace` of `codesets/N.<ext>` → `codesets/M.<ext>`; rejects a stem collision. |
|
|
48
|
+
| `messagefoundry codeset remove --config DIR --name N` | Delete `codesets/N.csv` (else `.toml`). |
|
|
49
|
+
|
|
50
|
+
Add `--json` to any command for machine-readable output.
|
|
51
|
+
|
|
52
|
+
### DETAIL shape (for `upsert` / returned by `show`)
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"name": "epic_diets",
|
|
57
|
+
"format": "csv",
|
|
58
|
+
"columns": ["code", "value"],
|
|
59
|
+
"rows": [["A", "Apple"], ["B", "Banana"]]
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`rows` is an **array of arrays** (`string[][]`), each row positionally aligned to `columns`; the
|
|
64
|
+
first column is the key. One value column ⇒ a scalar value, two or more ⇒ a `{header: cell}` dict —
|
|
65
|
+
exactly the loader's rule.
|
|
66
|
+
|
|
67
|
+
### The operator-supplied name is untrusted
|
|
68
|
+
|
|
69
|
+
`upsert`'s `name`, `rename`'s `--to`, **and** the `--name` on `show`/`remove` are all treated as
|
|
70
|
+
**untrusted data** (CLAUDE.md §5/§8). The CLI rejects a name that contains a path separator, `..`, an
|
|
71
|
+
absolute / drive-prefixed path, or an embedded `.csv`/`.toml` extension, and applies a final
|
|
72
|
+
`resolve()` check that the target stays inside `codesets/` — so a name can never read or write a file
|
|
73
|
+
outside the code-sets directory.
|
|
74
|
+
|
|
75
|
+
### Validation rules (mirror the loader exactly)
|
|
76
|
+
|
|
77
|
+
A bad `upsert` is rejected **before** any file is touched: a non-empty key column plus at least one
|
|
78
|
+
value column, unique non-empty headers, all-string cells, no row longer than `columns`, a fully-blank
|
|
79
|
+
row dropped while a blank-key row that carries data is rejected (fail loud — never silently dropped),
|
|
80
|
+
and no duplicate key. A stem that collides with an existing
|
|
81
|
+
`.toml` is rejected (the same ambiguity the loader fails loud on). After the write, the file is
|
|
82
|
+
**re-loaded** as the final authority; any failure rolls the prior content back (or unlinks a
|
|
83
|
+
brand-new file), so a bad edit never lands.
|
|
84
|
+
|
|
85
|
+
## Promote to apply — and the rename/remove caveat
|
|
86
|
+
|
|
87
|
+
Editing a `codesets/` file changes nothing live; the running graph adopts the change only through the
|
|
88
|
+
**existing audited `POST /config/reload`** (the IDE promote), exactly like a connection or handler
|
|
89
|
+
change.
|
|
90
|
+
|
|
91
|
+
**Renaming or removing a code set can break a handler reference.** A code set is referenced by **name**
|
|
92
|
+
from a Handler (`code_set("epic_diets")`), and that reference is resolved at the loader/runner — not by
|
|
93
|
+
`messagefoundry codeset`. So after a rename/remove, a `code_set("old_name")` call raises at run time
|
|
94
|
+
(that message's `ERROR` disposition). A plain `validate` only confirms each *file* parses, so it
|
|
95
|
+
**won't** catch a now-dangling reference.
|
|
96
|
+
|
|
97
|
+
> **After a rename or remove, run `messagefoundry check` before promoting.** Its dry-run actually
|
|
98
|
+
> executes the transforms, so it triggers the lookup and surfaces a broken `code_set(...)` reference at
|
|
99
|
+
> the gate rather than at the first message in production. The editor deliberately does **not** scan
|
|
100
|
+
> handler source for references (that would couple a data tool to code parsing and still miss a
|
|
101
|
+
> call-time-computed name) — the `messagefoundry check` dry-run is the safety net.
|
|
102
|
+
|
|
103
|
+
## Out of scope
|
|
104
|
+
|
|
105
|
+
**Reference sets** ([ADR 0006](adr/0006-external-data-lookups.md)) and **`db_lookup`**
|
|
106
|
+
([ADR 0010](adr/0010-handler-callable-db-lookup.md)) are **not** editable here: their data is
|
|
107
|
+
externally owned (synced on a cadence, or a live database read), so editing it in this grid would be
|
|
108
|
+
overwritten by the next sync/query and is therefore meaningless. This editor governs only the
|
|
109
|
+
bundle-shipped, operator-owned code sets.
|
|
@@ -188,6 +188,34 @@ system value, a facility code → a downstream mnemonic. Rather than a hand-main
|
|
|
188
188
|
crash-re-run can make the re-run derive a different output. That's acceptable for reference data (a
|
|
189
189
|
code set is deliberately operator-editable, and a reload is an explicit, audited act), but it is the
|
|
190
190
|
one way a transform's re-run can legitimately differ — note it where you document the transform.
|
|
191
|
+
- **Editing — by hand or from the IDE.** A code set is a plain `codesets/<name>.csv` you can edit in any
|
|
192
|
+
editor, **and** a GUI-manageable artifact ([ADR 0033](adr/0033-gui-manageable-code-sets.md)). The VS
|
|
193
|
+
Code extension opens a **grid editor** (rows × columns of strings — the first column is the lookup
|
|
194
|
+
key) to **create / edit / rename / delete** a translation table; it shells a new
|
|
195
|
+
**`messagefoundry codeset`** CLI that owns validation and the atomic write. Both editors write the
|
|
196
|
+
same file (CSV-first), so a hand edit and a GUI save are interchangeable — mirroring the connections
|
|
197
|
+
editor ([ADR 0007](adr/0007-gui-manageable-connections-toml.md)).
|
|
198
|
+
- `messagefoundry codeset list --config DIR` — summarize every set under `codesets/` (`.csv` **and**
|
|
199
|
+
`.toml`; TOML sets are summarized and shown **read-only** in the grid — TOML-in-grid editing is a
|
|
200
|
+
fast-follow).
|
|
201
|
+
- `messagefoundry codeset show --config DIR --name N` — the grid (headers + rows).
|
|
202
|
+
- `messagefoundry codeset upsert --config DIR --data '{…}'` — validate → write `codesets/N.csv`
|
|
203
|
+
atomically (temp + replace, owner-only perms) → **re-load the written file as the final check**;
|
|
204
|
+
a bad save rolls back, so the CLI never leaves an unloadable table.
|
|
205
|
+
- `messagefoundry codeset rename --config DIR --name N --to M` / `… remove --config DIR --name N`.
|
|
206
|
+
|
|
207
|
+
The CLI is **offline** (no engine start, no egress check — a code set is standalone data); it validates
|
|
208
|
+
against the **same loader** that runs at startup, and the operator-supplied **name is treated as
|
|
209
|
+
untrusted data** (rejecting path separators, `..`, absolute/drive paths, and an embedded extension, so
|
|
210
|
+
a name can't escape `codesets/`). Apply a change with the existing audited promote/reload below.
|
|
211
|
+
- **Promote to apply (rename/remove caveat).** Editing a `codesets/` file changes nothing live; the
|
|
212
|
+
running graph adopts the change only through **`POST /config/reload`** (the IDE promote), exactly like
|
|
213
|
+
a connection or handler change. **Renaming or removing a code set can break a handler reference** — a
|
|
214
|
+
`code_set("old_name")` call then raises at run time (that message's `ERROR` disposition). A plain
|
|
215
|
+
`validate` only confirms each file parses, so it **won't** catch a now-dangling reference; **run
|
|
216
|
+
`messagefoundry check` after a rename/remove**, whose dry-run executes the transforms and surfaces the
|
|
217
|
+
broken `code_set(...)` lookup before you promote. See [docs/CODESETS.md](CODESETS.md) for the full grid
|
|
218
|
+
editor + CLI reference.
|
|
191
219
|
|
|
192
220
|
### Transform state — cross-message correlation ([ADR 0005](adr/0005-transform-accessible-state.md))
|
|
193
221
|
|
|
@@ -200,6 +200,16 @@ or leave empty for no restriction.
|
|
|
200
200
|
> scoped to one listener; the same off-loopback risk applies), and **`source_ip_allowlist`** restricts
|
|
201
201
|
> which peers that listener accepts. See [docs/CONFIGURATION.md](CONFIGURATION.md).
|
|
202
202
|
|
|
203
|
+
> **Port-conflict detection.** Two inbound listeners that bind the **same port on overlapping
|
|
204
|
+
> interfaces** are caught **statically** — at `messagefoundry check` / dry-run and at engine
|
|
205
|
+
> start/reload — naming **both** connections, instead of aborting at the bare OS bind. The check is
|
|
206
|
+
> **interface-aware**: two listeners on the same port but **different** explicit `bind_address`es (a
|
|
207
|
+
> multi-NIC host) don't conflict, while a `0.0.0.0` (all-interfaces) bind conflicts with any specific
|
|
208
|
+
> interface on that port. `env()`-resolved ports and the engine's own **API listener port** (`[api].port`)
|
|
209
|
+
> are included in the start/reload pass. At runtime, a port already held by **another process** (a
|
|
210
|
+
> second instance, an OS service) is reported as a clear, named conflict and the affected inbound is
|
|
211
|
+
> **isolated** (the engine still comes up; see [ADR 0031](adr/0031-startup-connection-fault-isolation.md)).
|
|
212
|
+
|
|
203
213
|
#### Inspecting & testing a connection (API)
|
|
204
214
|
|
|
205
215
|
Two read/diagnostic endpoints back the console's connection view (auth + per-channel RBAC apply — see
|