Repository navigation
Explain activity argument and result compatibility for runs in progress #363
Description
Delivery verified
The published Workflow 2.11.3 follow-through is delivered in PR #379, merge 8510665af4fdc9aa2aff8ca7df27ca6708cd7440.
Final exact-head all-locale qualification, artifact deployment and actual Pages publication passed. All eight live versioning guides return HTTP 200 with the new embedded-activity-argument-safeguard section, minimum 2.11.3, typed refusal, affected 2.11.2 warning and unchanged historical SDK baselines. All eight table-of-contents links, canonicals/alternate-language entries and exact installed-evidence links passed. English, Japanese and Simplified Chinese 390px light/dark views were inspected with legible fonts and no document overflow.
Live sections: English, Ukrainian, Spanish, Portuguese, Chinese, Japanese, French, German.
The guide links the normal installed cold-process receipt: five PHP processes / 52 assertions, including refusal before the body and recovery of the same original input under two authored attempts. The exact published PHP/Laravel profile is terminal SUCCESS, all 17 jobs including 16 upgrades. No Core-profile wait remains.
Refusals consume the normal recorded activity attempts/backoff/deadline policy. There is no promise of indefinite waiting, terminal reopening, restored attempts, extended deadlines, missing-result-field repair or implicit Server/native/SDK tuple adoption. Older failure observations and the original independent SDK checks remain preserved. Sample #275 consumer/main/image qualification stays separate.
The first browser verifier used a misspelled pre-existing input anchor. Its failed observation was retained separately; the corrected verifier checks the actual additive-activity-input anchor and all eight pages pass. No product run was repaired or reclassified by that verifier correction.
Original report and acceptance
Problem
The versioning guide explains how a run's recorded start arguments bind to new workflow code. The signals guide has a recipe for evolving a signal payload. Nothing covers activity arguments and results, which change more often than either.
- Each activity attempt passes the arguments recorded when the activity was scheduled to whatever activity code is deployed at that moment (RunActivityTask.php). A retry, or an attempt that starts after a deploy, runs new code with old arguments.
- Replay checks the step shape and activity type, not argument values. It then hands the recorded result to the current workflow code (WorkflowExecutor.php). Changing an activity's input or result shape raises no history mismatch. New code just receives old data.
Users can't tell which activity changes are safe for runs already in progress, or what fails when a change isn't.
Acceptance criteria
- The versioning guide has an activity section. It states that attempts receive their recorded arguments and that replay passes recorded results to current workflow code, for embedded PHP and the PHP, Python and Rust SDKs.
- It shows one additive change per direction: a new optional activity argument with a default, and a new result field that workflow code reads with a fallback. It also says when to use a new activity type or
getVersion()instead. - It states what happens when recorded arguments no longer bind to the current activity signature, and when workflow code can't read an old result. Both are verified against named published releases.
- It links to the signal payload recipe and the workflow start-argument rules so all three are found together.
Activity
rmcdaniel commentedon Oct 23, 2026
Accepted as P2 documentation work after product review. Recorded activity
arguments and completed results are immutable application contracts; deployment
does not migrate them. The guide needs safe additive examples and a verified
explanation of incompatible activity binding and result use. A new activity
type or version branch is appropriate when that contract changes.
The text must describe the code selected by the worker/build routing policy,
not imply every attempt always runs the newest deployment. Workflow entry
safeguards delivered in Workflow #866 and shared #221 do not by themselves
establish an activity-input or old-result safeguard. If the required published
reproductions expose lost work, corruption or an unrecoverable deployment
failure, that requires a linked product fix rather than a workaround presented
as completion of this issue.
Next action: qualify the argument/default and result/fallback examples against
named normally installed embedded and three-SDK releases, then update the
versioning guide, its cross-links and all eight offered languages with matching
source hashes. General owns this after the active P1 Workflow #908 delivery.
rmcdaniel commentedon Oct 23, 2026
Published-package qualification now covers five fresh embedded originals on
normally installed Workflow 2.11.2 (
a730773a), PHP 8.5.12 / Laravel 13.38.0 /SQLite, across separate PHP invocations with the original database retained:
string $currency = 'USD'to an activitycurrency ?? 'USD'ArgumentCountError,ActivityFailed, then the uncaught failure closes the workflowErrorException,WorkflowFailed; completed activity remains completedThe last result is a confirmed product defect, now owned in
Workflow #910.
It is not a documentation workaround or inferred SDK behavior. The DTO
assertion fails; its original run, immutable argument hash, one attempt and
six success events are recorded there. No altered business payload or
history repair was used. The first fixture used the unsupported sync queue
and refused before activity admission; a fresh original with the supported
async configuration is separate. Each subsequent PHP phase retained its
30-second outer bound.
This issue remains open for the compatibility guide and all-locale delivery,
including independently verified published PHP/Python/Rust SDK outcomes. The
safe additive examples are qualified for embedded PHP. The DTO safeguard and
its recovery semantics must be implemented and published through #910 before
we claim protection for it. Core's workflow-entry guard does not protect
activity entry methods.
rmcdaniel commentedon Oct 23, 2026
Taking the versioning guide and translated compatibility guidance, including independent normally installed PHP/Python/Rust SDK checks. The embedded qualification above remains the baseline, and Workflow #910 owns the confirmed activity DTO defect. This documentation change will distinguish safe additive changes, ordinary application failures and any published safeguards; it will not treat a workaround as delivery of #910.
Next: qualify recorded activity argument binding and old-result consumption, open a draft PR, and build all eight languages before deployment.
rmcdaniel commentedon Oct 23, 2026
Published SDK qualification is complete for the four activity-compatibility cases in each SDK. Product review remains unchanged: stored arguments/results are application contracts; Workflow #910 owns the embedded DTO defect, and no unpublished safeguard is claimed. Draft guide and all seven translations are in #366.
Normally installed tuple: PHP SDK 3.2.0 (
dfaae75a94b1d855379863799ce2c9a53f900f97), Python SDK 2.9.0 (wheel SHA-2561e7547e895485dc8f670bd1b9cc34184b135f249db8da98b16b250bfc6002f73), Rust crate 4.2.2 (registry checksum566d75ceb2cf82fade296cdb6df931b7066473d781457253dd528de436a8f962), published PHP Server 2.11.0 at immutable image indexsha256:b29157eb2cf844916debbbb3c01b3257672e0dece778a9c6fa539043a3038f02. Each SDK came from its normal registry, without a source overlay. This is a functional amd64/SQLite qualification, not an ARM, native Server, Cloud or performance claim. Runner sources are attached below.Each original was started with amount 7, original run/execution bounds of 30 seconds, and one recorded activity attempt (
max_attempts = 1). Separate seed and resume processes preserve the database. For input cases, the old workflow schedules before the cold boundary; for result cases, the old activity completes before the cold workflow replay. Worker-registration/fingerprint source remains stable while the fixture selects its deployment phase. No input/history edits, repairs, deadline extension, replacement of an original, or activity replay were used.ArgumentCountError; uncaught activity failure closes runTypeError; uncaught activity failure closes runTypeError; workflow failsKeyError; workflow failsThese failure outcomes follow the authored one-attempt policy; they do not imply that every deployment mismatch always fails a run immediately. The completed activity remains completed when the new reader fails. PHP worker failure metadata preserves the reported exception type even where the transport wrapper class is
RuntimeException.After all writers stopped: API exited 0, no OOM. A SELECT-only audit confirms 12 originals, 6 completed runs, 6 expected failed controls, 36 first-attempt tasks, 12 activity attempts, zero repairs and exactly one activity schedule/start per original. Each stored activity argument frame matches its original
ActivityScheduledrecord. Every selected original closed within its original deadline. The database SHA-256 was unchanged by the audit. PHP/Python snapshots additionally assert unchanged run identity, deadlines and history prefix; Rust seed/resume asserts the same original identity, and the database audit checks its lifecycle and stored input.The initial fixture attempts are retained separately and are not passes: an unreachable host-to-Docker route, an incorrect Python method name, missing PHP bounded-transport/bootstrap support, and an observation window too short for the initial fixture. Fresh originals use the corrected fixture; no failed original was repaired or replaced and called passing. Those setup errors establish no product finding.
01m5ktr4e1bnp6vzq1dsy30a0j01m5ktrn9bgy86mxnvwgxpmy4n01m5kts93m10zhsjqmd91e6twk01m5ktssgsea7cfn523fev7trb01m5ktv9gt3h51n9g4dnekwb6501m5ktvs9s7bx3a9v7ccfys9hz01m5ktw5eaepz9czac4b3h6jwm01m5ktwgx76fhspdfnb2rtah3s01m5ktva2f1mj66pwq4p6e18v801m5ktvqqanntqtt42qzkrbm7p01m5ktw2k0fen42h6efeejyrjc01m5ktwf5e2tmjmzzjggrxx55zStandalone qualification sources and invocation
These are bounded, synthetic fixtures, not production configuration. Start the pinned Server in an isolated Docker network with alias
api, bootstrap its own SQLite database, and place these files at the root of a task mount. Install Pythondurable-workflow==2.9.0intovenv, Composerdurable-workflow/sdk:3.2.0intophp, and build the Rust manifest underrust. Run each ofoptional,result-fallback,result-required,requiredwith a new unique workflow ID, firstseed, then immediatelyresumein a fresh process. Do not reuse an expired original. The SDK worker processes must join the same Docker network.Python needs
PROBE_URL=http://api:8080. Container mount root is/task; the Rust fixture writes its two receipts there. The PHP fixture delegates bounded HTTP calls to the SDK transport and recreates that same local endpoint for independent lease maintenance. No lease response or business admission is fabricated.python_probe.py (SHA-256
e80af0f4ff21319bc92748893d1377563e70934d84ea7a8ce52f39df374df7de)php_probe.php (SHA-256
cf1404d91a06d28114148b4ab5cefb5101053a1a831027d12f559e66ee01e07c)php_lease.php (SHA-256
c2e230d8bc5ef4374e4ad2a5e97ebb2baa455d6b2eefe41811c61ac91f261ced)rust/Cargo.toml (SHA-256
45c31fda00b44b68af0c5e1588cf97290c047e9749449b0d2c28c9bf183de039)rust/src/main.rs (SHA-256
7eb1f98c4eb47e72cfc629a471d4c0a4ca533bed1905eebad26e6ba7f0ebb183)Next: finish the documentation build, inspect rendered pages, run required PR checks, deploy all eight locales together and verify the live routes. #910 remains separate product work.
rmcdaniel commentedon Oct 23, 2026
Delivered in PR #366, merge
4b59cff29e39182208cdbe5a542d205aed379024.Start at the new activity compatibility section. The independently qualified SDK and embedded behavior is recorded above; the guide also links the workflow-start and signal evolution rules. The merged remote branch is deleted and its absence verified.
This closes the documentation requirements. It does not fix the affected embedded 2.11.2 DTO behavior: Workflow #910 remains separate product work, and no unpublished safeguard or reopening of terminal originals is claimed.
rmcdaniel commentedon Oct 23, 2026
The live CJK visual qualification has been repeated with actual Japanese and Chinese fonts installed in the browser environment. Both
/ja/and/zh-Hans/versioning guides render legible glyphs, retain their canonical/alternate links, navigate to the localized signal recipe, and pass 390px light/dark reflow with the release table scrolling inside its own region. Initial missing-font screenshots establish no visual-readability claim; these font-qualified checks supersede that limitation. The website font assets and content did not change.rmcdaniel commentedon Oct 23, 2026
Reopening for the published embedded-guard follow-through requested after the initial guide delivery. Workflow 2.11.3 is now published at source
71213ae1e0338cda5967e0840782a981530ed854; General's normal installed cold-process receipt passes five fresh PHP processes / 52 assertions, including one-attempt refusal and authored two-attempt recovery of the same original input. The exact 2.11.2 counterfactuals remain failures.The all-eight-locale update will name 2.11.3 as the minimum for this embedded activity guard, retain the older-version warning and historical SDK baselines, and explain normal attempts/backoff/deadlines and terminal-state limits. No broader Laravel/PHP profile pass, Server/native adoption, tuple promotion or additional-attempt promise follows. General retains product/consumer delivery. This issue will close again only after the updated guides are actually published and checked.
rmcdaniel commentedon Oct 23, 2026
The published Workflow 2.11.3 follow-through is delivered in PR #379, merge
8510665af4fdc9aa2aff8ca7df27ca6708cd7440.Final exact-head all-locale qualification, artifact deployment and actual Pages publication passed. All eight live versioning guides return HTTP 200 with the new
embedded-activity-argument-safeguardsection, minimum 2.11.3, typed refusal, affected 2.11.2 warning and unchanged historical SDK baselines. All eight table-of-contents links, canonicals/alternate-language entries and exact installed-evidence links passed. English, Japanese and Simplified Chinese 390px light/dark views were inspected with legible fonts and no document overflow.Live sections: English, Ukrainian, Spanish, Portuguese, Chinese, Japanese, French, German.
The guide links the normal installed cold-process receipt: five PHP processes / 52 assertions, including refusal before the body and recovery of the same original input under two authored attempts. The exact published PHP/Laravel profile is terminal SUCCESS, all 17 jobs including 16 upgrades. No Core-profile wait remains.
Refusals consume the normal recorded activity attempts/backoff/deadline policy. There is no promise of indefinite waiting, terminal reopening, restored attempts, extended deadlines, missing-result-field repair or implicit Server/native/SDK tuple adoption. Older failure observations and the original independent SDK checks remain preserved. Sample #275 consumer/main/image qualification stays separate.
The first browser verifier used a misspelled pre-existing input anchor. Its failed observation was retained separately; the corrected verifier checks the actual
additive-activity-inputanchor and all eight pages pass. No product run was repaired or reclassified by that verifier correction.