Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
0be5da4
feat: add cooperative cancellation request and claim-bound delivery d…
durable-workflow-ops Sep 30, 2026
ec352c5
test: qualify cooperative request races and cold cleanup recovery
durable-workflow-ops Sep 30, 2026
a23e644
Reload canonical cancellation history and recover race pressure
durable-workflow-ops Sep 30, 2026
2e2d6b3
Discover cooperative cancellation only on the configured candidate pr…
durable-workflow-ops Oct 1, 2026
073a516
Observe remote activity ownership without renewing user progress
durable-workflow-ops Oct 1, 2026
c32434c
Merge published Workflow 2.3.1 recovery into cooperative candidate
durable-workflow-ops Oct 1, 2026
6be6cd3
fix: fence cooperative heartbeat renewal against lease reclaim
durable-workflow-ops Oct 1, 2026
0f6b1dd
test: preserve cancellation fencing when reclaim wins
durable-workflow-ops Oct 1, 2026
24b54c9
Merge remote-tracking branch 'origin/main' into feat/cooperative-canc…
durable-workflow-ops Oct 1, 2026
555cf7a
Keep pending cancellation runnable after workflow prefix completion
durable-workflow-ops Oct 1, 2026
3c15bfb
Avoid cancellation successor reads for ordinary worker claims
durable-workflow-ops Oct 1, 2026
26b75cb
Merge remote-tracking branch 'origin/main' into feat/cooperative-canc…
durable-workflow-ops Oct 1, 2026
7675ab9
fix: use published workflow 2.3.3 deadline recovery
durable-workflow-ops Oct 1, 2026
42e8a83
feat: return pending child cancellation without releasing the claim
durable-workflow-ops Oct 1, 2026
831aecd
Merge main to retain Server 2.4.38 release metadata
durable-workflow-ops Oct 1, 2026
4d9a424
fix: acknowledge parked child cancellation claims explicitly
durable-workflow-ops Oct 1, 2026
eafa777
Preserve and gate cooperative child cancellation commands
durable-workflow-ops Oct 1, 2026
a63b06a
Admit fenced remote callback-stop receipts
durable-workflow-ops Oct 1, 2026
546b1ca
Format callback stop receipt paths
durable-workflow-ops Oct 2, 2026
dae9bb0
Verify run inspection and stale publication after callback-stop receipts
durable-workflow-ops Oct 2, 2026
b272f4f
Add claim-bound prepared local activity worker endpoints
durable-workflow-ops Oct 2, 2026
04c9023
Preserve prepared local completions under storage draining
durable-workflow-ops Oct 2, 2026
d3dcc3b
Preserve strict worker fencing across JSON key order
durable-workflow-ops Oct 2, 2026
929b457
Admit bounded prepared cleanup and distinct application heartbeats
durable-workflow-ops Oct 2, 2026
4d904df
Bound prepared local completion uploads to original claim during drai…
durable-workflow-ops Oct 2, 2026
e288b8f
Compare immutable payload reference objects independently of JSON key…
durable-workflow-ops Oct 2, 2026
c1bda7f
Expose atomic prepared local activity group admission
durable-workflow-ops Oct 2, 2026
0f02ecf
Hold detached activity history and payloads until canonical closure
durable-workflow-ops Oct 2, 2026
2fc521b
Accept released cancellation claims while activity stop remains pending
durable-workflow-ops Oct 2, 2026
8940fb8
Admit remote activity cancellation policies on capable source claims
durable-workflow-ops Oct 2, 2026
7080785
Expose the canonical cancellation cascade in run diagnostics
durable-workflow-ops Oct 2, 2026
172dedb
Distinguish recovered task history in debug findings
durable-workflow-ops Oct 2, 2026
dd8996f
Bind prepared local cancellation policies to issued worker claims
durable-workflow-ops Oct 2, 2026
ccede6d
Preserve scope admission and commit streams only for accepted tasks
durable-workflow-ops Oct 3, 2026
b9eeced
Merge remote-tracking branch 'origin/main' into feat/cooperative-canc…
durable-workflow-ops Oct 3, 2026
49ab258
Preflight scoped single local activity preparation and recovery
durable-workflow-ops Oct 3, 2026
6bc01e9
Bind canonical cancellation scope opening to issued worker claims
durable-workflow-ops Oct 3, 2026
d33d574
Checkpoint scope prefixes under cooperative workflow claims
durable-workflow-ops Oct 3, 2026
f92d0a7
Return a claim-bound history cursor after scope opening
durable-workflow-ops Oct 3, 2026
b995b30
fix: observe original scoped activity cancellation receipts
durable-workflow-ops Oct 3, 2026
f8749ca
feat: expose authenticated scoped cancellation preparation and recording
durable-workflow-ops Oct 3, 2026
a9aeb06
test: qualify authenticated scoped activity dispatch through HTTP
durable-workflow-ops Oct 3, 2026
fffd5f4
Qualify scoped timer delivery through the worker API
durable-workflow-ops Oct 3, 2026
7cc5707
Admit scoped signal and condition waits through the worker API
durable-workflow-ops Oct 3, 2026
2c4eb43
Qualify scoped wait cancellation through the worker HTTP API
durable-workflow-ops Oct 3, 2026
6d2fb0c
Expose frozen child targets in scope preparation responses
durable-workflow-ops Oct 3, 2026
785093f
Describe and qualify portable scoped child cancellation receipts
durable-workflow-ops Oct 4, 2026
13114fa
Preserve scoped local cleanup proof through Server admission
durable-workflow-ops Oct 4, 2026
6845e87
Verify scoped delivery keeps a recoverable hosting claim
durable-workflow-ops Oct 4, 2026
30063a6
Verify the stop-receipt hosting lease with shared source assertions
durable-workflow-ops Oct 4, 2026
4429d58
Qualify recoverable scoped preparation through HTTP
durable-workflow-ops Oct 4, 2026
d0d7e43
Allow the complete source database pairing to finish
durable-workflow-ops Oct 4, 2026
92e9f12
Qualify accepted scoped cancellation recovery through HTTP
durable-workflow-ops Oct 4, 2026
95806ae
Prepare scoped local cancellation before guarded publication
durable-workflow-ops Oct 5, 2026
4e95bdd
Compare scoped cancellation context independently of JSON object order
durable-workflow-ops Oct 5, 2026
741920d
fix: retain scoped cleanup timer proof through HTTP completion
durable-workflow-ops Oct 6, 2026
c350304
docs: version the scoped cleanup timer HTTP contract
durable-workflow-ops Oct 6, 2026
f862da3
Merge remote-tracking branch 'origin/main' into feat/cooperative-canc…
durable-workflow-ops Oct 6, 2026
dfff248
Retain bounded MySQL lock diagnostics for the existing canary failure
durable-workflow-ops Oct 6, 2026
f6ceece
Lock workflow runs before worker task mutations and repair
durable-workflow-ops Oct 6, 2026
5652427
Prepare Server cancellation RC with published Native package
durable-workflow-ops Oct 6, 2026
94b6263
Align protocol schema and fail closed on invalid task namespace bindings
durable-workflow-ops Oct 6, 2026
deb8be3
Consume published scheduler correction and preserve worker refusal di…
durable-workflow-ops Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 105 additions & 1 deletion .github/workflows/phpunit-feature.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ on:
description: Full Git commit SHA to classify regression-corpus changes against
required: true
type: string
prepared_local_workflow_commit:
description: Optional full Native commit for candidate prepared-local source qualification. Does not replace locked-package CI.
required: false
type: string

