messagefoundry 0.2.9__tar.gz → 0.2.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/ci.yml +130 -13
- messagefoundry-0.2.11/.github/workflows/manifest-lint.yml +114 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/release.yml +185 -0
- messagefoundry-0.2.11/.github/workflows/selfhosted-win2025-sql.yml +85 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/CHANGELOG.md +152 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/CLAUDE.md +20 -6
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/PKG-INFO +7 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docker/README.md +17 -6
- messagefoundry-0.2.11/docker/compose.yaml +201 -0
- messagefoundry-0.2.11/docker/k8s/ha-postgres.yaml +242 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docker/k8s/secret.example.yaml +12 -2
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docker/k8s/statefulset.yaml +4 -2
- messagefoundry-0.2.11/docs/ANTIVIRUS-FIREWALL.md +219 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/BACKLOG.md +952 -129
- messagefoundry-0.2.11/docs/CLOUD-DEPLOYMENT.md +306 -0
- messagefoundry-0.2.11/docs/CLOUD-PHI-HIPAA.md +185 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/CONFIGURATION.md +17 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/CONNECTIONS.md +44 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/CONTAINER-EXPOSURE-EVALUATION.md +5 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/DEPLOYMENT.md +24 -7
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/FEATURE-MAP.md +2 -2
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/PHI.md +1 -0
- messagefoundry-0.2.11/docs/POSITIONING.md +70 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/SERVICE.md +14 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/THROUGHPUT-IMPROVEMENTS.md +68 -15
- messagefoundry-0.2.11/docs/adr/0023-inbound-http-listener.md +326 -0
- messagefoundry-0.2.11/docs/adr/0029-email-smtp-destination.md +267 -0
- messagefoundry-0.2.11/docs/adr/0032-console-desktop-launch.md +347 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0040-free-threaded-engine-support.md +9 -6
- messagefoundry-0.2.11/docs/adr/0043-fhir-read-lookup.md +303 -0
- messagefoundry-0.2.11/docs/adr/0044-operator-alert-state.md +262 -0
- messagefoundry-0.2.11/docs/adr/0045-custom-rbac-roles.md +266 -0
- messagefoundry-0.2.11/docs/adr/0046-message-content-search.md +251 -0
- messagefoundry-0.2.11/docs/adr/0047-cloud-kubernetes-ha-deployment-packaging.md +325 -0
- messagefoundry-0.2.11/docs/adr/0048-third-tier-disaster-recovery-standby.md +648 -0
- messagefoundry-0.2.11/docs/adr/0049-turnkey-dr-backup-restore-verify.md +525 -0
- messagefoundry-0.2.11/docs/adr/0050-single-project-root-config-anchoring.md +404 -0
- messagefoundry-0.2.11/docs/adr/0051-corepoint-throughput-parity-strategy.md +183 -0
- messagefoundry-0.2.11/docs/adr/0052-enterprise-scale-target.md +101 -0
- messagefoundry-0.2.11/docs/adr/0053-free-threaded-multicore-engine.md +249 -0
- messagefoundry-0.2.11/docs/adr/0054-low-allocation-builtins-hl7-parser.md +221 -0
- messagefoundry-0.2.11/docs/adr/0055-group-commit-durable-write.md +144 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/README.md +20 -7
- messagefoundry-0.2.11/docs/design/freethread-spike.md +177 -0
- messagefoundry-0.2.11/docs/releases/MULTISESSION-PLAN-5.md +453 -0
- messagefoundry-0.2.11/docs/releases/MULTISESSION-PLAN-6.md +258 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/research/cloud-deployment-research-2026-06.md +10 -4
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/__init__.py +24 -2
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/__main__.py +607 -17
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/api/app.py +409 -14
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/api/auth_models.py +19 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/api/auth_routes.py +108 -7
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/api/models.py +88 -3
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/identity.py +10 -2
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/permissions.py +88 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/service.py +155 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/checks.py +35 -4
- messagefoundry-0.2.11/messagefoundry/config/anchor.py +169 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/connections_file.py +11 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/environments.py +20 -2
- messagefoundry-0.2.11/messagefoundry/config/fhir_lookup.py +132 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/models.py +35 -2
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/settings.py +370 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/wiring.py +250 -8
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/alerts_page.py +146 -19
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/client.py +85 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/connections.py +9 -4
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/shell.py +91 -7
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/theme.py +3 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/widgets.py +67 -17
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/__init__.py +42 -0
- messagefoundry-0.2.11/messagefoundry/parsing/_backend.py +47 -0
- messagefoundry-0.2.11/messagefoundry/parsing/_builtin_hl7.py +687 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/message.py +153 -7
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/peek.py +56 -5
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/__init__.py +18 -2
- messagefoundry-0.2.11/messagefoundry/parsing/x12/_deps.py +43 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/errors.py +12 -1
- messagefoundry-0.2.11/messagefoundry/parsing/x12/validate.py +217 -0
- messagefoundry-0.2.11/messagefoundry/parsing/xml/__init__.py +50 -0
- messagefoundry-0.2.11/messagefoundry/parsing/xml/_deps.py +62 -0
- messagefoundry-0.2.11/messagefoundry/parsing/xml/errors.py +52 -0
- messagefoundry-0.2.11/messagefoundry/parsing/xml/harden.py +73 -0
- messagefoundry-0.2.11/messagefoundry/parsing/xml/message.py +154 -0
- messagefoundry-0.2.11/messagefoundry/parsing/xml/schema.py +69 -0
- messagefoundry-0.2.11/messagefoundry/parsing/xml/signature.py +68 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/alert_sinks.py +115 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/alerts.py +44 -0
- messagefoundry-0.2.11/messagefoundry/pipeline/dr.py +459 -0
- messagefoundry-0.2.11/messagefoundry/pipeline/dr_backup.py +872 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/engine.py +224 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/retention.py +20 -0
- messagefoundry-0.2.11/messagefoundry/pipeline/update_check.py +225 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/wiring_runner.py +413 -22
- messagefoundry-0.2.11/messagefoundry/store/backup_codec.py +290 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/store/base.py +335 -2
- messagefoundry-0.2.11/messagefoundry/store/content_search.py +131 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/store/postgres.py +284 -4
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/store/sqlserver.py +307 -6
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/store/store.py +984 -246
- messagefoundry-0.2.11/messagefoundry/support/__init__.py +21 -0
- messagefoundry-0.2.11/messagefoundry/support/bundle.py +231 -0
- messagefoundry-0.2.11/messagefoundry/support/redact.py +75 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/timezone.py +153 -2
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/__init__.py +2 -0
- messagefoundry-0.2.11/messagefoundry/transports/email.py +196 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/fhir.py +240 -1
- messagefoundry-0.2.11/messagefoundry/transports/http_listener.py +473 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/smart.py +33 -13
- messagefoundry-0.2.11/packaging/console-installer/README.md +126 -0
- messagefoundry-0.2.11/packaging/console-installer/THIRD-PARTY-NOTICES.md +102 -0
- messagefoundry-0.2.11/packaging/console-installer/THIRD-PARTY-NOTICES.txt +131 -0
- messagefoundry-0.2.11/packaging/console-installer/console_launcher.py +31 -0
- messagefoundry-0.2.11/packaging/console-installer/licenses/GPL-3.0.txt +674 -0
- messagefoundry-0.2.11/packaging/console-installer/licenses/LGPL-3.0.txt +165 -0
- messagefoundry-0.2.11/packaging/console-installer/messagefoundry-console.iss +120 -0
- messagefoundry-0.2.11/packaging/console-installer/messagefoundry-console.spec +188 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/pyproject.toml +14 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/requirements.lock +81 -20
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/security/crypto_inventory_check.py +16 -0
- messagefoundry-0.2.11/tests/test_alert_state.py +459 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_api.py +31 -0
- messagefoundry-0.2.11/tests/test_api_alerts.py +247 -0
- messagefoundry-0.2.11/tests/test_backup_crypto.py +144 -0
- messagefoundry-0.2.11/tests/test_backup_restore_atleastonce.py +76 -0
- messagefoundry-0.2.11/tests/test_backup_runner.py +373 -0
- messagefoundry-0.2.11/tests/test_builtin_hl7_parity.py +620 -0
- messagefoundry-0.2.11/tests/test_cli_offline_resolution.py +250 -0
- messagefoundry-0.2.11/tests/test_config_anchoring.py +481 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_connection_event_outbound.py +2 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_alerts.py +121 -8
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_status.py +1 -1
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_widgets.py +58 -1
- messagefoundry-0.2.11/tests/test_content_search.py +378 -0
- messagefoundry-0.2.11/tests/test_custom_roles.py +417 -0
- messagefoundry-0.2.11/tests/test_dr_activation.py +187 -0
- messagefoundry-0.2.11/tests/test_dr_api_status.py +94 -0
- messagefoundry-0.2.11/tests/test_dr_failback.py +114 -0
- messagefoundry-0.2.11/tests/test_dr_rbac.py +143 -0
- messagefoundry-0.2.11/tests/test_dr_run_profile.py +183 -0
- messagefoundry-0.2.11/tests/test_dr_seeding.py +216 -0
- messagefoundry-0.2.11/tests/test_email_destination.py +313 -0
- messagefoundry-0.2.11/tests/test_fhir_lookup.py +423 -0
- messagefoundry-0.2.11/tests/test_frozen_launch_smoke.py +115 -0
- messagefoundry-0.2.11/tests/test_group_commit.py +625 -0
- messagefoundry-0.2.11/tests/test_inbound_http_source.py +424 -0
- messagefoundry-0.2.11/tests/test_license_notice.py +76 -0
- messagefoundry-0.2.11/tests/test_message_timestamps.py +79 -0
- messagefoundry-0.2.11/tests/test_pool_warm.py +395 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_postgres_store.py +46 -0
- messagefoundry-0.2.11/tests/test_priority_resolution.py +128 -0
- messagefoundry-0.2.11/tests/test_release_console_installer.py +195 -0
- messagefoundry-0.2.11/tests/test_restore_verify.py +102 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_settings.py +115 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_sqlserver_store.py +42 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_supervisor.py +51 -0
- messagefoundry-0.2.11/tests/test_support_bundle.py +169 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_timezone.py +139 -1
- messagefoundry-0.2.11/tests/test_update_check.py +199 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_wiring_engine.py +2 -0
- messagefoundry-0.2.11/tests/test_x12_validate.py +110 -0
- messagefoundry-0.2.11/tests/test_xml_message.py +169 -0
- messagefoundry-0.2.11/tests/test_xml_schema_signature.py +63 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/uv.lock +125 -22
- messagefoundry-0.2.9/docker/compose.yaml +0 -84
- messagefoundry-0.2.9/docs/adr/0032-console-desktop-launch.md +0 -86
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.claude/settings.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.dockerignore +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.gitattributes +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/CODEOWNERS +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/SECURITY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/dependabot.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/benchmark.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/cla.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/codeql.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/dependabot-auto-merge.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/dependabot-lock-resync.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/freethread-smoke.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/release-sync-check.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/scorecard.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/security.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/workflows/vuln-metrics.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.github/zizmor.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.gitignore +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.gitleaks.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.mefor-hooks/pre-commit +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.pre-commit-config.yaml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/.semgrep/messagefoundry.yml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/CLA.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/CODE_OF_CONDUCT.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/COMMERCIAL-LICENSE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/CONTRIBUTING.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/GOVERNANCE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/LICENSE +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/MAINTAINERS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/NOTICE +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docker/Dockerfile +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docker/locks/requirements-core.lock +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docker/locks/requirements-sqlserver.lock +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docker/secrets.env.example +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docker/smoke/Dockerfile +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docker/smoke/config/IB_Test_ADT.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docker/smoke/send_adt.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/ADOPTER-CI.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/AI.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/ARCHITECTURE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/CI-QUALITY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/CLUSTERING.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/CODESETS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/DEPLOY-SERVER-DB.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/DICOM.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/DUAL_LICENSING_PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/HL7-VALIDATION.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/INSTALL-GUIDE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/LOAD-TESTING.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/MENTAL-MODEL.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/MessageFoundry-Mental-Model.docx +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/REMOTE-CONSOLE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/SECURITY-REMEDIATION-LEDGER.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/SECURITY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/SUPPORT-POLICY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/SYSTEM-REQUIREMENTS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/Secure_AI_Development_Standards.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/Secure_Development_Standards.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/TEE-RELAY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/USER-GUIDE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/WORKTREES.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0001-staged-pipeline-architecture.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0005-transform-accessible-state.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0006-external-data-lookups.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0008-cluster-observability-api.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0009-run-scoped-context-providers.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0011-timer-scheduled-source.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0012-x12-edi-codec.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0013-increment-2-reingress-design.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0013-query-response-orchestration.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0014-alerting-rules-engine.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0017-consumer-deployment-model.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0026-off-box-egress-update-check.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0027-per-connection-retention.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0033-gui-manageable-code-sets.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0034-static-analysis-triage-policy-accepted-risk-register.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0035-ide-extension-workspace-trust-and-scope.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0036-windows-config-source-trust.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0037-multi-process-sharding-l3.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0038-internal-pass-through-connector.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0039-database-tier-sharding-l5.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0041-load-path-attestation-and-change-attribution.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/0042-embedded-document-pruning.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/adr/TEMPLATE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/architecture-components.png +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/architecture-components.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/architecture-config-graph.png +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/architecture-config-graph.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/architecture-diagram.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/architecture-message-flow.png +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/architecture-message-flow.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/architecture-topology.png +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/architecture-topology.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/benchmarks/TUNING-BASELINE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/benchmarks/step-b-write-amplification.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/design/dbshard.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/design/freethread.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/design/multiproc.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/hl7-message-ordering-reference.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/message-ordering-design.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/MULTISESSION-PLAN-4.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/v0.1-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/research/config-ux-review.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/research/non-hl7-transform-components.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/ADVISORY-PROCESS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/ASVS-L3-STATUS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/BEYOND-ASVS-L3.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/DEPENDENCY-METRICS.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/PHASE-8C-RBAC.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/PUBLISHING.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/RCA-TEMPLATE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/RELEASE-GATE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/REVIEW-2026-06-07.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/SECURITY-POSTURE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/security/THREAT-MODEL.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/testing/VERIFY.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/environments/dev.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/environments/prod.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/__main__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/acceptance/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/acceptance/__main__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/acceptance/matrix.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/acceptance/probes.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/acceptance/report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/acceptance/runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/compose.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/config/coverage.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/config/load/_shape.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/config/load/graph.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/config/passthrough/graph.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/config/store_once/graph.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/file_panel.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/file_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/corpus.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/correlator.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/enginepoll.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/failover.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/failover_track.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/governor.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/ids.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/metrics.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profile.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/adt-fanout-stress.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/closed-loop.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/failover.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/fanout-baseline.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/malformed-load.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/reference.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/smoke-sqlserver.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/smoke.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/soak.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/spike-burst.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/sustained-overload.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/profiles/writeamp.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/sender.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/load/sink.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/mllp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/monitor.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/receive.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/reconcile/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/reconcile/__main__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/reconcile/capture.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/reconcile/compare.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/reconcile/normalize.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/reconcile/report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/scenarios.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/send.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/harness/window.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/.gitignore +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/.vscodeignore +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/esbuild.js +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/media/hl7schema.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/media/icon-amber.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/media/icon.png +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/media/icon.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/package-lock.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/package.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/snippets/messagefoundry.code-snippets +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/aiPolicy.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/alertEditor.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/auth.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/chat.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/cli.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/codeSetEditor.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/codesetsTree.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/completion.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/connectionEditor.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/editorToolbar.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/engineClient.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/engineTarget.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/extension.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/generate.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/git.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/graphTree.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/home.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/insertElement.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/newRoute.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/promote.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/promoteTarget.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/sourceControl.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/test/runTest.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/test/suite/ai-policy.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/test/suite/chat.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/test/suite/editor-toolbar.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/test/suite/engine-target.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/test/suite/extension.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/test/suite/index.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/test/suite/insert-element.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/test/suite/promote-target.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/test/suite/pythonpath.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/test/suite/settings-scope.test.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/testBench.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/src/validate.ts +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/tsconfig.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/ide/tsconfig.test.json +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/mefor.code-workspace +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/adr_analyze.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/anon/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/anon/_pools.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/anon/hl7.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/anon/keying.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/anon/leak.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/anon/rules.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/anon/surrogates.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/api/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/api/approvals.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/api/field_authz.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/api/metrics.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/api/security.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/api/tls.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/data/common_passwords.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/ldap.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/notifications.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/passwords.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/policy.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/ratelimit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/tokens.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/auth/totp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/active_environment.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/ai_policy.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/alerts_edit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/code_sets.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/codeset_edit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/connections_edit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/db_lookup.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/fingerprint.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/ingest_time.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/reference.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/response.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/run_context.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/state.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/config/tls_policy.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/__main__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/_async.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/change_password.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/dead_letters_page.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/delegates.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/event_log_page.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/icons/alerts.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/icons/connections.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/icons/dead-letters.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/icons/engine-status.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/icons/log-search.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/icons/logo-lockup.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/icons/users.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/login.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/mfa.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/reauth.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/resources/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/resources/app.ico +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/resources/app.svg +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/search.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/service_control.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/sessions.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/shards.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/status.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/console/users_page.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/_core.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/_hl7data.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/adt.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/all_types.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/bar.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/dft.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/documents.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/mdm.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/mfn.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/oml.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/orl.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/orm.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/oru.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/ras.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/rde.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/siu.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/generators/vxu.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/hl7schema.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/integrity.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/last_resort.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/logging_setup.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/binary.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/consistency.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/_deps.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/_util.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/dataset.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/errors.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/dicom/peek.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/fhir/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/fhir/_deps.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/fhir/errors.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/fhir/peek.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/fhir/resource.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/groups.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/split.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/summary.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/tree.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/validate.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/delimiters.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/interchange.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/message.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/parsing/x12/peek.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/cert_expiry.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/cluster.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/config_convergence.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/dryrun.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/leader_tasks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/reference_sync.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/security_notify.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/sharding.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/state_convergence.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/pipeline/supervisor.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/py.typed +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/redaction.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/scaffold.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/secrets_dpapi.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/store/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/store/audit_tee.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/store/crypto.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/store/document_strip.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/store/keyprovider.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/base.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/database.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/dicom.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/dicomweb.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/file.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/framing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/loopback.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/mllp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/passthrough.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/remotefile.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/rest.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/signing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/soap.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/tcp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/timer.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/transports/x12.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/verify/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/verify/checks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/verify/model.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/verify/report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/verify/runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/messagefoundry/verify/smoke.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/packaging/messagefoundry-harness/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/packaging/messagefoundry-harness/pyproject.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/config/IB_ACME_ADT.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/config/IB_FHIR_INTAKE.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/config/IB_PARTNER_X12.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/config/IB_RADIOLOGY_SR.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/config/adt.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/config/codesets/event_labels.csv +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/config/codesets/facility_mnemonics.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/config/connections.toml +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/consistency/validated_adt.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/dicom/generate_sr_sample.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/adt_a01.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/adt_batch.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/messages/x12_270_eligibility.edi +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/results_relay/README.md +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/results_relay/codesets/test_codes.csv +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/results_relay/messages/oru_results.hl7 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/results_relay/results_relay.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/samples/send_mllp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/console/install-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/console/pack_ico.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/dev/postgres.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/dev/sqlserver-docker.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/dev/sqlserver.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/publish/check_release_sync.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/publish/publish-denylist.txt +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/publish/publish.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/publish/scan_forbidden.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/security/vuln_metrics.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/service/import-db-ca.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/service/install-service.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/service/uninstall-service.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/trace_icon.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/worktree/new.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/worktree/remove.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/worktree/session-context.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/scripts/worktree/spawn.ps1 +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/__main__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/anon/__init__.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/anon/_hl7data.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/anon/_pools.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/anon/hl7.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/anon/keying.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/anon/leak.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/anon/rules.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/anon/surrogates.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/compare.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/correlate.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/hl7_fields.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/mefor_api.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/mllp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/relay.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tee/store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/_dicom_sample.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/_failover_load_support.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/_fhir_fixtures.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/conftest.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_acceptance_framework.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_ack_capture_runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_ack_sent_store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_active_environment.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_ad_group_scope.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_admin_new_ip.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_adr_analyze.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_ai_policy.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_alert_rules.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_alert_sinks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_alerts_edit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_alerts_rules_api.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_anon_core.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_anon_integration.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_anon_parity.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_api_auth.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_api_reload.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_api_tls.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_approvals.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_asvs_phase0.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_audit_integrity.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_audit_offbox_tee.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_auth_core.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_auth_entry_hardening.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_auth_hardening.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_auth_service.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_auth_session_lifecycle.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_auth_store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_binary_carriage.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_bootstrap_admin_perms.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_cert_expiry.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_channel_rbac.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_checks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_checks_lint.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_cli.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_cluster.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_cluster_failover_postgres.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_cluster_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_cluster_graph_gating.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_cluster_lease.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_code_sets.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_codeset_edit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_config_fingerprint.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_config_source_trust.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_connection_api.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_connection_event_api.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_connection_event_emit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_connection_event_scope.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_connection_event_store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_connection_resilience.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_connections_cli.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_connections_file.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_consistency.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_auth.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_client.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_dead_letters.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_event_log.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_hardening.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_icon.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_password.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_sessions.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_shards.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_step_up.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_theme.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_console_users.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_database_connector_integration.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_database_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_db_lookup.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_db_lookup_live_runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_delivery_settings.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_dependabot_automerge_guardrails.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_dependency_boundaries.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_dicom_codec.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_dicom_scp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_dicom_scp_security.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_dicom_scu.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_dicom_wiring.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_dicomweb.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_docs_runbooks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_dryrun.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_dual_control_reload.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_ed_documents.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_ed_documents_e2e.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_egress_allowlist.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_embedded_document_pruning.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_enginepoll_aggregate.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_environments.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_fhir_parsing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_fhir_resource.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_fhir_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_field_authz.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_field_authz_metadata.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_fifo_ordering.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_generate_cli.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_generated_adt.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_generators_core.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_generators_types.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_groups.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_harness.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_harness_compose.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_harness_config.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_harness_faults.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_harness_file.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_harness_monitor.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_harness_scenarios.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_hl7_core_features.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_hl7schema.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_inbound_bind.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_ingest_time.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_keyprovider.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_last_admin_guard.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_last_resort.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_leader_tasks.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_listener_tls_exposure.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_load_config.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_load_corpus.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_load_failover_postgres.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_load_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_load_failover_unit.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_load_metrics.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_load_profile.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_load_report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_load_runner.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_load_sender.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_load_sink.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_logging.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_message.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_message_split.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_metrics_exporter.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_mfa.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_mllp_encoding_override.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_mllp_tls.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_nonhl7_ingress_size_cap.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_operability_config.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_outbound_signing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_outbound_simulate.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_packaging.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_parse_tree.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_parsing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_passthrough.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_passthrough_graph.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_payload_agnostic_ingress.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_per_connection_retention.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_reconcile_capture.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_reconcile_compare.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_reconcile_harness.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_redaction.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_reference_sets.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_reingress.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_remotefile_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_response_capture.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_rest_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_retention.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_run_context.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_scaffold.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_scaffold_requirements.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_scan_forbidden.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_secrets_dpapi.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_security_notify.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_security_static.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_service_control.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_sharding.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_sibling_helper_finder.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_smart_backend.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_soap_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_soap_wssecurity.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_sqlserver_coordinator.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_sqlserver_cursor_close.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_sqlserver_schema_init.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_staged_pipeline.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_startup_attestation.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_startup_fault_isolation.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_stats_reset.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_step_up.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_store_backend.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_store_encryption.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_store_file_hardening.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_store_once_deliver_many.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_store_once_graph.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_store_read_pool.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_store_ssl.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_summary.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_task_resilience.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_tcp_transport.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_tee_cli.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_tee_compare.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_tee_correlate.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_tee_hl7_fields.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_tee_mefor_api.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_tee_mllp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_tee_relay.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_tee_report.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_tee_store.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_timer_source.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_tls_policy.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_totp.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_totp_window.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_transform_offloop.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_transform_state.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_transports.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_verify.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_version.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_win2025_acceptance.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_wiring.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_wiring_reload.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_wiring_serve.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_ws_stats_revalidation.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_x12_parsing.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_x12_rte.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_x12_source_ip_allowlist.py +0 -0
- {messagefoundry-0.2.9 → messagefoundry-0.2.11}/tests/test_x12_transport.py +0 -0
|
@@ -5,9 +5,27 @@ on:
|
|
|
5
5
|
branches: [main]
|
|
6
6
|
pull_request:
|
|
7
7
|
workflow_dispatch:
|
|
8
|
+
schedule:
|
|
9
|
+
# Nightly (03:17 UTC — off the top-of-hour rush) run of the long load-smoke legs ONLY. These were
|
|
10
|
+
# previously run on EVERY push to main; main still gets the full functional `test` matrix + the
|
|
11
|
+
# server-DB suites per push, but the multi-minute load runs (serve an engine + drive a load profile,
|
|
12
|
+
# x2 for the SQL Server majors) now run once a night instead of once per commit.
|
|
13
|
+
# IMPORTANT: this cron must NOT drag the rest of the workflow along. Only `load-test` and
|
|
14
|
+
# `load-test-sqlserver` fire on `schedule` (their `if:` is `schedule || workflow_dispatch`). Every
|
|
15
|
+
# OTHER heavy job (test, ide, sqlserver-store, postgres-store, windows-service-smoke, docker-smoke)
|
|
16
|
+
# gates its push/dispatch arm as `push || workflow_dispatch` — deliberately EXCLUDING `schedule` —
|
|
17
|
+
# so the nightly run does not re-execute the full functional matrix + server-DB + 2x-Windows
|
|
18
|
+
# service smoke (which would COST more than the per-push load savings; the original `!= 'pull_request'`
|
|
19
|
+
# form would have swept them all into the cron). Trigger an on-demand load run with
|
|
20
|
+
# `gh workflow run ci.yml --ref main` (workflow_dispatch) — that DOES run everything, by design.
|
|
21
|
+
- cron: "17 3 * * *"
|
|
8
22
|
|
|
9
23
|
concurrency:
|
|
10
|
-
group
|
|
24
|
+
# Per-ref group so a new push/PR-update supersedes its own in-flight run. The nightly `schedule` run
|
|
25
|
+
# gets a SEPARATE group (…-nightly): without this it would share `ci-refs/heads/main` with push-to-main
|
|
26
|
+
# and a routine daytime push would cancel-in-progress the in-flight nightly LOAD run — silently killing
|
|
27
|
+
# the very long-running coverage the cron exists to provide. Scheduled and push runs no longer collide.
|
|
28
|
+
group: ci-${{ github.ref }}${{ github.event_name == 'schedule' && '-nightly' || '' }}
|
|
11
29
|
cancel-in-progress: true
|
|
12
30
|
|
|
13
31
|
# Least privilege: every job here only reads the repo and runs tests/builds (no gh writes, no git push,
|
|
@@ -22,6 +40,12 @@ jobs:
|
|
|
22
40
|
# version we ship on the OS we ship it on is worth the minutes.
|
|
23
41
|
test:
|
|
24
42
|
name: test (${{ matrix.os }}, py${{ matrix.python-version }})
|
|
43
|
+
# `needs: changes` for the docs-only short-circuit ONLY — this REQUIRED job still RUNS on every PR
|
|
44
|
+
# and ALWAYS reports its context. On a docs-only PR `changes.outputs.code == 'false'` and the
|
|
45
|
+
# expensive steps (install/lint/type/test) are skipped, so the leg goes green in seconds; the
|
|
46
|
+
# required `test (…, py3.14)` context stays present + green. (changes never fails, so this needs
|
|
47
|
+
# edge can't wedge the required context.)
|
|
48
|
+
needs: changes
|
|
25
49
|
runs-on: ${{ matrix.os }}
|
|
26
50
|
# Wall-clock backstop: bound each leg so a hung test fails in minutes, not the 6h default. Three
|
|
27
51
|
# nested watchdogs catch a hang at increasing scope (#55): the pytest-timeout per-test cap (60s,
|
|
@@ -48,17 +72,32 @@ jobs:
|
|
|
48
72
|
with:
|
|
49
73
|
python-version: ${{ matrix.python-version }}
|
|
50
74
|
cache: pip
|
|
51
|
-
cache
|
|
75
|
+
# Key the pip cache on BOTH the project metadata and the resolved lockfile, so a dep bump (or a
|
|
76
|
+
# re-lock that only moves transitive pins) busts the cache and a no-op change reuses it. The
|
|
77
|
+
# install is `pip install -e ".[...]"` (reads pyproject); requirements.lock tracks the resolved
|
|
78
|
+
# graph CI actually exercises, so hashing it keeps the cache correct across re-locks.
|
|
79
|
+
cache-dependency-path: |
|
|
80
|
+
pyproject.toml
|
|
81
|
+
requirements.lock
|
|
82
|
+
|
|
83
|
+
# Everything below is gated on `code` (docs-only short-circuit) OR a push-to-main / on-demand run
|
|
84
|
+
# (full coverage). On a docs-only PR these steps no-op and the REQUIRED leg reports green in seconds.
|
|
85
|
+
# The job itself (and the Python/cache setup above) still runs, so the required context is always
|
|
86
|
+
# present. NB: the gate is duplicated per-step (a job-level `if` would SKIP the whole job and remove
|
|
87
|
+
# the required context) — keep the condition identical on each. The push/dispatch arm is written
|
|
88
|
+
# `push || workflow_dispatch` (NOT `!= 'pull_request'`) so the nightly `schedule` event does NOT
|
|
89
|
+
# re-run this full functional matrix — the cron is reserved for the long load legs only.
|
|
52
90
|
|
|
53
91
|
# PySide6's offscreen platform plugin needs a few system libraries even
|
|
54
92
|
# headless. Linux-only; Windows runners need no equivalent.
|
|
55
93
|
- name: Install Qt offscreen system libraries
|
|
56
|
-
if: runner.os == 'Linux'
|
|
94
|
+
if: (needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch') && runner.os == 'Linux'
|
|
57
95
|
run: |
|
|
58
96
|
sudo apt-get update
|
|
59
97
|
sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libdbus-1-3
|
|
60
98
|
|
|
61
|
-
- name: Install project (dev + console + fhir + dicom extras)
|
|
99
|
+
- name: Install project (dev + console + fhir + dicom + x12 + xml extras)
|
|
100
|
+
if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
62
101
|
run: |
|
|
63
102
|
python -m pip install --upgrade pip
|
|
64
103
|
# [fhir] so the FHIR typed-tier tests (incl. the PHI-no-leak invariant, ADR 0022) actually
|
|
@@ -66,15 +105,20 @@ jobs:
|
|
|
66
105
|
# [dicom] (pydicom + pynetdicom; ADR 0025) does the same for the DICOM codec + C-STORE SCP
|
|
67
106
|
# tests, and lets mypy type-check transports/dicom.py + parsing/dicom/ against the real
|
|
68
107
|
# (py.typed) libraries rather than treating them as Any.
|
|
69
|
-
|
|
108
|
+
# [x12] (pyx12) + [xml] (lxml/xmlschema/signxml) likewise so the strict X12 validation (#32)
|
|
109
|
+
# and the hardened XML/SOAP codec (#31) tests run their assertions instead of importorskip-skipping.
|
|
110
|
+
pip install -e ".[dev,console,fhir,dicom,x12,xml]"
|
|
70
111
|
|
|
71
112
|
- name: Lint (ruff)
|
|
113
|
+
if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
72
114
|
run: ruff check messagefoundry tests
|
|
73
115
|
|
|
74
116
|
- name: Format check (ruff)
|
|
117
|
+
if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
75
118
|
run: ruff format --check .
|
|
76
119
|
|
|
77
120
|
- name: Type-check (mypy, strict)
|
|
121
|
+
if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
78
122
|
run: mypy messagefoundry
|
|
79
123
|
|
|
80
124
|
# Step-level watchdog UNDER the 15-min job cap (#55): the windows-2022 leg intermittently
|
|
@@ -93,6 +137,7 @@ jobs:
|
|
|
93
137
|
# The step `timeout-minutes: 13` is the outer backstop, well under the job's 15-min cap, so a
|
|
94
138
|
# hang both watchdogs somehow miss still fails the STEP (not the whole job at the silent cap).
|
|
95
139
|
- name: Tests (pytest)
|
|
140
|
+
if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
96
141
|
timeout-minutes: 13
|
|
97
142
|
env:
|
|
98
143
|
QT_QPA_PLATFORM: offscreen
|
|
@@ -108,6 +153,13 @@ jobs:
|
|
|
108
153
|
# deployment target.
|
|
109
154
|
ide:
|
|
110
155
|
name: ide build (${{ matrix.os }})
|
|
156
|
+
# `ide` is NOT a required check, so it may be SKIPPED at the job level on a docs-only PR (saves a
|
|
157
|
+
# Linux + a 2x-billed Windows leg every docs PR). It still runs on push-to-main / on-demand and on
|
|
158
|
+
# any code PR. ci-gate does NOT `needs: ide`, so a job-level skip here can't wedge any required
|
|
159
|
+
# context. The push/dispatch arm is `push || workflow_dispatch` (NOT `!= 'pull_request'`) so the
|
|
160
|
+
# nightly `schedule` event does NOT re-run the IDE build — the cron is reserved for the load legs.
|
|
161
|
+
needs: changes
|
|
162
|
+
if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
111
163
|
runs-on: ${{ matrix.os }}
|
|
112
164
|
strategy:
|
|
113
165
|
fail-fast: false
|
|
@@ -153,18 +205,45 @@ jobs:
|
|
|
153
205
|
outputs:
|
|
154
206
|
serverdb: ${{ steps.f.outputs.serverdb }}
|
|
155
207
|
docker: ${{ steps.f.outputs.docker }}
|
|
208
|
+
# `code` is the docs-only short-circuit signal: TRUE unless this PR touches ONLY non-code paths
|
|
209
|
+
# (Markdown / docs / licence / editorconfig / git metadata). It gates the EXPENSIVE STEPS of the
|
|
210
|
+
# required `test` legs (and the whole `ide` job) — the jobs still run + report their (required)
|
|
211
|
+
# context, but on a docs-only PR they skip install+lint+type+test and go green in seconds. TRUE on
|
|
212
|
+
# push-to-main / workflow_dispatch (full coverage); FALSE on the nightly `schedule` (load-legs-only
|
|
213
|
+
# cron — the functional matrix must not re-run nightly).
|
|
214
|
+
code: ${{ steps.f.outputs.code }}
|
|
156
215
|
steps:
|
|
157
216
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
158
217
|
with:
|
|
159
218
|
fetch-depth: 0
|
|
160
219
|
- id: f
|
|
220
|
+
# Hoist the two workflow expressions into env (zizmor: no `${{ }}` interpolated into the run body
|
|
221
|
+
# — a branch name / base sha is attacker-influenceable on a fork PR, so it must arrive as data).
|
|
222
|
+
env:
|
|
223
|
+
EVENT_NAME: ${{ github.event_name }}
|
|
224
|
+
BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
|
161
225
|
run: |
|
|
162
|
-
|
|
226
|
+
# Full coverage on a push-to-main or a manual dispatch: force every gate true so the whole
|
|
227
|
+
# workflow runs. The NIGHTLY `schedule` event is deliberately NOT here — on the cron only the
|
|
228
|
+
# two load legs should run, so `changes` reports code/serverdb/docker=FALSE and every job that
|
|
229
|
+
# ORs in one of these outputs (test steps, sqlserver-store, docker-smoke) stays skipped. This is
|
|
230
|
+
# the source-of-truth half of the "cron runs only the load legs" guard (the other half is each
|
|
231
|
+
# heavy job gating its push arm as `push || workflow_dispatch`, never `!= 'pull_request'`).
|
|
232
|
+
if [ "$EVENT_NAME" = "push" ] || [ "$EVENT_NAME" = "workflow_dispatch" ]; then
|
|
163
233
|
echo "serverdb=true" >> "$GITHUB_OUTPUT"
|
|
164
234
|
echo "docker=true" >> "$GITHUB_OUTPUT"
|
|
235
|
+
echo "code=true" >> "$GITHUB_OUTPUT"
|
|
165
236
|
exit 0
|
|
166
237
|
fi
|
|
167
|
-
|
|
238
|
+
if [ "$EVENT_NAME" = "schedule" ]; then
|
|
239
|
+
# Nightly load-only run: nothing here should trigger the functional / container legs.
|
|
240
|
+
echo "serverdb=false" >> "$GITHUB_OUTPUT"
|
|
241
|
+
echo "docker=false" >> "$GITHUB_OUTPUT"
|
|
242
|
+
echo "code=false" >> "$GITHUB_OUTPUT"
|
|
243
|
+
exit 0
|
|
244
|
+
fi
|
|
245
|
+
# Remaining case: pull_request. Compute the path-based filters from the PR diff.
|
|
246
|
+
changed=$(git diff --name-only "$BASE_SHA...HEAD")
|
|
168
247
|
if echo "$changed" | grep -qE '^(messagefoundry/store/|messagefoundry/pipeline/cluster|messagefoundry/transports/database|tests/test_(sqlserver|postgres|cluster|database_connector)|\.github/workflows/ci\.yml)'; then
|
|
169
248
|
echo "serverdb=true" >> "$GITHUB_OUTPUT"
|
|
170
249
|
else
|
|
@@ -177,6 +256,26 @@ jobs:
|
|
|
177
256
|
else
|
|
178
257
|
echo "docker=false" >> "$GITHUB_OUTPUT"
|
|
179
258
|
fi
|
|
259
|
+
# `code`: CONSERVATIVE docs-only detector. Default to running everything (code=true), and only
|
|
260
|
+
# short-circuit when EVERY changed path matches the docs/non-code allowlist below. We compute it
|
|
261
|
+
# by inverting: list the files that are NOT docs-only; if that list is empty (and the diff is
|
|
262
|
+
# non-empty), it's a docs-only PR. Anything outside the allowlist — any *.py, ide/**, config,
|
|
263
|
+
# lockfiles, OTHER workflows, scripts, samples, harness — counts as CODE and runs the full suite.
|
|
264
|
+
# A path appears in `changed` even if only deleted/renamed, so a pure doc rename still short-
|
|
265
|
+
# circuits, and a code deletion still runs.
|
|
266
|
+
# Allowlisted (docs-only) paths: any *.md anywhere, docs/**, top-level LICENSE/NOTICE/AUTHORS,
|
|
267
|
+
# .editorconfig, .gitignore/.gitattributes, .github/{ISSUE_TEMPLATE,PULL_REQUEST_TEMPLATE,...}.md.
|
|
268
|
+
# Be conservative: when in doubt a path is CODE. Empty diff (shouldn't happen on a PR) => code=true.
|
|
269
|
+
noncode='(\.md$|^docs/|^LICENSE$|^NOTICE$|^AUTHORS$|^\.editorconfig$|^\.gitignore$|^\.gitattributes$|^\.github/(ISSUE_TEMPLATE/|PULL_REQUEST_TEMPLATE))'
|
|
270
|
+
if [ -z "$changed" ]; then
|
|
271
|
+
echo "code=true" >> "$GITHUB_OUTPUT"
|
|
272
|
+
elif echo "$changed" | grep -qvE "$noncode"; then
|
|
273
|
+
# At least one changed path is NOT docs-only -> run the full suite.
|
|
274
|
+
echo "code=true" >> "$GITHUB_OUTPUT"
|
|
275
|
+
else
|
|
276
|
+
# Every changed path is docs-only -> short-circuit the expensive steps.
|
|
277
|
+
echo "code=false" >> "$GITHUB_OUTPUT"
|
|
278
|
+
fi
|
|
180
279
|
|
|
181
280
|
# SQL Server service-container leg: runs the gated suites that need a real SQL Server (Linux, so 1x
|
|
182
281
|
# minutes) — the PRODUCTION store backend suite AND the PRODUCTION DATABASE connector round-trip
|
|
@@ -188,7 +287,10 @@ jobs:
|
|
|
188
287
|
sqlserver-store:
|
|
189
288
|
name: sql server (store + connector) ${{ matrix.label }}
|
|
190
289
|
needs: changes
|
|
191
|
-
|
|
290
|
+
# push-to-main / on-demand (full coverage), or a PR that touches the server-DB surface. NOT on the
|
|
291
|
+
# nightly `schedule` (the cron is reserved for the load legs only) — so written `push ||
|
|
292
|
+
# workflow_dispatch`, not `!= 'pull_request'`, which would have swept this container leg into the cron.
|
|
293
|
+
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changes.outputs.serverdb == 'true'
|
|
192
294
|
runs-on: ubuntu-latest
|
|
193
295
|
# Matrix the gated suite across every supported SQL Server major (2022 = 16.x, 2025 = 17.x) so a
|
|
194
296
|
# version-specific T-SQL / engine regression can't merge. fail-fast: false keeps a 2025-only hiccup
|
|
@@ -336,7 +438,9 @@ jobs:
|
|
|
336
438
|
# LOCKED + advisory-lock concurrency the SQLite tests can't reach.
|
|
337
439
|
postgres-store:
|
|
338
440
|
name: postgres store
|
|
339
|
-
|
|
441
|
+
# push-to-main + on-demand only (NOT the nightly `schedule`, which is reserved for the load legs —
|
|
442
|
+
# `push || workflow_dispatch`, not `!= 'pull_request'`, keeps this container leg out of the cron).
|
|
443
|
+
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
340
444
|
runs-on: ubuntu-latest
|
|
341
445
|
services:
|
|
342
446
|
postgres:
|
|
@@ -409,7 +513,11 @@ jobs:
|
|
|
409
513
|
# docs/LOAD-TESTING.md.
|
|
410
514
|
load-test:
|
|
411
515
|
name: load test (smoke, sqlite)
|
|
412
|
-
|
|
516
|
+
# Nightly schedule + on-demand only (was: every push to main). The PR gate is the in-process
|
|
517
|
+
# tests/test_load_runner.py in the `test` job; push-to-main keeps full functional + server-DB
|
|
518
|
+
# coverage. This multi-minute serve+load run no longer fires once per commit. NOT a required check,
|
|
519
|
+
# so dropping it from push is safe; ci-gate `needs` it but counts a `skipped` leg as a pass.
|
|
520
|
+
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
|
413
521
|
runs-on: ubuntu-latest
|
|
414
522
|
steps:
|
|
415
523
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
@@ -465,7 +573,10 @@ jobs:
|
|
|
465
573
|
# runs on push to main + on-demand (workflow_dispatch). Heavier SQL Server profiles run manually.
|
|
466
574
|
load-test-sqlserver:
|
|
467
575
|
name: load test (smoke, sqlserver) ${{ matrix.label }}
|
|
468
|
-
|
|
576
|
+
# Nightly schedule + on-demand only (was: every push to main); same rationale as `load-test`. The
|
|
577
|
+
# end-to-end SQL Server store path is still smoked nightly (x2 majors) + on demand, and the per-push
|
|
578
|
+
# SQL Server functional coverage stays in `sqlserver-store`. NOT required; ci-gate treats skip as pass.
|
|
579
|
+
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
|
469
580
|
runs-on: ubuntu-latest
|
|
470
581
|
# Smoke the end-to-end SQL Server store path on every supported major (2022/2025). Push/dispatch-only,
|
|
471
582
|
# so no PR cost; fail-fast: false keeps the two legs independent.
|
|
@@ -565,7 +676,10 @@ jobs:
|
|
|
565
676
|
# minutes; runs on push to main and on-demand (workflow_dispatch).
|
|
566
677
|
windows-service-smoke:
|
|
567
678
|
name: windows service smoke (${{ matrix.os }}, py${{ matrix.python-version }})
|
|
568
|
-
|
|
679
|
+
# push-to-main + on-demand only (2x-billed Windows legs). NOT on the nightly `schedule` — the cron
|
|
680
|
+
# is reserved for the load legs, so this is `push || workflow_dispatch`, not `!= 'pull_request'`
|
|
681
|
+
# (which would have run these 2x-Windows legs every night for no added signal).
|
|
682
|
+
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
569
683
|
runs-on: ${{ matrix.os }}
|
|
570
684
|
strategy:
|
|
571
685
|
fail-fast: false
|
|
@@ -731,7 +845,10 @@ jobs:
|
|
|
731
845
|
docker-smoke:
|
|
732
846
|
name: docker image smoke (slim, linux)
|
|
733
847
|
needs: changes
|
|
734
|
-
|
|
848
|
+
# push-to-main / on-demand (full coverage), or a PR that touches the image/locks/packaging. NOT on
|
|
849
|
+
# the nightly `schedule` (reserved for the load legs) — `push || workflow_dispatch`, not
|
|
850
|
+
# `!= 'pull_request'`, keeps the image build out of the cron.
|
|
851
|
+
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changes.outputs.docker == 'true'
|
|
735
852
|
runs-on: ubuntu-latest
|
|
736
853
|
steps:
|
|
737
854
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Kubernetes manifest schema + policy lint (ADR 0047 AC-4 / AC-5).
|
|
2
|
+
#
|
|
3
|
+
# Validates the docker/k8s/*.yaml manifests against the upstream Kubernetes JSON schemas (kubeconform)
|
|
4
|
+
# and asserts a few ADR-0047 HA-policy invariants on the multi-replica reference manifest, so the
|
|
5
|
+
# manifests cannot silently drift from the engine's validators / the documented HA shape.
|
|
6
|
+
#
|
|
7
|
+
# GATED SENSIBLY — additive, NOT a required check:
|
|
8
|
+
# * It runs ONLY when a manifest, this workflow, or the docker/ docs change (paths filter), so docs/code
|
|
9
|
+
# PRs that don't touch manifests skip it entirely.
|
|
10
|
+
# * It is a SEPARATE workflow, deliberately not part of ci.yml's required `ci-gate`. The required set
|
|
11
|
+
# stays: the `test` matrix + bandit + pip-audit + cla (see docs/.. main required-checks). Do NOT add
|
|
12
|
+
# "manifest lint" to branch-protection required checks unless the owner decides to promote it.
|
|
13
|
+
# * It is fast + dependency-light (a single static binary + grep assertions), so it is cheap to run.
|
|
14
|
+
|
|
15
|
+
name: manifest lint
|
|
16
|
+
|
|
17
|
+
on:
|
|
18
|
+
push:
|
|
19
|
+
branches: [main]
|
|
20
|
+
paths:
|
|
21
|
+
- "docker/k8s/**.yaml"
|
|
22
|
+
- "docker/README.md"
|
|
23
|
+
- ".github/workflows/manifest-lint.yml"
|
|
24
|
+
pull_request:
|
|
25
|
+
paths:
|
|
26
|
+
- "docker/k8s/**.yaml"
|
|
27
|
+
- "docker/README.md"
|
|
28
|
+
- ".github/workflows/manifest-lint.yml"
|
|
29
|
+
workflow_dispatch:
|
|
30
|
+
|
|
31
|
+
concurrency:
|
|
32
|
+
group: manifest-lint-${{ github.ref }}
|
|
33
|
+
cancel-in-progress: true
|
|
34
|
+
|
|
35
|
+
permissions:
|
|
36
|
+
contents: read
|
|
37
|
+
|
|
38
|
+
jobs:
|
|
39
|
+
kubeconform:
|
|
40
|
+
name: kubeconform + HA policy lint
|
|
41
|
+
runs-on: ubuntu-latest
|
|
42
|
+
timeout-minutes: 10
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
45
|
+
with:
|
|
46
|
+
persist-credentials: false # read-only lint job; don't persist the token (zizmor: artipacked)
|
|
47
|
+
|
|
48
|
+
# kubeconform = a fast, offline-capable schema validator for Kubernetes manifests. Pin the release
|
|
49
|
+
# by VERSION, then verify the downloaded tarball against the checksum the release itself publishes
|
|
50
|
+
# (CHECKSUMS file) — reproducible + tamper-evident without hardcoding a hash that would silently
|
|
51
|
+
# break on a version bump. Bump KUBECONFORM_VERSION deliberately.
|
|
52
|
+
- name: Install kubeconform
|
|
53
|
+
env:
|
|
54
|
+
KUBECONFORM_VERSION: "0.6.7"
|
|
55
|
+
run: |
|
|
56
|
+
set -euo pipefail
|
|
57
|
+
base="https://github.com/yannh/kubeconform/releases/download/v${KUBECONFORM_VERSION}"
|
|
58
|
+
# Keep the tarball's canonical name so the CHECKSUMS line ("<sha256> kubeconform-linux-amd64.tar.gz")
|
|
59
|
+
# refers to a file that actually exists in cwd — sha256sum -c verifies by the name in the line.
|
|
60
|
+
curl -fsSL "${base}/kubeconform-linux-amd64.tar.gz" -o kubeconform-linux-amd64.tar.gz
|
|
61
|
+
curl -fsSL "${base}/CHECKSUMS" -o CHECKSUMS
|
|
62
|
+
grep ' kubeconform-linux-amd64.tar.gz$' CHECKSUMS | sha256sum -c -
|
|
63
|
+
tar -xzf kubeconform-linux-amd64.tar.gz kubeconform
|
|
64
|
+
sudo install -m 0755 kubeconform /usr/local/bin/kubeconform
|
|
65
|
+
kubeconform -v
|
|
66
|
+
|
|
67
|
+
# Schema-validate every manifest. -strict rejects unknown fields (catches typos);
|
|
68
|
+
# -summary prints a per-file pass/fail roll-up. The Deployment/StatefulSet/Service/PDB kinds are all
|
|
69
|
+
# in the bundled upstream schemas, so no extra schema location is needed.
|
|
70
|
+
- name: Validate docker/k8s manifests (kubeconform -strict)
|
|
71
|
+
run: |
|
|
72
|
+
set -euo pipefail
|
|
73
|
+
kubeconform -strict -summary -verbose \
|
|
74
|
+
docker/k8s/statefulset.yaml \
|
|
75
|
+
docker/k8s/ha-postgres.yaml
|
|
76
|
+
|
|
77
|
+
# ADR-0047 HA-policy assertions on the multi-replica reference manifest. These are the artifact
|
|
78
|
+
# locks for AC-4 (PDB maxUnavailable:1 + grace > lease TTL) and AC-5 (no HPA, no L7 ingress for
|
|
79
|
+
# MLLP). Lightweight grep checks — they guard against the manifest drifting away from the decision.
|
|
80
|
+
- name: HA policy lint (ADR 0047 AC-4 / AC-5)
|
|
81
|
+
run: |
|
|
82
|
+
set -euo pipefail
|
|
83
|
+
M=docker/k8s/ha-postgres.yaml
|
|
84
|
+
fail=0
|
|
85
|
+
assert_present() { # $1 = regex, $2 = message
|
|
86
|
+
if ! grep -Eq "$1" "$M"; then echo "FAIL: $2 (expected /$1/ in $M)"; fail=1; fi
|
|
87
|
+
}
|
|
88
|
+
assert_absent() { # $1 = regex, $2 = message (ignores commented lines)
|
|
89
|
+
if grep -Ev '^\s*#' "$M" | grep -Eq "$1"; then echo "FAIL: $2 (unexpected /$1/ in $M)"; fail=1; fi
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
assert_present 'replicas:\s*3' "multi-replica HA must declare replicas: 3"
|
|
93
|
+
assert_present 'kind:\s*PodDisruptionBudget' "must ship a PodDisruptionBudget"
|
|
94
|
+
assert_present 'maxUnavailable:\s*1' "PDB must set maxUnavailable: 1 (AC-4)"
|
|
95
|
+
assert_present 'terminationGracePeriodSeconds:\s*[0-9]+' "must set terminationGracePeriodSeconds (> lease TTL, AC-4)"
|
|
96
|
+
assert_present 'MEFOR_CLUSTER_ENABLED' "must enable [cluster] (HA leader election)"
|
|
97
|
+
assert_present 'MEFOR_STORE_BACKEND' "must set a server-DB backend (SQLite is refused under [cluster])"
|
|
98
|
+
|
|
99
|
+
# AC-5 prohibitions: no HPA object, and no L7/HTTP Ingress for MLLP. An UNcommented occurrence fails.
|
|
100
|
+
assert_absent 'kind:\s*HorizontalPodAutoscaler' "no HPA for MLLP (active-passive; FIFO/single-writer) — AC-5"
|
|
101
|
+
assert_absent 'kind:\s*Ingress' "no L7/HTTP Ingress for the MLLP data plane — AC-5"
|
|
102
|
+
|
|
103
|
+
# terminationGracePeriodSeconds must exceed the default leader_lease_ttl (30s) — a numeric check.
|
|
104
|
+
grace=$(grep -Eo 'terminationGracePeriodSeconds:\s*[0-9]+' "$M" | grep -Eo '[0-9]+' | head -1)
|
|
105
|
+
if [ "${grace:-0}" -le 30 ]; then
|
|
106
|
+
echo "FAIL: terminationGracePeriodSeconds=$grace must be > leader_lease_ttl_seconds (30s default) — AC-4"
|
|
107
|
+
fail=1
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
if [ "$fail" -ne 0 ]; then
|
|
111
|
+
echo "::error::ADR-0047 HA policy lint failed — see FAIL lines above"
|
|
112
|
+
exit 1
|
|
113
|
+
fi
|
|
114
|
+
echo "ADR-0047 HA policy lint: OK"
|
|
@@ -244,3 +244,188 @@ jobs:
|
|
|
244
244
|
packages-dir: harness-dist/
|
|
245
245
|
skip-existing: true
|
|
246
246
|
attestations: true
|
|
247
|
+
|
|
248
|
+
release-console-installer:
|
|
249
|
+
# Build the FOURTH distribution artifact — the frozen, zero-Python Windows admin-console installer
|
|
250
|
+
# (PyInstaller --onedir + Inno Setup, OPTIONALLY Authenticode-signed). ADR 0032 Phase B, BACKLOG #39.
|
|
251
|
+
#
|
|
252
|
+
# This is a job INSIDE release.yml (not a separate workflow) with `needs: release`, mirroring
|
|
253
|
+
# `release-harness`: the engine ships first and `gh release create` (in the `release` job) has run, so
|
|
254
|
+
# the GitHub release provably EXISTS before this job's `gh release upload` attaches the installer to it
|
|
255
|
+
# (a separate workflow on the same tag would race release creation). A failure here is ISOLATED — it
|
|
256
|
+
# never reds the engine wheel/PyPI flow (that all completes in `release` before this starts).
|
|
257
|
+
#
|
|
258
|
+
# The ~150 MB Windows freeze runs only on a tag push (uploads the installer as a release asset) and on
|
|
259
|
+
# workflow_dispatch (builds it as an inspectable artifact, no upload) — NEVER on a PR. The console is
|
|
260
|
+
# frozen from the SAME wheel the `release` job built + smoke-checked (downloaded via the
|
|
261
|
+
# release-artifacts upload), so the frozen console and the PyPI wheel are byte-identical packaging —
|
|
262
|
+
# a source-vs-wheel resource bug can't slip through.
|
|
263
|
+
#
|
|
264
|
+
# Signing is CONDITIONAL: if WINDOWS_SIGN_CERT_BASE64 is present the exe + installer are signed; if not,
|
|
265
|
+
# the leg STILL produces an UNSIGNED installer and does NOT fail (the owner provisions the cert later —
|
|
266
|
+
# ADR 0032 §(c)). Reproducibility: PyInstaller comes from the locked deps; ISCC (Inno Setup) is pinned;
|
|
267
|
+
# signtool (Windows SDK) is the runner-provided external the ADR flags as a residual.
|
|
268
|
+
needs: release
|
|
269
|
+
runs-on: windows-2025 # x64 Windows; the Windows SDK (signtool) + choco are preinstalled
|
|
270
|
+
permissions:
|
|
271
|
+
contents: write # `gh release upload` attaches the installer to the tag's release (tag runs only)
|
|
272
|
+
# Map the signing-cert secret to a job-level boolean env ONCE, then gate the sign step on `env`.
|
|
273
|
+
# The `secrets` context is allowed in a job-level `env:` expression but NOT in a step-level `if:`
|
|
274
|
+
# (the linter/runtime reject `if: secrets.X != ''`), so this is the canonical lint-clean gate:
|
|
275
|
+
# "false" until WINDOWS_SIGN_CERT_BASE64 is provisioned -> the sign step skips, build stays green.
|
|
276
|
+
env:
|
|
277
|
+
SIGN_CONFIGURED: ${{ secrets.WINDOWS_SIGN_CERT_BASE64 != '' }}
|
|
278
|
+
# Pinned Inno Setup version (Chocolatey package `innosetup`). Bump deliberately; keep the installer
|
|
279
|
+
# reproducible alongside the wheel (ADR 0032 §(d) reproducibility hole).
|
|
280
|
+
INNO_SETUP_VERSION: "6.3.3"
|
|
281
|
+
defaults:
|
|
282
|
+
run:
|
|
283
|
+
shell: pwsh
|
|
284
|
+
steps:
|
|
285
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
286
|
+
with:
|
|
287
|
+
persist-credentials: false # gh upload uses GH_TOKEN env, never the persisted git credential
|
|
288
|
+
|
|
289
|
+
- name: Set up Python
|
|
290
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
291
|
+
with:
|
|
292
|
+
python-version: "3.14"
|
|
293
|
+
|
|
294
|
+
- name: Resolve the single-sourced version (messagefoundry.__version__)
|
|
295
|
+
id: ver
|
|
296
|
+
run: |
|
|
297
|
+
# The installer AppVersion is single-sourced from messagefoundry/__init__.py __version__ — never
|
|
298
|
+
# hard-coded in the .iss. Read it WITHOUT importing the package (no deps installed yet) so this
|
|
299
|
+
# step is cheap and import-error-proof: parse the literal from the module file.
|
|
300
|
+
$line = Select-String -Path messagefoundry/__init__.py -Pattern '^__version__\s*=\s*"([^"]+)"' | Select-Object -First 1
|
|
301
|
+
if (-not $line) { throw "could not read __version__ from messagefoundry/__init__.py" }
|
|
302
|
+
$version = $line.Matches[0].Groups[1].Value
|
|
303
|
+
Write-Host "version: $version"
|
|
304
|
+
# On a tag push, the built installer version MUST equal the tag (single-source check, mirrors
|
|
305
|
+
# the wheel smoke in the release job).
|
|
306
|
+
if ($env:GITHUB_REF_TYPE -eq 'tag') {
|
|
307
|
+
$want = $env:GITHUB_REF_NAME.TrimStart('v')
|
|
308
|
+
if ($version -ne $want) { throw "::error::__version__ $version != tag $want" }
|
|
309
|
+
}
|
|
310
|
+
"version=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
|
|
311
|
+
|
|
312
|
+
# Pull the wheel the `release` job built + smoke-checked (release-artifacts, uploaded on always()).
|
|
313
|
+
# Freezing from the SAME wheel that ships to PyPI (not the source tree) keeps the frozen console and
|
|
314
|
+
# the published wheel byte-identical packaging — ADR 0032 §(d) "install … from the just-built wheel".
|
|
315
|
+
- name: Download the just-built wheel (from the release job)
|
|
316
|
+
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
|
317
|
+
with:
|
|
318
|
+
name: release-artifacts
|
|
319
|
+
path: release-artifacts
|
|
320
|
+
|
|
321
|
+
- name: Install the console (+ PyInstaller) from the just-built wheel
|
|
322
|
+
run: |
|
|
323
|
+
python -m pip install --upgrade pip
|
|
324
|
+
# Install the engine wheel with its [console] extra (PySide6 pinned 6.11.1 in requirements.lock,
|
|
325
|
+
# keyring, httpx, truststore), then PyInstaller for the freeze. Installing the package itself
|
|
326
|
+
# makes `messagefoundry.console` importable to PyInstaller's analysis. Resolve the wheel the
|
|
327
|
+
# release job staged under release-artifacts/dist/.
|
|
328
|
+
$wheel = Get-ChildItem release-artifacts -Recurse -Filter "messagefoundry-*.whl" | Select-Object -First 1
|
|
329
|
+
if (-not $wheel) { throw "no messagefoundry wheel found in the release-artifacts download" }
|
|
330
|
+
Write-Host "freezing from wheel: $($wheel.FullName)"
|
|
331
|
+
pip install "$($wheel.FullName)[console]" pyinstaller
|
|
332
|
+
|
|
333
|
+
- name: Freeze the console (PyInstaller --onedir, windowed)
|
|
334
|
+
run: |
|
|
335
|
+
pyinstaller --noconfirm --clean packaging/console-installer/messagefoundry-console.spec
|
|
336
|
+
if (-not (Test-Path "dist/messagefoundry-console/messagefoundry-console.exe")) {
|
|
337
|
+
throw "PyInstaller did not produce dist/messagefoundry-console/messagefoundry-console.exe"
|
|
338
|
+
}
|
|
339
|
+
Get-ChildItem dist/messagefoundry-console | Select-Object -First 20 Name, Length
|
|
340
|
+
|
|
341
|
+
# Exercise the ACTUAL frozen exe (AC-B4 offline-launch + AC-B5 bundled-icon/nav-asset). These tests
|
|
342
|
+
# skip everywhere the freeze is absent, so they run only here, pointed at the bundle dir.
|
|
343
|
+
# -p no:cacheprovider keeps the runner workspace clean; the smoke launches Qt windowed (offscreen)
|
|
344
|
+
# so no display is needed.
|
|
345
|
+
- name: Frozen-exe launch smoke (AC-B4 / AC-B5)
|
|
346
|
+
env:
|
|
347
|
+
MEFOR_FROZEN_CONSOLE_DIR: dist/messagefoundry-console
|
|
348
|
+
QT_QPA_PLATFORM: offscreen
|
|
349
|
+
run: |
|
|
350
|
+
pip install pytest
|
|
351
|
+
python -m pytest tests/test_frozen_launch_smoke.py -v -p no:cacheprovider
|
|
352
|
+
|
|
353
|
+
- name: Install Inno Setup (pinned)
|
|
354
|
+
run: |
|
|
355
|
+
choco install innosetup --version=$env:INNO_SETUP_VERSION --no-progress -y
|
|
356
|
+
# ISCC.exe is not on PATH after a choco install; resolve + export it for the next step.
|
|
357
|
+
$iscc = "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe"
|
|
358
|
+
if (-not (Test-Path $iscc)) { throw "ISCC.exe not found at $iscc after choco install" }
|
|
359
|
+
"ISCC=$iscc" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
360
|
+
|
|
361
|
+
- name: Build the installer (ISCC, AppVersion injected)
|
|
362
|
+
# Pass the resolved version through the step env (NOT a ${{ }} expansion inside the run script) so
|
|
363
|
+
# the value can never be interpolated into the shell — zizmor template-injection hardening.
|
|
364
|
+
env:
|
|
365
|
+
APP_VERSION: ${{ steps.ver.outputs.version }}
|
|
366
|
+
run: |
|
|
367
|
+
& "$env:ISCC" "/DAppVersion=$env:APP_VERSION" packaging/console-installer/messagefoundry-console.iss
|
|
368
|
+
$setup = "dist/messagefoundry-console-setup-$env:APP_VERSION.exe"
|
|
369
|
+
if (-not (Test-Path $setup)) { throw "Inno Setup did not produce $setup" }
|
|
370
|
+
"SETUP_EXE=$setup" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
371
|
+
|
|
372
|
+
# Authenticode signing — CONDITIONAL on the cert secret. If WINDOWS_SIGN_CERT_BASE64 is absent the
|
|
373
|
+
# whole step is skipped (the `if:` is false), so the build NEVER fails for lack of a cert; the
|
|
374
|
+
# installer simply ships UNSIGNED until the owner provisions one (ADR 0032 §(c), AC-B3). The cert
|
|
375
|
+
# lives ONLY in CI secrets and is written to a temp file that is deleted in the same step — it
|
|
376
|
+
# never touches the workspace. Pure CI tooling (signtool) — NO Python crypto import, so the ASVS
|
|
377
|
+
# 11.1.3 crypto-inventory gate is not tripped.
|
|
378
|
+
- name: Authenticode-sign the exe + installer (if a cert secret is configured)
|
|
379
|
+
if: ${{ env.SIGN_CONFIGURED == 'true' }}
|
|
380
|
+
env:
|
|
381
|
+
SIGN_CERT_B64: ${{ secrets.WINDOWS_SIGN_CERT_BASE64 }}
|
|
382
|
+
SIGN_CERT_PASSWORD: ${{ secrets.WINDOWS_SIGN_CERT_PASSWORD }}
|
|
383
|
+
run: |
|
|
384
|
+
# signtool ships with the Windows SDK on the windows-2025 image; resolve the newest one by SDK
|
|
385
|
+
# build number (sort the numeric version dir, not the lexical path, so 10.0.26100 > 10.0.9999).
|
|
386
|
+
$signtool = Get-ChildItem "${env:ProgramFiles(x86)}\Windows Kits\10\bin\*\x64\signtool.exe" |
|
|
387
|
+
Sort-Object { [version]($_.Directory.Parent.Name) } | Select-Object -Last 1
|
|
388
|
+
if (-not $signtool) { throw "signtool.exe not found (Windows SDK missing on the runner)" }
|
|
389
|
+
Write-Host "using signtool: $($signtool.FullName)"
|
|
390
|
+
$pfx = Join-Path $env:RUNNER_TEMP "codesign.pfx"
|
|
391
|
+
try {
|
|
392
|
+
[IO.File]::WriteAllBytes($pfx, [Convert]::FromBase64String($env:SIGN_CERT_B64))
|
|
393
|
+
# $signArgs, not $args ($args is a PowerShell automatic variable — avoid the collision).
|
|
394
|
+
$signArgs = @('sign', '/f', $pfx, '/fd', 'SHA256',
|
|
395
|
+
'/tr', 'http://timestamp.digicert.com', '/td', 'SHA256')
|
|
396
|
+
if ($env:SIGN_CERT_PASSWORD) { $signArgs += @('/p', $env:SIGN_CERT_PASSWORD) }
|
|
397
|
+
# Sign the inner frozen exe first, then the installer that wraps it.
|
|
398
|
+
& $signtool.FullName @signArgs "dist/messagefoundry-console/messagefoundry-console.exe"
|
|
399
|
+
if ($LASTEXITCODE -ne 0) { throw "signtool failed on the frozen exe" }
|
|
400
|
+
& $signtool.FullName @signArgs "$env:SETUP_EXE"
|
|
401
|
+
if ($LASTEXITCODE -ne 0) { throw "signtool failed on the installer" }
|
|
402
|
+
Write-Host "Signed the frozen exe + installer (timestamped)."
|
|
403
|
+
} finally {
|
|
404
|
+
if (Test-Path $pfx) { Remove-Item $pfx -Force } # never leave the cert on disk
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
- name: Note signing status
|
|
408
|
+
run: |
|
|
409
|
+
if ($env:SIGN_CONFIGURED -eq 'true') {
|
|
410
|
+
Write-Host "Installer is SIGNED."
|
|
411
|
+
} else {
|
|
412
|
+
Write-Warning "No signing cert secret configured — the installer is UNSIGNED (SmartScreen may warn). Provision WINDOWS_SIGN_CERT_BASE64 to sign (ADR 0032 Phase B)."
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
# Always upload the installer as a workflow artifact (inspectable on workflow_dispatch dry-runs).
|
|
416
|
+
- name: Upload the installer artifact (dry-run / always)
|
|
417
|
+
if: always()
|
|
418
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
419
|
+
with:
|
|
420
|
+
name: console-installer
|
|
421
|
+
path: dist/messagefoundry-console-setup-*.exe
|
|
422
|
+
if-no-files-found: warn
|
|
423
|
+
|
|
424
|
+
# Attach to the GitHub release — TAG-GATED only (a workflow_dispatch dry-run skips this). `needs:
|
|
425
|
+
# release` guarantees `release`'s `gh release create` already ran, so the release exists; --clobber
|
|
426
|
+
# lets a re-run replace the asset.
|
|
427
|
+
- name: Attach the installer to the GitHub release
|
|
428
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
429
|
+
env:
|
|
430
|
+
GH_TOKEN: ${{ github.token }}
|
|
431
|
+
run: gh release upload "$env:GITHUB_REF_NAME" "$env:SETUP_EXE" --clobber
|