messagefoundry 0.2.10__tar.gz → 0.2.12__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.10 → messagefoundry-0.2.12}/.github/workflows/ci.yml +200 -11
- messagefoundry-0.2.12/.github/workflows/manifest-lint.yml +114 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/release.yml +189 -0
- messagefoundry-0.2.12/.github/workflows/selfhosted-win2025-sql.yml +85 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.gitignore +4 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/CHANGELOG.md +148 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/PKG-INFO +1 -1
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/README.md +17 -6
- messagefoundry-0.2.12/docker/compose.yaml +201 -0
- messagefoundry-0.2.12/docker/k8s/ha-postgres.yaml +242 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/k8s/secret.example.yaml +12 -2
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/k8s/statefulset.yaml +4 -2
- messagefoundry-0.2.12/docs/ANTIVIRUS-FIREWALL.md +219 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/BACKLOG.md +1039 -65
- messagefoundry-0.2.12/docs/BRAND.md +103 -0
- messagefoundry-0.2.12/docs/CLOUD-DEPLOYMENT.md +306 -0
- messagefoundry-0.2.12/docs/CLOUD-PHI-HIPAA.md +185 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CLUSTERING.md +7 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CONFIGURATION.md +5 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CONTAINER-EXPOSURE-EVALUATION.md +5 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/DEPLOYMENT.md +24 -7
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/FEATURE-MAP.md +2 -2
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/PHI.md +1 -0
- messagefoundry-0.2.12/docs/POSITIONING.md +70 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/SERVICE.md +14 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/THROUGHPUT-IMPROVEMENTS.md +68 -15
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0001-staged-pipeline-architecture.md +6 -1
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0023-inbound-http-listener.md +1 -1
- messagefoundry-0.2.12/docs/adr/0032-console-desktop-launch.md +347 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0040-free-threaded-engine-support.md +9 -6
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0044-operator-alert-state.md +1 -1
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0045-custom-rbac-roles.md +1 -1
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0046-message-content-search.md +1 -1
- messagefoundry-0.2.12/docs/adr/0047-cloud-kubernetes-ha-deployment-packaging.md +325 -0
- messagefoundry-0.2.12/docs/adr/0048-third-tier-disaster-recovery-standby.md +648 -0
- messagefoundry-0.2.12/docs/adr/0049-turnkey-dr-backup-restore-verify.md +525 -0
- messagefoundry-0.2.12/docs/adr/0050-single-project-root-config-anchoring.md +404 -0
- messagefoundry-0.2.12/docs/adr/0051-corepoint-throughput-parity-strategy.md +183 -0
- messagefoundry-0.2.12/docs/adr/0052-enterprise-scale-target.md +101 -0
- messagefoundry-0.2.12/docs/adr/0053-free-threaded-multicore-engine.md +249 -0
- messagefoundry-0.2.12/docs/adr/0054-low-allocation-builtins-hl7-parser.md +221 -0
- messagefoundry-0.2.12/docs/adr/0055-group-commit-durable-write.md +152 -0
- messagefoundry-0.2.12/docs/adr/0056-engine-managed-vip-failover.md +643 -0
- messagefoundry-0.2.12/docs/adr/0057-inline-step-a-fast-path.md +184 -0
- messagefoundry-0.2.12/docs/adr/0058-batch-claim-fifo-prefix.md +251 -0
- messagefoundry-0.2.12/docs/adr/0059-seq-only-fifo-ordering.md +55 -0
- messagefoundry-0.2.12/docs/adr/0060-rename-based-fifo-index-migration.md +78 -0
- messagefoundry-0.2.12/docs/adr/0061-per-lane-wake-events.md +106 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/README.md +18 -10
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/step-b-write-amplification.md +16 -2
- messagefoundry-0.2.12/docs/design/freethread-spike.md +177 -0
- messagefoundry-0.2.12/docs/releases/MULTISESSION-PLAN-6.md +258 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/research/cloud-deployment-research-2026-06.md +10 -4
- messagefoundry-0.2.12/docs/throughput-build-plan.md +102 -0
- messagefoundry-0.2.12/docs/throughput-roadmap.md +361 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/__main__.py +76 -2
- messagefoundry-0.2.12/harness/config/connscale/__init__.py +4 -0
- messagefoundry-0.2.12/harness/config/connscale/_shape.py +111 -0
- messagefoundry-0.2.12/harness/config/connscale/gen_toml.py +106 -0
- messagefoundry-0.2.12/harness/config/connscale/graph.py +91 -0
- messagefoundry-0.2.12/harness/load/connscale/__init__.py +14 -0
- messagefoundry-0.2.12/harness/load/connscale/driver.py +135 -0
- messagefoundry-0.2.12/harness/load/connscale/probe.py +113 -0
- messagefoundry-0.2.12/harness/load/connscale/profile.py +364 -0
- messagefoundry-0.2.12/harness/load/connscale/report.py +300 -0
- messagefoundry-0.2.12/harness/load/connscale/runner.py +622 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/enginepoll.py +99 -3
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/failover.py +6 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profile.py +5 -1
- messagefoundry-0.2.12/harness/load/profiles/connscale-smoke.toml +31 -0
- messagefoundry-0.2.12/harness/load/profiles/connscale.toml +35 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/report.py +10 -2
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/__init__.py +1 -1
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/__main__.py +538 -17
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/app.py +195 -11
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/models.py +82 -2
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/permissions.py +4 -2
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/checks.py +35 -4
- messagefoundry-0.2.12/messagefoundry/config/anchor.py +169 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/connections_file.py +9 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/environments.py +20 -2
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/ingest_time.py +8 -1
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/models.py +25 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/settings.py +357 -1
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/wiring.py +47 -3
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/connections.py +9 -4
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/status.py +12 -1
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/theme.py +3 -1
- messagefoundry-0.2.12/messagefoundry/parsing/_backend.py +47 -0
- messagefoundry-0.2.12/messagefoundry/parsing/_builtin_hl7.py +687 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/message.py +91 -7
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/peek.py +56 -5
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/alert_sinks.py +6 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/alerts.py +15 -0
- messagefoundry-0.2.12/messagefoundry/pipeline/connscale_shim.py +115 -0
- messagefoundry-0.2.12/messagefoundry/pipeline/dr.py +459 -0
- messagefoundry-0.2.12/messagefoundry/pipeline/dr_backup.py +872 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/engine.py +205 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/wiring_runner.py +711 -243
- messagefoundry-0.2.12/messagefoundry/store/backup_codec.py +290 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/base.py +273 -3
- messagefoundry-0.2.12/messagefoundry/store/pool_metrics.py +145 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/postgres.py +286 -96
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/sqlserver.py +271 -52
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/store.py +811 -306
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/support/bundle.py +1 -0
- messagefoundry-0.2.12/packaging/console-installer/README.md +126 -0
- messagefoundry-0.2.12/packaging/console-installer/THIRD-PARTY-NOTICES.md +102 -0
- messagefoundry-0.2.12/packaging/console-installer/THIRD-PARTY-NOTICES.txt +131 -0
- messagefoundry-0.2.12/packaging/console-installer/console_launcher.py +31 -0
- messagefoundry-0.2.12/packaging/console-installer/licenses/GPL-3.0.txt +674 -0
- messagefoundry-0.2.12/packaging/console-installer/licenses/LGPL-3.0.txt +165 -0
- messagefoundry-0.2.12/packaging/console-installer/messagefoundry-console.iss +120 -0
- messagefoundry-0.2.12/packaging/console-installer/messagefoundry-console.spec +188 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/requirements.lock +19 -19
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/security/crypto_inventory_check.py +9 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/worktree/new.ps1 +4 -4
- messagefoundry-0.2.12/tests/test_backup_crypto.py +144 -0
- messagefoundry-0.2.12/tests/test_backup_restore_atleastonce.py +76 -0
- messagefoundry-0.2.12/tests/test_backup_runner.py +373 -0
- messagefoundry-0.2.12/tests/test_batch_claim_fifo.py +371 -0
- messagefoundry-0.2.12/tests/test_batch_claim_locking.py +208 -0
- messagefoundry-0.2.12/tests/test_batch_claim_worker.py +154 -0
- messagefoundry-0.2.12/tests/test_builtin_hl7_parity.py +620 -0
- messagefoundry-0.2.12/tests/test_cli_offline_resolution.py +250 -0
- messagefoundry-0.2.12/tests/test_config_anchoring.py +481 -0
- messagefoundry-0.2.12/tests/test_connscale_config.py +85 -0
- messagefoundry-0.2.12/tests/test_connscale_driver.py +105 -0
- messagefoundry-0.2.12/tests/test_connscale_postgres.py +110 -0
- messagefoundry-0.2.12/tests/test_connscale_profile.py +107 -0
- messagefoundry-0.2.12/tests/test_connscale_report.py +150 -0
- messagefoundry-0.2.12/tests/test_connscale_smoke.py +143 -0
- messagefoundry-0.2.12/tests/test_dr_activation.py +187 -0
- messagefoundry-0.2.12/tests/test_dr_api_status.py +94 -0
- messagefoundry-0.2.12/tests/test_dr_failback.py +114 -0
- messagefoundry-0.2.12/tests/test_dr_rbac.py +143 -0
- messagefoundry-0.2.12/tests/test_dr_run_profile.py +183 -0
- messagefoundry-0.2.12/tests/test_dr_seeding.py +216 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_enginepoll_aggregate.py +2 -0
- messagefoundry-0.2.12/tests/test_fifo_index_migration.py +426 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_fifo_ordering.py +2 -1
- messagefoundry-0.2.12/tests/test_frozen_launch_smoke.py +115 -0
- messagefoundry-0.2.12/tests/test_group_commit.py +625 -0
- messagefoundry-0.2.12/tests/test_inline_fast_path.py +525 -0
- messagefoundry-0.2.12/tests/test_license_notice.py +76 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_config.py +7 -3
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_report.py +17 -3
- messagefoundry-0.2.12/tests/test_per_lane_wake.py +322 -0
- messagefoundry-0.2.12/tests/test_pool_warm.py +395 -0
- messagefoundry-0.2.12/tests/test_priority_resolution.py +128 -0
- messagefoundry-0.2.12/tests/test_release_console_installer.py +195 -0
- messagefoundry-0.2.12/tests/test_restore_verify.py +102 -0
- messagefoundry-0.2.12/tests/test_seq_only_fifo.py +463 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_settings.py +115 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sqlserver_cursor_close.py +5 -1
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sqlserver_schema_init.py +44 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_staged_pipeline.py +21 -21
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_supervisor.py +51 -0
- messagefoundry-0.2.12/tests/test_synchronous_baseline.py +190 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/uv.lock +21 -21
- messagefoundry-0.2.10/docker/compose.yaml +0 -84
- messagefoundry-0.2.10/docs/adr/0032-console-desktop-launch.md +0 -86
- messagefoundry-0.2.10/docs/adr/0048-third-tier-disaster-recovery-standby.md +0 -216
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.claude/settings.json +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.dockerignore +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.gitattributes +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/CODEOWNERS +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/SECURITY.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/dependabot.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/benchmark.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/cla.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/codeql.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/dependabot-auto-merge.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/dependabot-lock-resync.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/freethread-smoke.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/release-sync-check.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/scorecard.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/security.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/workflows/vuln-metrics.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.github/zizmor.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.gitleaks.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.mefor-hooks/pre-commit +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.pre-commit-config.yaml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/.semgrep/messagefoundry.yml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/CLA.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/CLAUDE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/CODE_OF_CONDUCT.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/COMMERCIAL-LICENSE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/CONTRIBUTING.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/GOVERNANCE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/LICENSE +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/MAINTAINERS.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/NOTICE +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/README.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/Dockerfile +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/locks/requirements-core.lock +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/locks/requirements-sqlserver.lock +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/secrets.env.example +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/smoke/Dockerfile +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/smoke/config/IB_Test_ADT.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docker/smoke/send_adt.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/ADOPTER-CI.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/AI.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/ARCHITECTURE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CI-QUALITY.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CODESETS.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CONNECTIONS.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CONTRIBUTOR-FIRST-ISSUES.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/CONTRIBUTOR-PROGRAM-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/COUNSEL-ENGAGEMENT-BRIEF.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/DEPLOY-SERVER-DB.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/DICOM.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/DUAL_LICENSING_PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/EARLY-ADOPTER-GUIDE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/HL7-VALIDATION.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/INSTALL-GUIDE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/LOAD-TESTING.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/MENTAL-MODEL.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/MessageFoundry-Mental-Model.docx +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/REMOTE-CONSOLE-CUSTOMER-GUIDE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/REMOTE-CONSOLE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/SECURITY-REMEDIATION-LEDGER.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/SECURITY.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/SUPPORT-POLICY.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/SYSTEM-REQUIREMENTS.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/Secure_AI_Development_Standards.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/Secure_Development_Standards.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/TEE-RELAY.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/USER-GUIDE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/WORKTREES.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0002-phase2-transport-security-and-strong-auth.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0003-non-hl7-transports-database-rest-soap.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0004-payload-agnostic-ingress.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0005-transform-accessible-state.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0006-external-data-lookups.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0007-gui-manageable-connections-toml.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0008-cluster-observability-api.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0009-run-scoped-context-providers.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0010-handler-callable-db-lookup.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0011-timer-scheduled-source.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0012-x12-edi-codec.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0013-increment-2-reingress-design.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0013-query-response-orchestration.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0014-alerting-rules-engine.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0016-synchronous-x12-request-response.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0017-consumer-deployment-model.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0018-per-message-signatures-accepted-risk.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0020-protocol-diagnostic-capture.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0022-fhir-resource-codec-rest-client.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0024-smart-backend-services-token-provider.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0025-dicom-codec-store-connectors.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0026-off-box-egress-update-check.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0027-per-connection-retention.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0028-base64-binary-carriage-codec.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0029-email-smtp-destination.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0030-anonymization-test-harness-tee.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0031-startup-connection-fault-isolation.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0033-gui-manageable-code-sets.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0034-static-analysis-triage-policy-accepted-risk-register.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0035-ide-extension-workspace-trust-and-scope.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0036-windows-config-source-trust.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0037-multi-process-sharding-l3.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0038-internal-pass-through-connector.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0039-database-tier-sharding-l5.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0041-load-path-attestation-and-change-attribution.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0042-embedded-document-pruning.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/0043-fhir-read-lookup.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/adr/TEMPLATE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-components.png +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-components.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-config-graph.png +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-config-graph.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-diagram.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-message-flow.png +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-message-flow.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-topology.png +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/architecture-topology.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/TUNING-BASELINE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/design/dbshard.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/design/freethread.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/design/multiproc.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/hl7-message-ordering-reference.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/message-ordering-design.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/DOGFOOD-BACKLOG-MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/MULTISESSION-PLAN-3.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/MULTISESSION-PLAN-4.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/MULTISESSION-PLAN-5.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/MULTISESSION-PLAN-v0.2.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/MULTISESSION-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/PLAN-3-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/V0.2-LANE-HANDOFFS.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/v0.1-EXECUTION-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/v0.1-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/research/config-ux-review.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/research/non-hl7-transform-components.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/reviews/DEPENDENCY-INFOSEC-POSTURE-2026-06-23.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/reviews/FULL-REVIEW-2026-06-10.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ADVISORY-PROCESS.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-L2-PHASE0-CHANGES.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-L2-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-L3-ASSESSMENT.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/ASVS-L3-STATUS.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/BEYOND-ASVS-L3.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/DEP-CVE-RUNBOOK.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/DEPENDENCY-METRICS.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/MEFOR-Code-Review-Checklist.xlsx +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/PHASE-8C-RBAC.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/PUBLISHING.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/RCA-TEMPLATE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/RELEASE-GATE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/REVIEW-2026-06-07.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SDS-REMEDIATION-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SECURITY-POSTURE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SOUP-DEPENDENCY-HANDLING.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SOUP-REVIEW-2026-06-18.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/SOUP-REVIEW-PROCEDURE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/security/THREAT-MODEL.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/testing/VERIFY.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/testing/WIN2025-ACCEPTANCE.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/testing/WIN2025-TEST-MATRIX.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/docs/testing/WIN2025-TEST-PLAN.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/environments/dev.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/environments/prod.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/README.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/__main__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/matrix.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/probes.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/report.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/acceptance/runner.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/compose.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/config/coverage.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/config/load/_shape.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/config/load/graph.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/config/passthrough/graph.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/config/store_once/graph.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/file_panel.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/file_transport.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/corpus.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/correlator.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/failover_track.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/governor.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/ids.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/metrics.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/README.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/adt-fanout-stress.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/closed-loop.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/failover.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/fanout-baseline.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/malformed-load.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/reference.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/smoke-sqlserver.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/smoke.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/soak.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/spike-burst.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/sustained-overload.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/profiles/writeamp.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/runner.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/sender.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/load/sink.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/mllp.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/monitor.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/receive.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/__main__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/capture.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/compare.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/normalize.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/reconcile/report.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/scenarios.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/send.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/harness/window.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/.gitignore +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/.vscodeignore +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/README.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/esbuild.js +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/media/hl7schema.json +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/media/icon-amber.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/media/icon.png +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/media/icon.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/package-lock.json +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/package.json +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/snippets/messagefoundry.code-snippets +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/aiPolicy.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/alertEditor.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/auth.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/chat.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/cli.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/codeSetEditor.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/codesetsTree.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/completion.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/connectionEditor.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/editorToolbar.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/engineClient.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/engineTarget.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/extension.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/generate.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/git.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/graphTree.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/home.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/insertElement.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/newRoute.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/promote.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/promoteTarget.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/sourceControl.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/runTest.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/ai-policy.test.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/chat.test.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/editor-toolbar.test.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/engine-target.test.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/extension.test.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/index.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/insert-element.test.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/promote-target.test.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/pythonpath.test.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/test/suite/settings-scope.test.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/testBench.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/src/validate.ts +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/tsconfig.json +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/ide/tsconfig.test.json +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/mefor.code-workspace +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/adr_analyze.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/_pools.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/hl7.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/keying.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/leak.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/rules.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/anon/surrogates.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/approvals.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/auth_models.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/auth_routes.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/field_authz.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/metrics.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/security.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/api/tls.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/data/common_passwords.txt +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/identity.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/ldap.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/notifications.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/passwords.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/policy.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/ratelimit.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/service.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/tokens.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/auth/totp.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/active_environment.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/ai_policy.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/alerts_edit.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/code_sets.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/codeset_edit.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/connections_edit.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/db_lookup.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/fhir_lookup.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/fingerprint.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/reference.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/response.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/run_context.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/state.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/config/tls_policy.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/__main__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/_async.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/alerts_page.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/change_password.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/client.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/dead_letters_page.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/delegates.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/event_log_page.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/alerts.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/connections.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/dead-letters.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/engine-status.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/log-search.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/logo-lockup.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/icons/users.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/login.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/mfa.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/reauth.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/resources/README.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/resources/app.ico +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/resources/app.svg +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/search.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/service_control.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/sessions.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/shards.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/shell.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/users_page.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/console/widgets.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/README.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/_core.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/_hl7data.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/adt.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/all_types.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/bar.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/dft.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/documents.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/mdm.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/mfn.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/oml.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/orl.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/orm.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/oru.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/ras.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/rde.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/siu.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/generators/vxu.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/hl7schema.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/integrity.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/last_resort.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/logging_setup.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/binary.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/consistency.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/_deps.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/_util.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/dataset.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/errors.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/hl7_map.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/dicom/peek.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/fhir/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/fhir/_deps.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/fhir/errors.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/fhir/peek.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/fhir/resource.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/groups.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/split.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/summary.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/tree.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/validate.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/_deps.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/delimiters.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/errors.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/interchange.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/message.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/peek.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/x12/validate.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/_deps.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/errors.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/harden.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/message.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/schema.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/parsing/xml/signature.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/cert_expiry.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/cluster.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/cluster_sqlserver.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/config_convergence.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/dryrun.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/leader_tasks.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/reference_sync.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/retention.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/security_notify.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/sharding.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/state_convergence.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/supervisor.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/pipeline/update_check.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/py.typed +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/redaction.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/scaffold.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/secrets_dpapi.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/audit_tee.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/content_search.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/crypto.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/document_strip.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/store/keyprovider.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/support/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/support/redact.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/timezone.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/base.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/database.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/dicom.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/dicomweb.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/email.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/fhir.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/file.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/framing.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/http_listener.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/loopback.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/mllp.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/passthrough.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/remotefile.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/rest.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/signing.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/smart.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/soap.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/tcp.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/timer.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/transports/x12.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/checks.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/model.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/report.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/runner.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/messagefoundry/verify/smoke.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/packaging/messagefoundry-harness/README.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/packaging/messagefoundry-harness/pyproject.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/pyproject.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_ACME_ADT.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_FHIR_INTAKE.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_IMMUNIZATION_VXU.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_PARTNER_X12.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_RADIOLOGY_SR.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/IB_RTE_ELIGIBILITY.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/adt.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/codesets/event_labels.csv +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/codesets/facility_mnemonics.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/config/connections.toml +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/consistency/validated_adt.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/dicom/generate_sr_sample.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/adt_a01.hl7 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/adt_batch.hl7 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/.gitattributes +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/README.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/adt_a01.txt +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/adt_a03.txt +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/batch_18_messages.txt +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/omd_o03.txt +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/omd_o03_rep.txt +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/hapi-hl7v2/oml_o21.hl7 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/messages/x12_270_eligibility.edi +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/results_relay/README.md +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/results_relay/codesets/test_codes.csv +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/results_relay/messages/oru_all_cancelled.hl7 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/results_relay/messages/oru_results.hl7 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/results_relay/results_relay.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/samples/send_mllp.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/console/install-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/console/pack_ico.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/console/uninstall-console-shortcut.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/dev/postgres.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/dev/sqlserver-docker.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/dev/sqlserver.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/hooks/block-blanket-git-stage.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/publish/check_release_sync.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/publish/publish-denylist.txt +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/publish/publish.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/publish/scan_forbidden.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/security/vuln_metrics.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/service/import-db-ca.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/service/install-service.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/service/uninstall-service.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/trace_icon.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/worktree/remove.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/worktree/session-context.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/scripts/worktree/spawn.ps1 +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/__main__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/__init__.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/_hl7data.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/_pools.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/hl7.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/keying.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/leak.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/rules.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/anon/surrogates.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/compare.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/correlate.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/hl7_fields.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/mefor_api.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/mllp.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/relay.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/report.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tee/store.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/_dicom_sample.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/_failover_load_support.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/_fhir_fixtures.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/conftest.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_acceptance_framework.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ack_capture_runner.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ack_sent_store.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_active_environment.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ad_group_scope.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_admin_new_ip.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_adr_analyze.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ai_policy.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_alert_rules.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_alert_sinks.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_alert_state.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_alerts_edit.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_alerts_rules_api.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_anon_core.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_anon_integration.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_anon_parity.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_api.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_api_alerts.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_api_auth.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_api_reload.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_api_tls.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_approvals.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_asvs_phase0.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_audit_integrity.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_audit_offbox_tee.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_core.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_entry_hardening.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_hardening.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_service.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_session_lifecycle.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_auth_store.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_binary_carriage.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_bootstrap_admin_perms.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cert_expiry.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_channel_rbac.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_checks.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_checks_lint.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cli.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cluster.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cluster_failover_postgres.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cluster_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cluster_graph_gating.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_cluster_lease.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_code_sets.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_codeset_edit.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_config_fingerprint.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_config_source_trust.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_api.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_event_api.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_event_emit.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_event_outbound.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_event_scope.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_event_store.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connection_resilience.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connections_cli.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_connections_file.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_consistency.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_alerts.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_auth.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_client.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_dead_letters.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_event_log.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_hardening.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_icon.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_password.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_sessions.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_shards.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_status.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_step_up.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_theme.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_users.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_console_widgets.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_content_search.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_custom_roles.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_database_connector_integration.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_database_transport.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_db_lookup.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_db_lookup_live_runner.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_delivery_settings.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dependabot_automerge_guardrails.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dependency_boundaries.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicom_codec.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicom_scp.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicom_scp_security.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicom_scu.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicom_wiring.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dicomweb.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_docs_runbooks.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dryrun.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_dual_control_reload.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ed_documents.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ed_documents_e2e.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_egress_allowlist.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_email_destination.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_embedded_document_pruning.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_environments.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_fhir_lookup.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_fhir_parsing.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_fhir_resource.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_fhir_transport.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_field_authz.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_field_authz_metadata.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_generate_cli.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_generated_adt.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_generators_core.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_generators_types.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_groups.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_compose.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_config.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_faults.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_file.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_monitor.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_harness_scenarios.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_hl7_core_features.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_hl7schema.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_inbound_bind.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_inbound_http_source.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ingest_time.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_keyprovider.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_last_admin_guard.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_last_resort.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_leader_tasks.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_listener_tls_exposure.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_corpus.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_failover_postgres.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_failover_sqlserver.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_failover_unit.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_metrics.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_profile.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_runner.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_sender.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_load_sink.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_logging.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_message.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_message_split.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_message_timestamps.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_metrics_exporter.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_mfa.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_mllp_encoding_override.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_mllp_tls.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_nonhl7_ingress_size_cap.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_operability_config.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_outbound_signing.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_outbound_simulate.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_packaging.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_parse_tree.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_parsing.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_passthrough.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_passthrough_graph.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_payload_agnostic_ingress.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_per_connection_retention.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_postgres_store.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_reconcile_capture.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_reconcile_compare.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_reconcile_harness.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_redaction.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_reference_sets.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_reingress.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_remotefile_transport.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_response_capture.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_rest_transport.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_retention.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_run_context.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_scaffold.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_scaffold_requirements.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_scan_forbidden.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_secrets_dpapi.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_security_notify.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_security_static.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_service_control.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sharding.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sibling_helper_finder.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_smart_backend.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_soap_transport.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_soap_wssecurity.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sqlserver_coordinator.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_sqlserver_store.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_startup_attestation.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_startup_fault_isolation.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_stats_reset.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_step_up.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_backend.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_encryption.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_file_hardening.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_once_deliver_many.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_once_graph.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_read_pool.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_store_ssl.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_summary.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_support_bundle.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_task_resilience.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tcp_transport.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_cli.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_compare.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_correlate.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_hl7_fields.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_mefor_api.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_mllp.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_relay.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_report.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tee_store.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_timer_source.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_timezone.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_tls_policy.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_totp.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_totp_window.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_transform_offloop.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_transform_state.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_transports.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_update_check.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_verify.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_version.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_win2025_acceptance.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_wiring.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_wiring_engine.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_wiring_reload.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_wiring_serve.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_ws_stats_revalidation.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_x12_parsing.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_x12_rte.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_x12_source_ip_allowlist.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_x12_transport.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_x12_validate.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_xml_message.py +0 -0
- {messagefoundry-0.2.10 → messagefoundry-0.2.12}/tests/test_xml_schema_signature.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
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
|
|
@@ -71,12 +110,15 @@ jobs:
|
|
|
71
110
|
pip install -e ".[dev,console,fhir,dicom,x12,xml]"
|
|
72
111
|
|
|
73
112
|
- name: Lint (ruff)
|
|
113
|
+
if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
74
114
|
run: ruff check messagefoundry tests
|
|
75
115
|
|
|
76
116
|
- name: Format check (ruff)
|
|
117
|
+
if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
77
118
|
run: ruff format --check .
|
|
78
119
|
|
|
79
120
|
- name: Type-check (mypy, strict)
|
|
121
|
+
if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
80
122
|
run: mypy messagefoundry
|
|
81
123
|
|
|
82
124
|
# Step-level watchdog UNDER the 15-min job cap (#55): the windows-2022 leg intermittently
|
|
@@ -95,6 +137,7 @@ jobs:
|
|
|
95
137
|
# The step `timeout-minutes: 13` is the outer backstop, well under the job's 15-min cap, so a
|
|
96
138
|
# hang both watchdogs somehow miss still fails the STEP (not the whole job at the silent cap).
|
|
97
139
|
- name: Tests (pytest)
|
|
140
|
+
if: needs.changes.outputs.code == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
98
141
|
timeout-minutes: 13
|
|
99
142
|
env:
|
|
100
143
|
QT_QPA_PLATFORM: offscreen
|
|
@@ -110,6 +153,13 @@ jobs:
|
|
|
110
153
|
# deployment target.
|
|
111
154
|
ide:
|
|
112
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'
|
|
113
163
|
runs-on: ${{ matrix.os }}
|
|
114
164
|
strategy:
|
|
115
165
|
fail-fast: false
|
|
@@ -155,18 +205,45 @@ jobs:
|
|
|
155
205
|
outputs:
|
|
156
206
|
serverdb: ${{ steps.f.outputs.serverdb }}
|
|
157
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 }}
|
|
158
215
|
steps:
|
|
159
216
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
160
217
|
with:
|
|
161
218
|
fetch-depth: 0
|
|
162
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 }}
|
|
163
225
|
run: |
|
|
164
|
-
|
|
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
|
|
165
233
|
echo "serverdb=true" >> "$GITHUB_OUTPUT"
|
|
166
234
|
echo "docker=true" >> "$GITHUB_OUTPUT"
|
|
235
|
+
echo "code=true" >> "$GITHUB_OUTPUT"
|
|
167
236
|
exit 0
|
|
168
237
|
fi
|
|
169
|
-
|
|
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")
|
|
170
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
|
|
171
248
|
echo "serverdb=true" >> "$GITHUB_OUTPUT"
|
|
172
249
|
else
|
|
@@ -179,6 +256,26 @@ jobs:
|
|
|
179
256
|
else
|
|
180
257
|
echo "docker=false" >> "$GITHUB_OUTPUT"
|
|
181
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
|
|
182
279
|
|
|
183
280
|
# SQL Server service-container leg: runs the gated suites that need a real SQL Server (Linux, so 1x
|
|
184
281
|
# minutes) — the PRODUCTION store backend suite AND the PRODUCTION DATABASE connector round-trip
|
|
@@ -190,7 +287,10 @@ jobs:
|
|
|
190
287
|
sqlserver-store:
|
|
191
288
|
name: sql server (store + connector) ${{ matrix.label }}
|
|
192
289
|
needs: changes
|
|
193
|
-
|
|
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'
|
|
194
294
|
runs-on: ubuntu-latest
|
|
195
295
|
# Matrix the gated suite across every supported SQL Server major (2022 = 16.x, 2025 = 17.x) so a
|
|
196
296
|
# version-specific T-SQL / engine regression can't merge. fail-fast: false keeps a 2025-only hiccup
|
|
@@ -331,6 +431,33 @@ jobs:
|
|
|
331
431
|
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
332
432
|
run: pytest tests/test_load_failover_sqlserver.py -v
|
|
333
433
|
|
|
434
|
+
- name: Run the throughput-lever backend invariants on real SQL Server (B1 inline, B2 batch-claim, ...)
|
|
435
|
+
env:
|
|
436
|
+
MEFOR_TEST_SQLSERVER: "1"
|
|
437
|
+
MEFOR_STORE_BACKEND: sqlserver
|
|
438
|
+
MEFOR_STORE_SERVER: localhost
|
|
439
|
+
MEFOR_STORE_PORT: "1433"
|
|
440
|
+
MEFOR_STORE_DATABASE: MessageFoundry
|
|
441
|
+
MEFOR_STORE_AUTH: sql
|
|
442
|
+
MEFOR_STORE_USERNAME: sa
|
|
443
|
+
MEFOR_STORE_PASSWORD: "Str0ng_P@ssw0rd!"
|
|
444
|
+
MEFOR_STORE_TRUST_SERVER_CERTIFICATE: "true"
|
|
445
|
+
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
446
|
+
# The staged-pipeline throughput levers (ADR 0057 inline fast-path, ADR 0058 batch-claim, ...) carry
|
|
447
|
+
# reliability-core invariant tests — crash-replay, poison-bound, and the per-lane-FIFO locked-head-
|
|
448
|
+
# BLOCKS (#285) gate — that are MEFOR_TEST_SQLSERVER-gated but live in their OWN files, so the named
|
|
449
|
+
# suites above never picked them up and they ran only on SQLite. Run them here against the real
|
|
450
|
+
# backend. APPEND each new lever's test file per docs/throughput-build-plan.md.
|
|
451
|
+
run: >-
|
|
452
|
+
pytest -v
|
|
453
|
+
tests/test_inline_fast_path.py
|
|
454
|
+
tests/test_batch_claim_fifo.py
|
|
455
|
+
tests/test_batch_claim_worker.py
|
|
456
|
+
tests/test_batch_claim_locking.py
|
|
457
|
+
tests/test_seq_only_fifo.py
|
|
458
|
+
tests/test_fifo_index_migration.py
|
|
459
|
+
tests/test_per_lane_wake.py
|
|
460
|
+
|
|
334
461
|
# Postgres store backend (Track B): run the gated store suite against a real PostgreSQL service
|
|
335
462
|
# container (Linux, so 1x minutes). Skipped on PRs like the other server-DB job to save spend; runs
|
|
336
463
|
# on push to main and on-demand (workflow_dispatch — use `gh workflow run ci.yml --ref <branch>` to
|
|
@@ -338,7 +465,9 @@ jobs:
|
|
|
338
465
|
# LOCKED + advisory-lock concurrency the SQLite tests can't reach.
|
|
339
466
|
postgres-store:
|
|
340
467
|
name: postgres store
|
|
341
|
-
|
|
468
|
+
# push-to-main + on-demand only (NOT the nightly `schedule`, which is reserved for the load legs —
|
|
469
|
+
# `push || workflow_dispatch`, not `!= 'pull_request'`, keeps this container leg out of the cron).
|
|
470
|
+
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
342
471
|
runs-on: ubuntu-latest
|
|
343
472
|
services:
|
|
344
473
|
postgres:
|
|
@@ -402,6 +531,53 @@ jobs:
|
|
|
402
531
|
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
403
532
|
run: pytest tests/test_load_failover_postgres.py -v
|
|
404
533
|
|
|
534
|
+
- name: Run the throughput-lever backend invariants on real Postgres (B1 inline, B2 batch-claim, ...)
|
|
535
|
+
env:
|
|
536
|
+
MEFOR_TEST_POSTGRES: "1"
|
|
537
|
+
MEFOR_STORE_BACKEND: postgres
|
|
538
|
+
MEFOR_STORE_SERVER: localhost
|
|
539
|
+
MEFOR_STORE_PORT: "5432"
|
|
540
|
+
MEFOR_STORE_DATABASE: messagefoundry
|
|
541
|
+
MEFOR_STORE_USERNAME: postgres
|
|
542
|
+
MEFOR_STORE_PASSWORD: mefor
|
|
543
|
+
MEFOR_STORE_ENCRYPT: "false"
|
|
544
|
+
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
545
|
+
# The throughput levers' MEFOR_TEST_POSTGRES-gated invariants (esp. the FOR-UPDATE no-SKIP-LOCKED
|
|
546
|
+
# locked-head-BLOCKS twin of #285, and the batch FIFO/crash tests) live in their own files. APPEND
|
|
547
|
+
# each new lever's test file per docs/throughput-build-plan.md.
|
|
548
|
+
run: >-
|
|
549
|
+
pytest -v
|
|
550
|
+
tests/test_inline_fast_path.py
|
|
551
|
+
tests/test_batch_claim_fifo.py
|
|
552
|
+
tests/test_batch_claim_worker.py
|
|
553
|
+
tests/test_batch_claim_locking.py
|
|
554
|
+
tests/test_seq_only_fifo.py
|
|
555
|
+
tests/test_fifo_index_migration.py
|
|
556
|
+
tests/test_per_lane_wake.py
|
|
557
|
+
|
|
558
|
+
- name: Run the connection-scale pool-wait smoke on real Postgres (B11 wall #2, tiny pool)
|
|
559
|
+
env:
|
|
560
|
+
MEFOR_TEST_POSTGRES: "1"
|
|
561
|
+
MEFOR_STORE_BACKEND: postgres
|
|
562
|
+
MEFOR_STORE_SERVER: localhost
|
|
563
|
+
MEFOR_STORE_PORT: "5432"
|
|
564
|
+
MEFOR_STORE_DATABASE: messagefoundry
|
|
565
|
+
MEFOR_STORE_USERNAME: postgres
|
|
566
|
+
MEFOR_STORE_PASSWORD: mefor
|
|
567
|
+
MEFOR_STORE_ENCRYPT: "false"
|
|
568
|
+
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
569
|
+
# FORCE a below-default pool (4 connections) so the perf_counter-measured acquire-WAIT
|
|
570
|
+
# histogram (the PRIMARY pool-wait signal) is non-trivial even at small N: ~3N inbound workers
|
|
571
|
+
# contend for 4 connections, so acquires actually queue and the percentiles populate. The
|
|
572
|
+
# default pool (5+) would mask the wall. 4 (not 1-2) is deliberate: GET /status runs
|
|
573
|
+
# db_status()'s four sequential COUNT(*) queries on every poll, and an extremely tiny pool
|
|
574
|
+
# starves those acquires past the poller's HTTP timeout under the empty-claim herd on a slow
|
|
575
|
+
# runner — every poll then fails and the drain loops burn the test budget (the PR #675 hang).
|
|
576
|
+
# This still gives the B11 pool-wait instrumentation real regression coverage SQLite (no pool)
|
|
577
|
+
# cannot — the connscale harness OWNS the engine subprocess and inherits this env.
|
|
578
|
+
MEFOR_STORE_POOL_SIZE: "4"
|
|
579
|
+
run: pytest tests/test_connscale_postgres.py -v
|
|
580
|
+
|
|
405
581
|
# Headless load test (Track B / throughput): serve the synthetic high-fan-out load config (auth
|
|
406
582
|
# off, small fan-out) and drive the smoke profile through the real `python -m harness --load` CLI,
|
|
407
583
|
# asserting zero message loss + all SLOs (exit 0) and uploading the JSON/CSV report. Skipped on PRs
|
|
@@ -411,7 +587,11 @@ jobs:
|
|
|
411
587
|
# docs/LOAD-TESTING.md.
|
|
412
588
|
load-test:
|
|
413
589
|
name: load test (smoke, sqlite)
|
|
414
|
-
|
|
590
|
+
# Nightly schedule + on-demand only (was: every push to main). The PR gate is the in-process
|
|
591
|
+
# tests/test_load_runner.py in the `test` job; push-to-main keeps full functional + server-DB
|
|
592
|
+
# coverage. This multi-minute serve+load run no longer fires once per commit. NOT a required check,
|
|
593
|
+
# so dropping it from push is safe; ci-gate `needs` it but counts a `skipped` leg as a pass.
|
|
594
|
+
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
|
415
595
|
runs-on: ubuntu-latest
|
|
416
596
|
steps:
|
|
417
597
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
@@ -467,7 +647,10 @@ jobs:
|
|
|
467
647
|
# runs on push to main + on-demand (workflow_dispatch). Heavier SQL Server profiles run manually.
|
|
468
648
|
load-test-sqlserver:
|
|
469
649
|
name: load test (smoke, sqlserver) ${{ matrix.label }}
|
|
470
|
-
|
|
650
|
+
# Nightly schedule + on-demand only (was: every push to main); same rationale as `load-test`. The
|
|
651
|
+
# end-to-end SQL Server store path is still smoked nightly (x2 majors) + on demand, and the per-push
|
|
652
|
+
# SQL Server functional coverage stays in `sqlserver-store`. NOT required; ci-gate treats skip as pass.
|
|
653
|
+
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
|
471
654
|
runs-on: ubuntu-latest
|
|
472
655
|
# Smoke the end-to-end SQL Server store path on every supported major (2022/2025). Push/dispatch-only,
|
|
473
656
|
# so no PR cost; fail-fast: false keeps the two legs independent.
|
|
@@ -567,7 +750,10 @@ jobs:
|
|
|
567
750
|
# minutes; runs on push to main and on-demand (workflow_dispatch).
|
|
568
751
|
windows-service-smoke:
|
|
569
752
|
name: windows service smoke (${{ matrix.os }}, py${{ matrix.python-version }})
|
|
570
|
-
|
|
753
|
+
# push-to-main + on-demand only (2x-billed Windows legs). NOT on the nightly `schedule` — the cron
|
|
754
|
+
# is reserved for the load legs, so this is `push || workflow_dispatch`, not `!= 'pull_request'`
|
|
755
|
+
# (which would have run these 2x-Windows legs every night for no added signal).
|
|
756
|
+
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
571
757
|
runs-on: ${{ matrix.os }}
|
|
572
758
|
strategy:
|
|
573
759
|
fail-fast: false
|
|
@@ -733,7 +919,10 @@ jobs:
|
|
|
733
919
|
docker-smoke:
|
|
734
920
|
name: docker image smoke (slim, linux)
|
|
735
921
|
needs: changes
|
|
736
|
-
|
|
922
|
+
# push-to-main / on-demand (full coverage), or a PR that touches the image/locks/packaging. NOT on
|
|
923
|
+
# the nightly `schedule` (reserved for the load legs) — `push || workflow_dispatch`, not
|
|
924
|
+
# `!= 'pull_request'`, keeps the image build out of the cron.
|
|
925
|
+
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changes.outputs.docker == 'true'
|
|
737
926
|
runs-on: ubuntu-latest
|
|
738
927
|
steps:
|
|
739
928
|
- 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,192 @@ 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
|
+
# pytest-timeout is required: the repo's pyproject `addopts` sets `--timeout=60
|
|
351
|
+
# --timeout-method=thread`, so a bare `pip install pytest` aborts the run with
|
|
352
|
+
# "unrecognized arguments: --timeout" before the smoke ever executes (it leaves the per-test
|
|
353
|
+
# watchdog intact instead of stripping addopts).
|
|
354
|
+
pip install pytest pytest-timeout
|
|
355
|
+
python -m pytest tests/test_frozen_launch_smoke.py -v -p no:cacheprovider
|
|
356
|
+
|
|
357
|
+
- name: Install Inno Setup (pinned)
|
|
358
|
+
run: |
|
|
359
|
+
choco install innosetup --version=$env:INNO_SETUP_VERSION --no-progress -y
|
|
360
|
+
# ISCC.exe is not on PATH after a choco install; resolve + export it for the next step.
|
|
361
|
+
$iscc = "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe"
|
|
362
|
+
if (-not (Test-Path $iscc)) { throw "ISCC.exe not found at $iscc after choco install" }
|
|
363
|
+
"ISCC=$iscc" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
364
|
+
|
|
365
|
+
- name: Build the installer (ISCC, AppVersion injected)
|
|
366
|
+
# Pass the resolved version through the step env (NOT a ${{ }} expansion inside the run script) so
|
|
367
|
+
# the value can never be interpolated into the shell — zizmor template-injection hardening.
|
|
368
|
+
env:
|
|
369
|
+
APP_VERSION: ${{ steps.ver.outputs.version }}
|
|
370
|
+
run: |
|
|
371
|
+
& "$env:ISCC" "/DAppVersion=$env:APP_VERSION" packaging/console-installer/messagefoundry-console.iss
|
|
372
|
+
$setup = "dist/messagefoundry-console-setup-$env:APP_VERSION.exe"
|
|
373
|
+
if (-not (Test-Path $setup)) { throw "Inno Setup did not produce $setup" }
|
|
374
|
+
"SETUP_EXE=$setup" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
375
|
+
|
|
376
|
+
# Authenticode signing — CONDITIONAL on the cert secret. If WINDOWS_SIGN_CERT_BASE64 is absent the
|
|
377
|
+
# whole step is skipped (the `if:` is false), so the build NEVER fails for lack of a cert; the
|
|
378
|
+
# installer simply ships UNSIGNED until the owner provisions one (ADR 0032 §(c), AC-B3). The cert
|
|
379
|
+
# lives ONLY in CI secrets and is written to a temp file that is deleted in the same step — it
|
|
380
|
+
# never touches the workspace. Pure CI tooling (signtool) — NO Python crypto import, so the ASVS
|
|
381
|
+
# 11.1.3 crypto-inventory gate is not tripped.
|
|
382
|
+
- name: Authenticode-sign the exe + installer (if a cert secret is configured)
|
|
383
|
+
if: ${{ env.SIGN_CONFIGURED == 'true' }}
|
|
384
|
+
env:
|
|
385
|
+
SIGN_CERT_B64: ${{ secrets.WINDOWS_SIGN_CERT_BASE64 }}
|
|
386
|
+
SIGN_CERT_PASSWORD: ${{ secrets.WINDOWS_SIGN_CERT_PASSWORD }}
|
|
387
|
+
run: |
|
|
388
|
+
# signtool ships with the Windows SDK on the windows-2025 image; resolve the newest one by SDK
|
|
389
|
+
# build number (sort the numeric version dir, not the lexical path, so 10.0.26100 > 10.0.9999).
|
|
390
|
+
$signtool = Get-ChildItem "${env:ProgramFiles(x86)}\Windows Kits\10\bin\*\x64\signtool.exe" |
|
|
391
|
+
Sort-Object { [version]($_.Directory.Parent.Name) } | Select-Object -Last 1
|
|
392
|
+
if (-not $signtool) { throw "signtool.exe not found (Windows SDK missing on the runner)" }
|
|
393
|
+
Write-Host "using signtool: $($signtool.FullName)"
|
|
394
|
+
$pfx = Join-Path $env:RUNNER_TEMP "codesign.pfx"
|
|
395
|
+
try {
|
|
396
|
+
[IO.File]::WriteAllBytes($pfx, [Convert]::FromBase64String($env:SIGN_CERT_B64))
|
|
397
|
+
# $signArgs, not $args ($args is a PowerShell automatic variable — avoid the collision).
|
|
398
|
+
$signArgs = @('sign', '/f', $pfx, '/fd', 'SHA256',
|
|
399
|
+
'/tr', 'http://timestamp.digicert.com', '/td', 'SHA256')
|
|
400
|
+
if ($env:SIGN_CERT_PASSWORD) { $signArgs += @('/p', $env:SIGN_CERT_PASSWORD) }
|
|
401
|
+
# Sign the inner frozen exe first, then the installer that wraps it.
|
|
402
|
+
& $signtool.FullName @signArgs "dist/messagefoundry-console/messagefoundry-console.exe"
|
|
403
|
+
if ($LASTEXITCODE -ne 0) { throw "signtool failed on the frozen exe" }
|
|
404
|
+
& $signtool.FullName @signArgs "$env:SETUP_EXE"
|
|
405
|
+
if ($LASTEXITCODE -ne 0) { throw "signtool failed on the installer" }
|
|
406
|
+
Write-Host "Signed the frozen exe + installer (timestamped)."
|
|
407
|
+
} finally {
|
|
408
|
+
if (Test-Path $pfx) { Remove-Item $pfx -Force } # never leave the cert on disk
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
- name: Note signing status
|
|
412
|
+
run: |
|
|
413
|
+
if ($env:SIGN_CONFIGURED -eq 'true') {
|
|
414
|
+
Write-Host "Installer is SIGNED."
|
|
415
|
+
} else {
|
|
416
|
+
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)."
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
# Always upload the installer as a workflow artifact (inspectable on workflow_dispatch dry-runs).
|
|
420
|
+
- name: Upload the installer artifact (dry-run / always)
|
|
421
|
+
if: always()
|
|
422
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
423
|
+
with:
|
|
424
|
+
name: console-installer
|
|
425
|
+
path: dist/messagefoundry-console-setup-*.exe
|
|
426
|
+
if-no-files-found: warn
|
|
427
|
+
|
|
428
|
+
# Attach to the GitHub release — TAG-GATED only (a workflow_dispatch dry-run skips this). `needs:
|
|
429
|
+
# release` guarantees `release`'s `gh release create` already ran, so the release exists; --clobber
|
|
430
|
+
# lets a re-run replace the asset.
|
|
431
|
+
- name: Attach the installer to the GitHub release
|
|
432
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
433
|
+
env:
|
|
434
|
+
GH_TOKEN: ${{ github.token }}
|
|
435
|
+
run: gh release upload "$env:GITHUB_REF_NAME" "$env:SETUP_EXE" --clobber
|