diff --git a/.github/workflows/phpunit-feature.yml b/.github/workflows/phpunit-feature.yml index 66ef02c7..c37cd8cc 100644 --- a/.github/workflows/phpunit-feature.yml +++ b/.github/workflows/phpunit-feature.yml @@ -226,7 +226,7 @@ jobs: -w /app \ --entrypoint sh \ durable-workflow-server-corpus-validator \ - -lc 'set -eu; tar --no-same-owner -xf - -C /app; cp -a /app/workflow-package /workflow; php scripts/ci/prepare-release-workflow-composer-metadata.php; composer update durable-workflow/workflow --with-dependencies --minimal-changes --no-install --no-scripts --no-autoloader --no-interaction --no-progress --prefer-dist; composer install --no-interaction --no-progress --prefer-dist; git --version; vendor/bin/phpunit --version; git rev-parse --verify "$CORPUS_BASE_REF^{commit}"; php scripts/ci/check-worker-openapi-evolution.php "$CORPUS_BASE_REF"; vendor/bin/phpunit tests/Feature tests/Unit/NexusContractTest.php tests/Unit/CodecRegressionCorpusTest.php tests/Unit/PhpunitFeatureWorkflowContractTest.php tests/Unit/OpenApiDocumentEvolutionTest.php --no-progress --colors=never; python3 scripts/ci/validate-regression-corpus.py --base-ref "$CORPUS_BASE_REF" --verify-counterfactual' + -lc 'set -eu; tar --no-same-owner -xf - -C /app; cp -a /app/workflow-package /workflow; php scripts/ci/prepare-release-workflow-composer-metadata.php; composer update durable-workflow/workflow --with-dependencies --minimal-changes --no-install --no-scripts --no-autoloader --no-interaction --no-progress --prefer-dist; composer install --no-interaction --no-progress --prefer-dist; git --version; vendor/bin/phpunit --version; git rev-parse --verify "$CORPUS_BASE_REF^{commit}"; php scripts/ci/check-worker-openapi-evolution.php "$CORPUS_BASE_REF"; vendor/bin/phpunit tests/Feature tests/Unit/NexusContractTest.php tests/Unit/CodecRegressionCorpusTest.php tests/Unit/PhpunitFeatureWorkflowContractTest.php tests/Unit/OpenApiDocumentEvolutionTest.php tests/Unit/NamespaceConformanceRunnerContractTest.php tests/Unit/NamespaceRuntimeContractTest.php tests/Unit/SchedulesConformanceRunnerContractTest.php tests/Unit/SchedulesRuntimeContractTest.php --no-progress --colors=never; python3 scripts/ci/validate-regression-corpus.py --base-ref "$CORPUS_BASE_REF" --verify-counterfactual' - name: Clean up test services if: always() diff --git a/composer.json b/composer.json index 6a4d1a89..31dde257 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "require": { "php": "^8.2", "apache/avro": "^1.12", - "durable-workflow/workflow": "2.4.1", + "durable-workflow/workflow": "2.4.2", "laravel/framework": "^13.30", "laravel/tinker": "^3.0", "league/flysystem-aws-s3-v3": "^3.35.3" @@ -48,7 +48,7 @@ }, "extra": { "durable-workflow": { - "product-train": "2.5.1" + "product-train": "2.5.2" }, "laravel": { "dont-discover": [] diff --git a/composer.lock b/composer.lock index ec07e7e9..ff082995 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ecf7438c277a2f0467f37e613b225098", + "content-hash": "cc7ae73233d712aa7dc1aef66c1989d7", "packages": [ { "name": "apache/avro", @@ -655,16 +655,16 @@ }, { "name": "durable-workflow/workflow", - "version": "2.4.1", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/durable-workflow/workflow.git", - "reference": "3d498ee6910e4e482bd1a29c9e07a6e4b3de5a46" + "reference": "4fcb23622147dd2c1f92e461e927577092120bb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/durable-workflow/workflow/zipball/3d498ee6910e4e482bd1a29c9e07a6e4b3de5a46", - "reference": "3d498ee6910e4e482bd1a29c9e07a6e4b3de5a46", + "url": "https://api.github.com/repos/durable-workflow/workflow/zipball/4fcb23622147dd2c1f92e461e927577092120bb8", + "reference": "4fcb23622147dd2c1f92e461e927577092120bb8", "shasum": "" }, "require": { @@ -697,7 +697,7 @@ "dev-main": "2.0.x-dev" }, "durable-workflow": { - "product-train": "2.4.1", + "product-train": "2.4.2", "laravel-embedded-upgrade-contract": "resources/laravel-embedded-upgrade-contract.json", "laravel-dependency-security-policy": "resources/laravel-dependency-security-policy.json" } @@ -724,9 +724,9 @@ "description": "Embedded durable workflow runtime and orchestration engine for Laravel applications.", "support": { "issues": "https://github.com/durable-workflow/workflow/issues", - "source": "https://github.com/durable-workflow/workflow/tree/2.4.1" + "source": "https://github.com/durable-workflow/workflow/tree/2.4.2" }, - "time": "2026-10-06T12:08:56+00:00" + "time": "2026-10-06T14:26:58+00:00" }, { "name": "egulias/email-validator", diff --git a/docker-compose.dedicated-matching.yml b/docker-compose.dedicated-matching.yml index 8a636936..d43f54f6 100644 --- a/docker-compose.dedicated-matching.yml +++ b/docker-compose.dedicated-matching.yml @@ -32,13 +32,13 @@ name: durable-workflow-server # daemon reports `shape: dedicated`. # Generated by scripts/ci/sync-source-release.mjs. Do not edit the fallback. -x-server-image: &server-image ${DW_SERVER_IMAGE:-durableworkflow/server:${DW_SERVER_TAG:-2.5.1}} +x-server-image: &server-image ${DW_SERVER_IMAGE:-durableworkflow/server:${DW_SERVER_TAG:-2.5.2}} x-server-environment: &server-environment APP_NAME: "Durable Workflow Server" APP_ENV: ${APP_ENV:-local} DW_SERVER_KEY: ${DW_SERVER_KEY:-} - APP_VERSION: ${APP_VERSION:-${DW_SERVER_TAG:-2.5.1}} + APP_VERSION: ${APP_VERSION:-${DW_SERVER_TAG:-2.5.2}} APP_DEBUG: ${APP_DEBUG:-false} DB_CONNECTION: mysql DB_HOST: mysql diff --git a/docker-compose.memo-rolling.yml b/docker-compose.memo-rolling.yml index ca9b2985..3d226bb4 100644 --- a/docker-compose.memo-rolling.yml +++ b/docker-compose.memo-rolling.yml @@ -49,14 +49,14 @@ services: command: ["server-bootstrap"] environment: <<: *runtime-environment - APP_VERSION: ${APP_VERSION:-2.5.1} + APP_VERSION: ${APP_VERSION:-2.5.2} successor: image: ${DW_MEMO_SUCCESSOR_IMAGE:-durable-workflow/server-memo-rolling:local} ports: !override [] environment: <<: *runtime-environment - APP_VERSION: ${APP_VERSION:-2.5.1} + APP_VERSION: ${APP_VERSION:-2.5.2} DW_SERVER_ID: memo-successor DW_SERVER_TOPOLOGY_SHAPE: standalone_server DW_SERVER_PROCESS_CLASS: server_http_node diff --git a/docker-compose.published.yml b/docker-compose.published.yml index c225be90..2e1eb8b6 100644 --- a/docker-compose.published.yml +++ b/docker-compose.published.yml @@ -1,13 +1,13 @@ name: durable-workflow-server # Generated by scripts/ci/sync-source-release.mjs. Do not edit the fallback. -x-server-image: &server-image ${DW_SERVER_IMAGE:-durableworkflow/server:${DW_SERVER_TAG:-2.5.1}} +x-server-image: &server-image ${DW_SERVER_IMAGE:-durableworkflow/server:${DW_SERVER_TAG:-2.5.2}} x-server-environment: &server-environment APP_NAME: "Durable Workflow Server" APP_ENV: ${APP_ENV:-local} DW_SERVER_KEY: ${DW_SERVER_KEY:-} - APP_VERSION: ${APP_VERSION:-${DW_SERVER_TAG:-2.5.1}} + APP_VERSION: ${APP_VERSION:-${DW_SERVER_TAG:-2.5.2}} APP_DEBUG: ${APP_DEBUG:-false} LOG_CHANNEL: ${LOG_CHANNEL:-stderr} LOG_LEVEL: ${LOG_LEVEL:-info} diff --git a/docker-compose.small-cluster.yml b/docker-compose.small-cluster.yml index 632d601a..3aaf91b5 100644 --- a/docker-compose.small-cluster.yml +++ b/docker-compose.small-cluster.yml @@ -12,7 +12,7 @@ x-server-build: &server-build x-server-environment: &server-environment APP_NAME: "Durable Workflow Server" APP_ENV: testing - APP_VERSION: ${APP_VERSION:-2.5.1} + APP_VERSION: ${APP_VERSION:-2.5.2} APP_DEBUG: "false" DW_SERVER_KEY: ${DW_SERVER_KEY:-base64:5Zt4nUhlCm3DD0nLXZJQdHiwPfb56yGo9gNV/g3jYbY=} DB_CONNECTION: ${DW_SMALL_CLUSTER_DB:-mysql} diff --git a/docker-compose.yml b/docker-compose.yml index eb27a9a8..31485b60 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,7 +15,7 @@ services: DW_SERVER_KEY: "${DW_SERVER_KEY:-}" DW_SERVER_TOPOLOGY_SHAPE: standalone_server DW_SERVER_PROCESS_CLASS: server_http_node - APP_VERSION: "${APP_VERSION:-2.5.1}" + APP_VERSION: "${APP_VERSION:-2.5.2}" APP_DEBUG: "false" DB_CONNECTION: mysql DB_HOST: mysql @@ -62,7 +62,7 @@ services: APP_NAME: "Durable Workflow Server" APP_ENV: local DW_SERVER_KEY: "${DW_SERVER_KEY:-}" - APP_VERSION: "${APP_VERSION:-2.5.1}" + APP_VERSION: "${APP_VERSION:-2.5.2}" APP_DEBUG: "false" DB_CONNECTION: mysql DB_HOST: mysql @@ -124,7 +124,7 @@ services: DW_SERVER_KEY: "${DW_SERVER_KEY:-}" DW_SERVER_TOPOLOGY_SHAPE: standalone_server DW_SERVER_PROCESS_CLASS: worker_node - APP_VERSION: "${APP_VERSION:-2.5.1}" + APP_VERSION: "${APP_VERSION:-2.5.2}" DB_CONNECTION: mysql DB_HOST: mysql DB_PORT: 3306 @@ -178,7 +178,7 @@ services: DW_SERVER_KEY: "${DW_SERVER_KEY:-}" DW_SERVER_TOPOLOGY_SHAPE: standalone_server DW_SERVER_PROCESS_CLASS: scheduler_node - APP_VERSION: "${APP_VERSION:-2.5.1}" + APP_VERSION: "${APP_VERSION:-2.5.2}" DB_CONNECTION: mysql DB_HOST: mysql DB_PORT: 3306 diff --git a/k8s/README.md b/k8s/README.md index 62dc78c4..cd3bae73 100644 --- a/k8s/README.md +++ b/k8s/README.md @@ -13,7 +13,7 @@ The checked-in manifests are synchronized with the repository's stable source release and pin its Docker Hub tag: ```text -durableworkflow/server:2.5.1 +durableworkflow/server:2.5.2 ``` Before production use, patch every workload image to the exact published tag or @@ -21,15 +21,15 @@ digest you intend to run: ```bash kubectl set image -n durable-workflow deploy/durable-workflow-server \ - server=durableworkflow/server:2.5.1 + server=durableworkflow/server:2.5.2 kubectl set image -n durable-workflow deploy/durable-workflow-worker \ - worker=durableworkflow/server:2.5.1 + worker=durableworkflow/server:2.5.2 kubectl set image -n durable-workflow cronjob/durable-workflow-scheduler \ - scheduler=durableworkflow/server:2.5.1 + scheduler=durableworkflow/server:2.5.2 ``` GitHub Container Registry publishes the same release line at -`ghcr.io/durable-workflow/server:2.5.1`. Digest pinning is preferred for strict +`ghcr.io/durable-workflow/server:2.5.2`. Digest pinning is preferred for strict change control. The manifests expect you to provide: diff --git a/k8s/helm/durable-workflow/Chart.yaml b/k8s/helm/durable-workflow/Chart.yaml index d891c540..9985301d 100644 --- a/k8s/helm/durable-workflow/Chart.yaml +++ b/k8s/helm/durable-workflow/Chart.yaml @@ -5,11 +5,11 @@ type: application # The chart's own semver version. Bumped on every chart release; treated as # independent of the server image version (appVersion). Breaking-change rules # for this version live in docs/helm-upgrading.md alongside the chart. -version: 0.1.138 +version: 0.1.139 # The immutable Durable Workflow Server identity this chart release packages. # The onboarding default in values.yaml and appVersion are generated from the # checked-in source release record. -appVersion: "2.5.1" +appVersion: "2.5.2" kubeVersion: ">=1.27.0-0" home: https://durable-workflow.github.io/docs/2.0/deployment sources: @@ -30,7 +30,7 @@ annotations: # exact commit that most recently changed the packaged chart. org.opencontainers.image.source: https://github.com/durable-workflow/server dev.durable-workflow.source-revision: "unreleased" - dev.durable-workflow.image-reference: "docker.io/durableworkflow/server:2.5.1" + dev.durable-workflow.image-reference: "docker.io/durableworkflow/server:2.5.2" artifacthub.io/license: MIT artifacthub.io/category: integration-delivery # Free-form changelog for the current chart release shown by Artifact Hub. diff --git a/k8s/helm/durable-workflow/README.md b/k8s/helm/durable-workflow/README.md index 6b224605..448b9837 100644 --- a/k8s/helm/durable-workflow/README.md +++ b/k8s/helm/durable-workflow/README.md @@ -63,7 +63,7 @@ helm install durable-workflow ./k8s/helm/durable-workflow \ ```yaml image: - tag: "2.5.1" + tag: "2.5.2" # Pin a digest in production: # digest: "sha256:abc123..." # memoPayloadStorage: "raw-json-v1" # Required for a digest or custom image. diff --git a/k8s/helm/durable-workflow/ci/existing-secrets-values.yaml b/k8s/helm/durable-workflow/ci/existing-secrets-values.yaml index 48a4b60f..6df8a8b2 100644 --- a/k8s/helm/durable-workflow/ci/existing-secrets-values.yaml +++ b/k8s/helm/durable-workflow/ci/existing-secrets-values.yaml @@ -1,7 +1,7 @@ # CI fixture: GitOps / externally-managed-secret path. The chart consumes # existing Secrets and renders no Secret resources of its own. image: - tag: "2.5.1" + tag: "2.5.2" externalDatabase: connection: pgsql diff --git a/k8s/helm/durable-workflow/ci/ingress-and-hpa-values.yaml b/k8s/helm/durable-workflow/ci/ingress-and-hpa-values.yaml index 7e7eafad..a628239e 100644 --- a/k8s/helm/durable-workflow/ci/ingress-and-hpa-values.yaml +++ b/k8s/helm/durable-workflow/ci/ingress-and-hpa-values.yaml @@ -1,6 +1,6 @@ # CI fixture: ingress + autoscaling enabled. Exercises optional templates. image: - tag: "2.5.1" + tag: "2.5.2" externalDatabase: connection: mysql diff --git a/k8s/helm/durable-workflow/ci/inline-secrets-values.yaml b/k8s/helm/durable-workflow/ci/inline-secrets-values.yaml index d6a3e072..95dd0f7c 100644 --- a/k8s/helm/durable-workflow/ci/inline-secrets-values.yaml +++ b/k8s/helm/durable-workflow/ci/inline-secrets-values.yaml @@ -2,7 +2,7 @@ # chart's render path is exercised end-to-end. Real deployments should use # existingSecret instead. image: - tag: "2.5.1" + tag: "2.5.2" externalDatabase: connection: mysql diff --git a/k8s/helm/durable-workflow/templates/_helpers.tpl b/k8s/helm/durable-workflow/templates/_helpers.tpl index 1ab97d35..736a0995 100644 --- a/k8s/helm/durable-workflow/templates/_helpers.tpl +++ b/k8s/helm/durable-workflow/templates/_helpers.tpl @@ -88,7 +88,7 @@ resolved by an explicit capability declaration or an existing workload marker. {{- define "durable-workflow.memoPayloadStorageForImage" -}} {{- $image := toString . -}} {{- $normalized := regexReplaceAll "^index\\.docker\\.io/" $image "docker.io/" -}} -{{- if eq $normalized "docker.io/durableworkflow/server:2.5.1" -}} +{{- if eq $normalized "docker.io/durableworkflow/server:2.5.2" -}} dual-v1 {{- else if regexMatch "^docker\\.io/durableworkflow/server:2\\.0\\.0-rc\\.[0-9]+$" $normalized -}} {{- $releaseCandidate := atoi (regexFind "[0-9]+$" $normalized) -}} diff --git a/k8s/helm/durable-workflow/values.yaml b/k8s/helm/durable-workflow/values.yaml index fa532d9b..5e2349f3 100644 --- a/k8s/helm/durable-workflow/values.yaml +++ b/k8s/helm/durable-workflow/values.yaml @@ -21,7 +21,7 @@ image: registry: docker.io repository: durableworkflow/server # Generated by scripts/ci/sync-source-release.mjs. Do not edit this default. - tag: "2.5.1" + tag: "2.5.2" # Optional digest pin. When set, takes precedence over tag for change control. # Example: "sha256:abc123..." digest: "" diff --git a/k8s/helm/examples/values-dev.yaml b/k8s/helm/examples/values-dev.yaml index bf372989..e5881ff6 100644 --- a/k8s/helm/examples/values-dev.yaml +++ b/k8s/helm/examples/values-dev.yaml @@ -3,7 +3,7 @@ # shape in production. image: - tag: "2.5.1" + tag: "2.5.2" externalDatabase: connection: mysql diff --git a/k8s/helm/examples/values-external-secrets-operator.yaml b/k8s/helm/examples/values-external-secrets-operator.yaml index 1421c59d..1d76a264 100644 --- a/k8s/helm/examples/values-external-secrets-operator.yaml +++ b/k8s/helm/examples/values-external-secrets-operator.yaml @@ -5,7 +5,7 @@ # concern. image: - tag: "2.5.1" + tag: "2.5.2" externalDatabase: connection: pgsql diff --git a/k8s/helm/examples/values-production-existing-secrets.yaml b/k8s/helm/examples/values-production-existing-secrets.yaml index 4ac473eb..92fed9c9 100644 --- a/k8s/helm/examples/values-production-existing-secrets.yaml +++ b/k8s/helm/examples/values-production-existing-secrets.yaml @@ -10,7 +10,7 @@ image: repository: durable-workflow/server # Pin a digest in production for change-control auditability. digest: "" # e.g. "sha256:abc123..." - tag: "2.5.1" + tag: "2.5.2" externalDatabase: connection: pgsql diff --git a/k8s/migration-job.yaml b/k8s/migration-job.yaml index 1e826442..62fdabe3 100644 --- a/k8s/migration-job.yaml +++ b/k8s/migration-job.yaml @@ -13,7 +13,7 @@ spec: restartPolicy: OnFailure containers: - name: migrate - image: durableworkflow/server:2.5.1 + image: durableworkflow/server:2.5.2 command: ["server-entrypoint"] args: ["server-bootstrap"] envFrom: diff --git a/k8s/scheduler-cronjob.yaml b/k8s/scheduler-cronjob.yaml index 14aa5905..484c5b30 100644 --- a/k8s/scheduler-cronjob.yaml +++ b/k8s/scheduler-cronjob.yaml @@ -24,7 +24,7 @@ spec: restartPolicy: Never containers: - name: scheduler - image: durableworkflow/server:2.5.1 + image: durableworkflow/server:2.5.2 command: ["server-entrypoint"] args: - sh diff --git a/k8s/secret.yaml b/k8s/secret.yaml index dbcf3a04..a2e154f3 100644 --- a/k8s/secret.yaml +++ b/k8s/secret.yaml @@ -12,7 +12,7 @@ metadata: app.kubernetes.io/name: durable-workflow data: APP_NAME: "Durable Workflow Server" - APP_VERSION: "2.5.1" + APP_VERSION: "2.5.2" APP_ENV: production APP_DEBUG: "false" DB_CONNECTION: mysql diff --git a/k8s/server-deployment.yaml b/k8s/server-deployment.yaml index 12177ebd..bf521160 100644 --- a/k8s/server-deployment.yaml +++ b/k8s/server-deployment.yaml @@ -23,7 +23,7 @@ spec: spec: containers: - name: server - image: durableworkflow/server:2.5.1 + image: durableworkflow/server:2.5.2 ports: - containerPort: 8080 name: http diff --git a/k8s/worker-deployment.yaml b/k8s/worker-deployment.yaml index daa2b127..1b39fd1f 100644 --- a/k8s/worker-deployment.yaml +++ b/k8s/worker-deployment.yaml @@ -19,7 +19,7 @@ spec: spec: containers: - name: worker - image: durableworkflow/server:2.5.1 + image: durableworkflow/server:2.5.2 command: ["server-entrypoint"] args: ["php", "artisan", "queue:work", "--sleep=1", "--tries=3", "--max-time=3600"] envFrom: diff --git a/resources/release/source-release.json b/resources/release/source-release.json index 015e75a3..d85033e3 100644 --- a/resources/release/source-release.json +++ b/resources/release/source-release.json @@ -1,9 +1,9 @@ { "schema": "durable-workflow.server.source-release/v1", "server": { - "version": "2.5.1" + "version": "2.5.2" }, "helm_chart": { - "version": "0.1.138" + "version": "0.1.139" } } diff --git a/scripts/k8s-kind-smoke.sh b/scripts/k8s-kind-smoke.sh index ff1713d8..89f42da8 100755 --- a/scripts/k8s-kind-smoke.sh +++ b/scripts/k8s-kind-smoke.sh @@ -7,7 +7,7 @@ cluster="${K8S_SMOKE_CLUSTER:-durable-workflow-server-smoke}" image="${K8S_SMOKE_IMAGE:-durableworkflow/server:k8s-smoke}" # Generated by scripts/ci/sync-source-release.mjs so the smoke replaces the # same default shipped by the public manifests. -manifest_image="durableworkflow/server:2.5.1" +manifest_image="durableworkflow/server:2.5.2" kind_node_image="${K8S_SMOKE_KIND_NODE_IMAGE:-kindest/node:v1.29.4}" artifact_dir="${K8S_SMOKE_ARTIFACT_DIR:-/tmp/durable-workflow-k8s-kind-smoke-artifacts}" rendered_dir="${artifact_dir}/rendered-manifests" diff --git a/static/platform-conformance/namespace-runtime-scenarios.json b/static/platform-conformance/namespace-runtime-scenarios.json index b4e6c746..35a2c36d 100644 --- a/static/platform-conformance/namespace-runtime-scenarios.json +++ b/static/platform-conformance/namespace-runtime-scenarios.json @@ -3,7 +3,7 @@ "version": 1, "category": "namespace_runtime_contract", "suite_schema": "durable-workflow.v2.platform-conformance.suite", - "suite_version": 32, + "suite_version": 47, "description": "Public scenario manifest for Temporal-parity namespace conformance. Harnesses use these scenario ids and required fields when evaluating published Durable Workflow artifacts.", "fixture_type": "published_artifact_runtime_scenario_manifest", "result_schema": "durable-workflow.v2.namespace-runtime.result", diff --git a/static/platform-conformance/schedules-runtime-scenarios.json b/static/platform-conformance/schedules-runtime-scenarios.json index 4a6d7873..7b23666a 100644 --- a/static/platform-conformance/schedules-runtime-scenarios.json +++ b/static/platform-conformance/schedules-runtime-scenarios.json @@ -3,7 +3,7 @@ "version": 4, "category": "schedules_runtime_contract", "suite_schema": "durable-workflow.v2.platform-conformance.suite", - "suite_version": 15, + "suite_version": 47, "description": "Public scenario manifest for Temporal-parity schedule conformance. Harnesses use these scenario ids and criteria when evaluating published Durable Workflow artifacts.", "fixture_type": "published_artifact_runtime_scenario_manifest", "result_statuses": [ diff --git a/tests/Unit/SchedulesConformanceRunnerContractTest.php b/tests/Unit/SchedulesConformanceRunnerContractTest.php index 5ac6be5c..3137df2a 100644 --- a/tests/Unit/SchedulesConformanceRunnerContractTest.php +++ b/tests/Unit/SchedulesConformanceRunnerContractTest.php @@ -9,7 +9,7 @@ final class SchedulesConformanceRunnerContractTest extends TestCase { - public function test_python_workers_register_with_the_required_portable_capability_manifest(): void + public function test_python_protocol_probes_register_with_their_actual_capability_manifest(): void { $repoRoot = dirname(__DIR__, 2); $runner = (string) file_get_contents($repoRoot.'/scripts/conformance/schedules-published-artifacts.mjs'); @@ -30,9 +30,11 @@ public function test_python_workers_register_with_the_required_portable_capabili $pythonWorker, ); $this->assertStringContainsString( - 'capability_manifest=PORTABLE_WORKER_AFFINITY_CAPABILITY_MANIFEST', + 'capability_manifest=SCHEDULE_PROBE_CAPABILITY_MANIFEST', $pythonWorker, ); + $this->assertStringContainsString('"supported": False', $pythonWorker); + $this->assertStringContainsString('"reason": "schedule_probe_uses_direct_task_polling"', $pythonWorker); } } @@ -88,7 +90,6 @@ public function test_cross_language_php_worker_uses_payload_envelope_for_manual_ $workerShard = substr($runner, $workerStart, $workerEnd - $workerStart); $this->assertStringContainsString('$client->payloadCodec()->envelope($completeResult)', $workerShard); - $this->assertStringContainsString("'blob' => json_encode(\$completeResult, JSON_THROW_ON_ERROR)", $workerShard); $this->assertStringNotContainsString("'result' => json_encode(\$completeResult, JSON_THROW_ON_ERROR)", $workerShard); } @@ -109,7 +110,7 @@ public function test_cross_language_schedules_stay_visible_after_first_fire(): v ); $this->assertStringContainsString('schedule_max_runs: scheduleMaxRuns', $runner); $this->assertStringContainsString('max_runs=max(2, int(payload.get("schedule_max_runs") or 2))', $crossLanguageShard); - $this->assertStringContainsString("'max_runs' => max(2, (int) (\$payload['schedule_max_runs'] ?? 2))", $crossLanguageShard); + $this->assertStringContainsString("maxRuns: max(2, (int) (\$payload['schedule_max_runs'] ?? 2))", $crossLanguageShard); $this->assertStringNotContainsString('max_runs=1', $crossLanguageShard); $this->assertStringNotContainsString("'max_runs' => 1", $crossLanguageShard); } @@ -131,7 +132,7 @@ public function test_cross_language_workers_refresh_liveness_before_polling_for_ $pythonHeartbeat = strpos($pythonWorker, 'heartbeat_response = await client.heartbeat_worker('); $pythonPoll = strpos($pythonWorker, 'task = await client.poll_workflow_task('); $phpHeartbeat = strpos($phpWorker, '$heartbeatResponse = $client->heartbeatWorker('); - $phpPoll = strpos($phpWorker, '$tasks = $client->pollWorkflowTasks('); + $phpPoll = strpos($phpWorker, '$task = $client->pollWorkflowTask('); $this->assertIsInt($pythonHeartbeat); $this->assertIsInt($pythonPoll); @@ -476,11 +477,11 @@ public function test_published_artifact_runner_passes_install_cell_with_supplied $this->assertSame('pass', $installScenario['status']); $this->assertSame([], $installScenario['linked_findings']); $this->assertTrue($installScenario['observed_outputs']['published_install_tuple_proven']); - $this->assertTrue($installScenario['observed_outputs']['supplied_install_evidence']); + $this->assertTrue($installScenario['observed_outputs']['artifact_install_evidence']['supplied_install_evidence']); $this->assertFalse($installScenario['observed_outputs']['local_product_source_checkouts_used']); $this->assertSame( ['pass', 'pass', 'pass', 'pass', 'pass'], - array_column($installScenario['observed_outputs']['artifacts'], 'status'), + array_column($installScenario['observed_outputs']['artifact_install_evidence']['artifacts'], 'status'), ); $this->assertSame('docker://durableworkflow/server:0.2.244', $result['artifact_sources']['server']); $this->assertSame( @@ -488,7 +489,7 @@ public function test_published_artifact_runner_passes_install_cell_with_supplied $record['artifactSources']['sdk-php'], ); $this->assertSame( - $installScenario['observed_outputs'], + $installScenario['observed_outputs']['artifact_install_evidence'], $result['artifact_install_evidence'], ); } finally { diff --git a/tests/Unit/SchedulesRuntimeContractTest.php b/tests/Unit/SchedulesRuntimeContractTest.php index 3451a41d..7b227a60 100644 --- a/tests/Unit/SchedulesRuntimeContractTest.php +++ b/tests/Unit/SchedulesRuntimeContractTest.php @@ -845,6 +845,12 @@ private function completeSchedulesResult(): array 'create_or_observe' => true, 'list_observed' => true, 'control_observed' => true, + 'manual_trigger_observed' => true, + 'triggered_workflow_completion_observed' => true, + 'operations' => array_fill_keys([ + 'create', 'list', 'describe', 'pause', 'resume', + 'manual_trigger', 'delete', 'triggered_workflow_completion', + ], true), ], 'sdk-php' => [ 'create_or_observe' => true, @@ -868,6 +874,13 @@ private function completeSchedulesResult(): array 'refused' => true, 'typed_error' => true, 'persisted' => false, + 'persistence_evidence' => [ + 'public_list_checked' => true, + 'list_contains_invalid_schedule' => false, + 'public_describe_checked' => true, + 'describe_found' => false, + 'describe_status' => 404, + ], ]; $nonexistentWorkflow = [ 'behavior' => 'fails_at_fire_time', @@ -928,6 +941,9 @@ private function completeSchedulesResult(): array 'waterline' => '2.0.0-alpha.57', ], 'artifact_sources' => $artifactSources, + 'artifact_version_resolution' => [ + 'sdk-php' => ['version' => '0.1.1', 'source' => $artifactSources['sdk-php']], + ], 'local_product_source_checkouts_used' => false, 'artifact_install_evidence' => $scenarioResults['published_artifact_install_only']['observed_outputs']['artifact_install_evidence'], 'topology' => [