Repository navigation
feat(workflows): declare retry on workflow tools - #207
Merged
Tsuyoshi Ushio (TsuyoshiUshio) merged 3 commits intoSep 10, 2026
Merged
Conversation
Carry tool-owned retry metadata through discovery and immutable workflow policy catalogs, with decorator declarations overriding plan-authored retry at submission. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1d5e6bb1-d7be-4d68-bad7-cb3f80079d27
Tsuyoshi Ushio (TsuyoshiUshio)
requested a review
from a team
as a code owner
September 9, 2026 03:24
Keep explicit null execution values through submission validation and make the retry E2E build its payload through the production policy path. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1d5e6bb1-d7be-4d68-bad7-cb3f80079d27
Move workflow retry policy freezing out of frozen dataclass post-initialization and into the schema normalization boundary. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1d5e6bb1-d7be-4d68-bad7-cb3f80079d27
Laveesh Rohra (larohra)
approved these changes
Sep 9, 2026
hallvictoria
pushed a commit
to danfiedler-msft/azure-functions-agents-runtime
that referenced
this pull request
Sep 24, 2026
The retry foundation this slice depended on landed through PRs Azure#193 and Azure#207 rather than through the stale PR Azure#186 branch, whose versions of `schema.py`, `activity.py`, and `engine.py` now conflict with the shipped contracts wholesale. Record the remaining timeout and continue-on-error slice as a clean reimplementation against current `main` instead of a rebase. The design makes all three `execution` fields optional so a deadline can be declared alone, resolves `@workflow_tool` precedence per field, bounds one attempt at the Activity boundary under a new retryable `timeout` classification, and lets a declared-continuation node commit a bounded controlled-failure result so its dependents run. Fail-fast is preserved for everything that cannot be continued: the wave selection loop keeps awaiting only when the completed instance both declared continuation and failed continuably, so a non-continuable failure never waits behind a slow sibling or a long timer. Both persisted keys are written only when authored, so a task that declares neither freezes and replays the payload the retry-only runtime wrote. An independent architecture review raised four blocking findings — whole-wave collection, unaddressed downgrade, an underspecified continuation contract, and missing coverage of mixed waves, cancellation races, and `for_each` failure shapes. Decisions 88 and 92-96 and the expanded test plan resolve them. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f32b40a3-603f-48d9-ad29-43179afe265b
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Complete the residual
@workflow_tool(retry=...)integration left after #193 extracted and merged the plan-authored Durable retry execution foundation.@workflow_tooland public retry policy exports.execution.retryat submission.This intentionally replaces rather than rebases #185. That branch predates #193 and rebasing its full tree would reintroduce already-merged foundation work and materially enlarge the review diff.
Scope
No engine, Activity envelope, native retry driver, dependency, frontmatter schema, or UI changes. Those execution pieces are already in #193.
Validation
python -m ruff check src testspython -m mypy srcpython -m pytest --cache-clear --cov=./src/azure_functions_agents --cov-report=xml --cov-branch tests— 1183 passed, 55 deselectedpython -m pytest -q -m e2e tests/endtoend/test_workflow_native_retry_e2e.py— 2 passed against a real Functions host and Docker AzuriteThe real-host run used
samples/workflow-retry-policywithlocal.settings.jsoncopied from the #193 worktree andTASKHUB_NAMEremoved, so Durable used the default TaskHub.