permissions:
contents: read
Expand Down Expand Up @@ -183,7 +187,7 @@ jobs:
--health-cmd='mysqladmin --silent --host=127.0.0.1 ping' \
--health-interval=1s --health-start-period=20s --health-retries=30 \
mysql@sha256:679e7e924f38a3cbb62a3d7df32924b83f7321a602d3f9f967c01b3df18495d6 \
--disable-log-bin --performance-schema=OFF \
--disable-log-bin --performance-schema=ON \
--innodb-buffer-pool-size=64M --innodb-redo-log-capacity=64M \
--innodb-log-buffer-size=8M --table-open-cache=256 --max-connections=40
docker run --detach \
Expand Down Expand Up @@ -253,3 +257,103 @@ jobs:
test "$PREFLIGHT_RESULT" = success
test "$FEATURE_RESULT" = success
echo "Server repository contracts and feature tests succeeded."

prepared-local-source:
name: Candidate cancellation and prepared-local source qualification
needs: [action-policy, preflight]
if: ${{ github.event_name == 'workflow_dispatch' && inputs.prepared_local_workflow_commit != '' }}
runs-on: ubuntu-latest
timeout-minutes: 30
services:
mysql:
image: mysql@sha256:679e7e924f38a3cbb62a3d7df32924b83f7321a602d3f9f967c01b3df18495d6
env:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_DATABASE: prepared_local_test
MYSQL_ROOT_HOST: "%"
ports: ["3317:3306"]
options: >-
--health-cmd="mysqladmin --silent --host=127.0.0.1 ping"
--health-interval=2s --health-timeout=5s --health-retries=30
postgres:
image: postgres@sha256:f1c3376c26f2609ab9f29f71f824103fe2fcd8ee0346485cb6122a4f93df6f94
env:
POSTGRES_HOST_AUTH_METHOD: trust
POSTGRES_DB: prepared_local_test
ports: ["5439:5432"]
options: >-
--health-cmd="pg_isready --host=127.0.0.1 --username=postgres"
--health-interval=2s --health-timeout=5s --health-retries=30
env:
DW_PREPARED_WORKFLOW_COMMIT: ${{ inputs.prepared_local_workflow_commit }}
steps:
- name: Require immutable candidate source
run: |
set -euo pipefail
[[ "$DW_PREPARED_WORKFLOW_COMMIT" =~ ^[0-9a-f]{40}$ ]]
[[ ! "$DW_PREPARED_WORKFLOW_COMMIT" =~ ^0+$ ]]
- name: Check out Server candidate
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false
- name: Check out exact Native candidate
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
repository: durable-workflow/workflow
ref: ${{ inputs.prepared_local_workflow_commit }}
path: prepared-workflow-source
persist-credentials: false
- name: Record source binding and qualify all supported databases
run: |
set -euo pipefail
test "$(git -C prepared-workflow-source rev-parse HEAD)" = "$DW_PREPARED_WORKFLOW_COMMIT"
mkdir -p prepared-local-evidence
chmod 0777 prepared-local-evidence
{
echo "Candidate source qualification only. No image, release or SDK conformance claim."
echo "Server commit: $(git rev-parse HEAD)"
echo "Native source overlay: $DW_PREPARED_WORKFLOW_COMMIT"
echo "Locked package baseline retained by ordinary feature CI."
} > prepared-local-evidence/provenance.txt
docker build --target base -t dw-server-prepared-local-base .
tar --exclude=vendor --exclude='*/vendor' --exclude=build --exclude='*/build' \
--exclude=prepared-local-evidence -cf ../prepared-local-source.tar .
qualification_status=0
for database in sqlite mysql pgsql; do
database_name=prepared_local_test
database_user=root
database_port=3317
if [ "$database" = sqlite ]; then database_name=:memory:; fi
if [ "$database" = pgsql ]; then database_user=postgres; database_port=5439; fi
if ! docker run --rm --init --network host \
--user 1000:1000 \
--tmpfs /app:rw,uid=1000,gid=1000,mode=0755 \
--volume "$PWD/../prepared-local-source.tar:/source.tar:ro" \
--volume "$PWD/prepared-local-evidence:/evidence" \
--env COMPOSER_HOME=/tmp/dw-prepared-composer \
--env DB_CONNECTION="$database" --env DB_DATABASE="$database_name" \
--env DB_HOST=127.0.0.1 --env DB_PORT="$database_port" \
--env DB_USERNAME="$database_user" --env DB_PASSWORD= \
--env DW_PREPARED_DATABASE="$database" \
--workdir /app --entrypoint sh dw-server-prepared-local-base -ec '
tar --no-same-owner -xf /source.tar -C /app
composer install --no-interaction --no-progress --prefer-dist
mv vendor/durable-workflow/workflow /tmp/locked-workflow-package
cp -a prepared-workflow-source vendor/durable-workflow/workflow
php vendor/bin/phpunit tests/Feature/PreparedLocalActivityProtocolTest.php tests/Feature/ActivityAttemptStatusTest.php tests/Feature/HistoryRetentionTest.php tests/Unit/WorkerPollFenceTest.php tests/Source/CancellationCascadeDiagnosticsTest.php tests/Source/PreparedLocalCancellationPolicyTest.php tests/Source/CancellationScopeAdmissionTest.php tests/Source/ScopedActivityCancellationReceiptTest.php tests/Source/CancellationScopeDeliveryTest.php tests/Feature/WorkflowStreamsTest.php tests/Feature/WorkflowDebugTest.php --fail-on-skipped --log-junit "/evidence/$DW_PREPARED_DATABASE.xml" --colors=never
if [ "$DW_PREPARED_DATABASE" = sqlite ]; then
php vendor/bin/phpunit tests/Feature/CooperativeCancellationProtocolTest.php tests/Feature/WorkflowWorkerProtocolTest.php tests/Feature/ActivityWorkerProtocolTest.php tests/Feature/SearchAttributeValueValidationTest.php tests/Feature/NamespaceDurableStateQuotaTest.php tests/Feature/RuntimeExternalPayloadTransportTest.php tests/Feature/RuntimePayloadCompletionUploadsTest.php tests/Unit/RuntimePayloadCompletionContextTest.php tests/Unit/WorkerProtocolOpenApiContractTest.php --log-junit /evidence/affected-regression.xml --colors=never
fi
' > "prepared-local-evidence/$database.log" 2>&1; then
qualification_status=1
fi
done
test "$qualification_status" = 0
- name: Retain exact source qualification evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: candidate-prepared-local-source
path: prepared-local-evidence
if-no-files-found: error
retention-days: 90
1 change: 1 addition & 0 deletions .github/workflows/server-perf.yml
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,7 @@ jobs:
DW_PERF_MAX_HEALTH_LATENCY_SECONDS: "3"
DW_PERF_READINESS_DIAGNOSTICS: "1"
DW_PERF_CONTROL_PLANE_INTERVAL_SECONDS: "5"
DW_PERF_MYSQL_LOCK_DIAGNOSTICS: "1"
DW_PERF_MAX_CONTROL_PLANE_LATENCY_SECONDS: "5"
DW_PERF_WORKFLOW_VERSION: ${{ steps.workflow.outputs.ref }}
DW_PERF_MAX_SERVER_MEMORY_MB: "768"
Expand Down
Loading
Loading