Skip to content

Feature workflow history propagation#823

Merged
yaron2 merged 9 commits into
dapr:mainfrom
cicoyle:feature/wf-ctx-propagation
May 21, 2026
Merged

Feature workflow history propagation#823
yaron2 merged 9 commits into
dapr:mainfrom
cicoyle:feature/wf-ctx-propagation

Conversation

@cicoyle

@cicoyle cicoyle commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Add workflow history propagation example highlighting usage:

  // Propagate full lineage chain (ancestor + own history)                                                                               
  workflow.WithHistoryPropagation(workflow.PropagateLineage())                                                                           
                                                                                                                                         
  // Trust boundary — only own history, no ancestors                                                                                     
  workflow.WithHistoryPropagation(workflow.PropagateOwnHistory())  

consumption:

	history := ctx.GetPropagatedHistory()

	merchantWf, err := history.GetLastWorkflowByName("MerchantCheckout")
	if err != nil {
		return FraudCheckResult{}, fmt.Errorf("expected MerchantCheckout in propagated history: %w", err)
	}
	processPaymentWf, err := history.GetLastWorkflowByName("ProcessPayment")
	if err != nil {
		return FraudCheckResult{}, fmt.Errorf("expected ProcessPayment in propagated history: %w", err)
	}
	merchant, err := merchantWf.GetLastActivityByName("ValidateMerchant")
	if err != nil {
		return FraudCheckResult{}, fmt.Errorf("expected ValidateMerchant in propagated history: %w", err)
	}
	card, err := processPaymentWf.GetLastActivityByName("ValidateCard")
	if err != nil {
		return FraudCheckResult{}, fmt.Errorf("expected ValidateCard in propagated history: %w", err)
	}
	spending, err := processPaymentWf.GetLastActivityByName("CheckSpendingLimits")
	if err != nil {
		return FraudCheckResult{}, fmt.Errorf("expected CheckSpendingLimits in propagated history: %w", err)
	}

Other propagated history funcs:
image

Future extension ideas:

workflow.WithHistoryPropagation(                                                                                                       
      workflow.PropagateLineage(),                                                                                                       
      workflow.WithMaxDepth(3),                         
      workflow.WithRedactInputs(),                                                                                                       
  )

cicoyle added 2 commits April 10, 2026 08:57
Signed-off-by: Cassandra Coyle <cassie@diagrid.io>
Signed-off-by: Cassandra Coyle <cassie@diagrid.io>
@codecov

codecov Bot commented Apr 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 54.78%. Comparing base (828ed6b) to head (4bb6082).
⚠️ Report is 7 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #823      +/-   ##
==========================================
+ Coverage   54.69%   54.78%   +0.09%     
==========================================
  Files          51       51              
  Lines        3474     3490      +16     
==========================================
+ Hits         1900     1912      +12     
- Misses       1434     1438       +4     
  Partials      140      140              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

cicoyle added 3 commits April 30, 2026 10:19
Signed-off-by: Cassandra Coyle <cassie@diagrid.io>
Signed-off-by: Cassandra Coyle <cassie@diagrid.io>
@cicoyle
cicoyle marked this pull request as ready for review April 30, 2026 15:31
Copilot AI review requested due to automatic review settings April 30, 2026 15:31
@cicoyle
cicoyle requested review from a team as code owners April 30, 2026 15:31

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new end-to-end example demonstrating Dapr Workflow history propagation (lineage vs own-history) and updates Go module dependencies to support the feature set.

Changes:

  • Bump Go module deps (notably github.com/dapr/kit and github.com/golang/mock) in root go.mod/go.sum.
  • Add a new examples/workflow-history-propagation example app showing propagation across parent/child workflows and activities.
  • Add supporting README, local (standalone) Dapr component config, and Kubernetes manifests + Dockerfile for running the example.

Reviewed changes

Copilot reviewed 10 out of 11 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
go.mod Updates root module dependencies.
go.sum Aligns checksums with updated dependencies.
examples/workflow/main.go Minor formatting change in existing workflow example.
examples/workflow-history-propagation/main.go New propagation demo workflow/activity implementation.
examples/workflow-history-propagation/README.md New runbook/docs for standalone + Kubernetes execution.
examples/workflow-history-propagation/Dockerfile Containerizes the example binary.
examples/workflow-history-propagation/config/redis.yaml Local dapr run state store component.
examples/workflow-history-propagation/k8s/app-deploy.yaml K8s deployment for the example app with Dapr annotations.
examples/workflow-history-propagation/k8s/redis-deploy.yaml K8s Redis deployment/service for workflow state.
examples/workflow-history-propagation/k8s/wf-store.yaml K8s Dapr state store component targeting in-cluster Redis.
examples/workflow-history-propagation/k8s/signing-config.yaml Enables WorkflowHistorySigning feature in K8s mode.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread examples/workflow-history-propagation/README.md Outdated
Comment thread examples/workflow-history-propagation/README.md
Comment thread examples/workflow-history-propagation/k8s/app-deploy.yaml
Comment thread examples/workflow-history-propagation/k8s/redis-deploy.yaml
Comment thread examples/workflow-history-propagation/k8s/wf-store.yaml
Comment thread examples/workflow-history-propagation/main.go Outdated
Comment thread examples/workflow-history-propagation/k8s/redis-deploy.yaml
Comment thread examples/workflow-history-propagation/k8s/signing-config.yaml
Comment thread examples/workflow-history-propagation/Dockerfile Outdated
Comment thread examples/workflow-history-propagation/main.go Outdated
Signed-off-by: Cassandra Coyle <cassie@diagrid.io>
@cicoyle cicoyle changed the title Feature workflow ctx propagation Feature workflow history propagation May 1, 2026
Comment thread go.mod Outdated
yaron2
yaron2 previously approved these changes May 18, 2026
mikeee
mikeee previously approved these changes May 19, 2026
Comment thread go.mod Outdated
nelson-parente added a commit to nelson-parente/quickstarts that referenced this pull request May 20, 2026
Aligns the Python workflow history propagation quickstart with the canonical
Go reference (dapr/go-sdk#823, dapr#1315) so all SDK quickstarts
share the same patient intake / e-prescribing scenario.

- Swap credit-card/fraud scenario for patient-intake/e-prescribing
- Adopt PatientIntake -> PrescribeMedication -> ComplianceAudit hierarchy
- Add is_replaying guards around all print() calls inside workflows
- Use Cassie's PascalCase activity/workflow names for cross-SDK consistency

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>
nelson-parente added a commit to nelson-parente/quickstarts that referenced this pull request May 20, 2026
Aligns the .NET workflow history propagation quickstart with the canonical
Go reference (dapr/go-sdk#823, dapr#1315) so all SDK quickstarts
share the same patient intake / e-prescribing scenario.

- Swap credit-card/fraud scenario for patient-intake/e-prescribing
- Adopt PatientIntake -> PrescribeMedication -> ComplianceAudit hierarchy
- Add IsReplaying guards around all Console.WriteLine inside workflows
- DispenseMedicationWorkflow still wraps the activity for OwnHistory
  (.NET SDK propagation is on ChildWorkflowTaskOptions only)
- Add event-level history walking in DispenseMedicationWorkflow

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>
Signed-off-by: Cassandra Coyle <cassie@diagrid.io>
@cicoyle
cicoyle dismissed stale reviews from mikeee and yaron2 via d051ecc May 21, 2026 20:29
cicoyle added 2 commits May 21, 2026 15:32
Signed-off-by: Cassandra Coyle <cassie@diagrid.io>
Signed-off-by: Cassandra Coyle <cassie@diagrid.io>
@yaron2
yaron2 merged commit 1dd6408 into dapr:main May 21, 2026
23 checks passed
Copilot AI pushed a commit to dapr/dotnet-sdk that referenced this pull request May 22, 2026
Cassie (durabletask-go author) flagged the .NET surface for cross-SDK
divergence post-merge of dotnet-sdk#1802 / #1818. This rewrites the
public history-propagation API to match the go-sdk shape — same one the
python-sdk just adopted (python-sdk#1047). Issue dotnet-sdk#1801 was
closed before her review; this PR delivers what the issue originally
described.

Three concrete gaps closed:

1. Activity-level opt-in (was missing entirely)
   - PropagationScope moved from ChildWorkflowTaskOptions to base
     WorkflowTaskOptions; ChildWorkflowTaskOptions inherits it.
   - WithHistoryPropagation() extension method added on the base record.
   - scheduleTaskAction.HistoryPropagationScope is now wired in
     WorkflowOrchestrationContext.CallActivityInternalAsync so activities
     can opt into propagation, matching CallChildWorkflowInternalAsync.
   - Without this, the Go SDK's reference example (SettlePayment activity
     using PropagateOwnHistory) literally cannot be ported to .NET.

2. Read API rewritten as high-level resolvers (was lossy FilterBy* + a
   PropagatedHistoryEvent record that dropped input/output/failure
   payloads)
   - PropagatedHistory.FilterByAppId/InstanceId/WorkflowName removed.
   - PropagatedHistory now exposes GetWorkflows(), GetWorkflowsByName(),
     GetLastWorkflowByName(), GetAppIds(), GetWorkflowsByAppId(),
     GetWorkflowsByInstanceId().
   - New WorkflowResult class with InstanceId/AppId/Name plus
     GetActivitiesByName(), GetLastActivityByName(),
     GetChildWorkflowsByName(), GetLastChildWorkflowByName() — mirrors
     durabletask-go's GetLastWorkflowByName / GetLastActivityByName /
     GetLastChildWorkflowByName renames from durabletask-go#105.
   - New ActivityResult record carries Name, Started, Completed, Failed,
     Input, Output, FailureDetails — matching the Go/Python equivalents
     so chain-of-custody patterns line up.
   - New ChildWorkflowResult record with the equivalent shape.

3. Event payload preserved internally (was discarded by ConvertChunk)
   - ConvertChunk in WorkflowOrchestrationContext now parses raw events,
     walks them to resolve TaskScheduled <-> TaskCompleted/Failed and
     ChildWorkflowInstanceCreated <-> ChildWorkflowInstanceCompleted/
     Failed by scheduleId, and produces fully-populated ActivityResult /
     ChildWorkflowResult instances. SDK retries reuse TaskExecutionId so
     matching is on scheduleId (matching Go/Python semantics).
   - Public API does not leak the proto HistoryEvent type — resolution
     happens at construction time inside Dapr.Workflow.

Additional surface additions:

- PropagationNotFoundException for missing-name lookups (mirrors
  Python's PropagationNotFoundError / Go's error returns).
- Static WorkflowHistory.PropagateLineage() / PropagateOwnHistory()
  factory helpers for go-sdk call-site parity.

Removed (clean break — 1.18 unreleased): PropagatedHistoryEntry,
PropagatedHistoryEvent, HistoryEventKind, FilterByAppId,
FilterByInstanceId, FilterByWorkflowName.

Tests:

- WorkflowHistoryPropagationTests.cs rewritten end-to-end to cover the
  new resolvers, query helpers, factory helpers, activity-level scope
  wiring, and child-workflow-level scope wiring.
- HistoryPropagationWorkflowTests.cs (integration) updated to use
  GetWorkflows().Count in place of Entries.Count.

Refs: #1801, dapr/durabletask-go#105, dapr/go-sdk#823,
dapr/python-sdk#1047

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

Co-authored-by: nelson-parente <20144601+nelson-parente@users.noreply.github.com>
sicoyle pushed a commit to GHX5T-SOL/python-sdk that referenced this pull request May 26, 2026
* feat(workflow): align history propagation API with go-sdk

Cassie (durabletask-go author) flagged divergence between python-sdk dapr#1025
and the freshly-renamed go-sdk helpers in durabletask-go dapr#105 (merged
2026-05-19, after dapr#1025 landed). This brings python-sdk's surface back
in line for cross-SDK parity before 1.18 ships.

Read API renames (mirror durabletask-go GetLast*ByName):
- PropagatedHistory.get_workflow_by_name      -> get_last_workflow_by_name
- WorkflowResult.get_activity_by_name         -> get_last_activity_by_name
- WorkflowResult.get_child_workflow_by_name   -> get_last_child_workflow_by_name

Plural variants (get_workflows_by_name, get_activities_by_name,
get_child_workflows_by_name) and the chain-level helpers are unchanged.

Scheduling helpers (mirror go-sdk workflow.PropagateLineage /
workflow.PropagateOwnHistory):
- propagate_lineage()      -> PropagationScope.LINEAGE
- propagate_own_history()  -> PropagationScope.OWN_HISTORY

PropagationScope enum is kept as the underlying value, so both
`propagation=propagate_lineage()` and
`propagation=PropagationScope.LINEAGE` work.

Example, README snippet, and tests updated to use the renamed/new
surface. No runtime/proto changes.

Refs: dapr#1001, dapr/durabletask-go#105, dapr/go-sdk#823
Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* refactor(workflow): drop propagate_lineage/propagate_own_history factories

Per review feedback, Go-style factory helpers are not idiomatic Python: they
obscure the actual enum value at the call site and confuse static type
checkers (return annotation only shows PropagationScope, not the specific
member). Use PropagationScope.LINEAGE / PropagationScope.OWN_HISTORY
directly instead.

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

---------

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>
WhitWaldo added a commit to dapr/dotnet-sdk that referenced this pull request May 27, 2026
* feat(workflow): align history propagation API with go-sdk

Cassie (durabletask-go author) flagged the .NET surface for cross-SDK
divergence post-merge of dotnet-sdk#1802 / #1818. This rewrites the
public history-propagation API to match the go-sdk shape — same one the
python-sdk just adopted (python-sdk#1047). Issue dotnet-sdk#1801 was
closed before her review; this PR delivers what the issue originally
described.

Three concrete gaps closed:

1. Activity-level opt-in (was missing entirely)
   - PropagationScope moved from ChildWorkflowTaskOptions to base
     WorkflowTaskOptions; ChildWorkflowTaskOptions inherits it.
   - WithHistoryPropagation() extension method added on the base record.
   - scheduleTaskAction.HistoryPropagationScope is now wired in
     WorkflowOrchestrationContext.CallActivityInternalAsync so activities
     can opt into propagation, matching CallChildWorkflowInternalAsync.
   - Without this, the Go SDK's reference example (SettlePayment activity
     using PropagateOwnHistory) literally cannot be ported to .NET.

2. Read API rewritten as high-level resolvers (was lossy FilterBy* + a
   PropagatedHistoryEvent record that dropped input/output/failure
   payloads)
   - PropagatedHistory.FilterByAppId/InstanceId/WorkflowName removed.
   - PropagatedHistory now exposes GetWorkflows(), GetWorkflowsByName(),
     GetLastWorkflowByName(), GetAppIds(), GetWorkflowsByAppId(),
     GetWorkflowsByInstanceId().
   - New WorkflowResult class with InstanceId/AppId/Name plus
     GetActivitiesByName(), GetLastActivityByName(),
     GetChildWorkflowsByName(), GetLastChildWorkflowByName() — mirrors
     durabletask-go's GetLastWorkflowByName / GetLastActivityByName /
     GetLastChildWorkflowByName renames from durabletask-go#105.
   - New ActivityResult record carries Name, Started, Completed, Failed,
     Input, Output, FailureDetails — matching the Go/Python equivalents
     so chain-of-custody patterns line up.
   - New ChildWorkflowResult record with the equivalent shape.

3. Event payload preserved internally (was discarded by ConvertChunk)
   - ConvertChunk in WorkflowOrchestrationContext now parses raw events,
     walks them to resolve TaskScheduled <-> TaskCompleted/Failed and
     ChildWorkflowInstanceCreated <-> ChildWorkflowInstanceCompleted/
     Failed by scheduleId, and produces fully-populated ActivityResult /
     ChildWorkflowResult instances. SDK retries reuse TaskExecutionId so
     matching is on scheduleId (matching Go/Python semantics).
   - Public API does not leak the proto HistoryEvent type — resolution
     happens at construction time inside Dapr.Workflow.

Additional surface additions:

- PropagationNotFoundException for missing-name lookups (mirrors
  Python's PropagationNotFoundError / Go's error returns).
- Static WorkflowHistory.PropagateLineage() / PropagateOwnHistory()
  factory helpers for go-sdk call-site parity.

Removed (clean break — 1.18 unreleased): PropagatedHistoryEntry,
PropagatedHistoryEvent, HistoryEventKind, FilterByAppId,
FilterByInstanceId, FilterByWorkflowName.

Tests:

- WorkflowHistoryPropagationTests.cs rewritten end-to-end to cover the
  new resolvers, query helpers, factory helpers, activity-level scope
  wiring, and child-workflow-level scope wiring.
- HistoryPropagationWorkflowTests.cs (integration) updated to use
  GetWorkflows().Count in place of Entries.Count.

Refs: #1801, dapr/durabletask-go#105, dapr/go-sdk#823,
dapr/python-sdk#1047

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* fix(workflow): address code-review feedback on history-propagation alignment

- Document the `new`-hiding contract on ChildWorkflowTaskOptions
  .WithHistoryPropagation and add a regression test that asserts the
  returned type is ChildWorkflowTaskOptions (not the base record), so
  InstanceId survives the with-expression.
- Add the standard `()`, `(string)`, and `(string, Exception)` constructors
  on PropagationNotFoundException so callers can wrap inner exceptions.
- Alias StringValue alongside the existing Timestamp alias in
  WorkflowOrchestrationContext so the propagation helper signature stays
  consistent with the rest of the file.

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* test(workflow): clarify chunk-order test variable names

Renames the test fixtures in GetPropagatedHistory_PreservesChunkOrder so the
variable order matches the documented oldest-first chunk ordering (index 0 is
the oldest ancestor, the last chunk is the immediate parent). No behavior change.

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* fix(workflow): pass StringValue-wrapped fields directly as strings

protoc unwraps google.protobuf.StringValue to a plain string in the
generated C# (only the wire codec uses the wrapper). The
StringValueOrNull(StringValue?) helper added in this branch expected
the wrapper type, breaking the build with CS1503 at the three call
sites in ResolveActivity / ResolveChildWorkflow. Drop the helper and
pass the generated string fields straight through — they are already
nullable at runtime and ActivityResult/ChildWorkflowResult accept
string? for Input/Output.

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* test(workflow): assign string directly to wrapper-typed fields

Same StringValue mismatch as the production fix — protoc-generated
properties for google.protobuf.StringValue fields are plain string,
not the wrapper. Drop the new StringValue { Value = ... } wrappers
in the test helpers.

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* refactor(workflow): rename propagation types and adopt TryGet pattern

Addresses Whit's review on #1825:

- Rename ActivityResult -> PropagatedHistoryActivityResult
- Rename ChildWorkflowResult -> PropagatedHistoryChildWorkflowResult
- Rename WorkflowResult -> PropagatedHistoryEntry (primary constructor)
- Drop WorkflowHistory static class; callers pass HistoryPropagationScope directly
- Switch GetLast*ByName to TryGet*ByName + drop PropagationNotFoundException
- Drop chunk/chain terminology from public XML docs
- Surface malformed propagated event bytes via InvalidProtocolBufferException
  instead of silently skipping
- Update unit tests to new names and TryGet asserts

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* test(workflow): rename propagation test cases to match renamed types

Test names previously embedded the old type names (ActivityResult,
ChildWorkflowResult); rename to the more general Activity_/ChildWorkflow_
prefix to avoid confusion with the renamed public types.

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* fix(workflow): match propagated-history names and app IDs case-insensitively

Workflow / activity names register through WorkflowsFactory with
StringComparer.OrdinalIgnoreCase, and app IDs are matched case-insensitively
on the invocation path. Align the propagated history lookups (GetAppIds,
GetWorkflowsByName, TryGetLastWorkflowByName, GetWorkflowsByAppId,
GetActivitiesByName, TryGetLastActivityByName, GetChildWorkflowsByName,
TryGetLastChildWorkflowByName) with that contract so callers don't get
surprising misses or duplicate logical IDs that only differ by casing.

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* perf(workflow): pre-index completion events in ConvertChunk

ConvertChunk previously rescanned the full event list inside ResolveActivity
and ResolveChildWorkflow, making conversion O(n²) in the number of history
events. Pre-index TaskCompleted / TaskFailed by TaskScheduledId (and the
ChildWorkflowInstance counterparts) up front so each scheduled item resolves
in O(1).

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* refactor(workflow): rename PropagatedHistory backing field to _entries

The private field and ctor parameter on PropagatedHistory are now named
after the value type they hold (PropagatedHistoryEntry) rather than the
'workflows' role those entries play today. Public API surface is
unchanged.

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* refactor(workflow): use generic propagated-history method names; add Status enum

Addresses Whit's 2026-05-24 review.

Rename the PropagatedHistory query family to scope-neutral names so the public
surface need not change if propagated history ever carries non-workflow entries:
  GetWorkflows()             -> GetEntries()
  GetWorkflowsByName()       -> FilterByWorkflowName()
  GetWorkflowsByAppId()      -> FilterByAppId()
  GetWorkflowsByInstanceId() -> FilterByInstanceId()

Add PropagatedHistoryTaskStatus (Pending/Completed/Failed) and a computed
Status property on PropagatedHistoryActivityResult and
PropagatedHistoryChildWorkflowResult so callers can switch on a single value.
The Started/Completed/Failed flags are retained for go-sdk/python-sdk parity;
Status is a projection of them, with Failed taking precedence over Completed.

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

* test(workflow): fix case-insensitive AppId filter expectation

FilterByAppId matches case-insensitively, so two entries whose app IDs
differ only in casing ("AppA" / "appa") both match a query for "APPA".
The de-duped GetAppIds list collapses to one, but the filter returns both;
assert two matches instead of one.

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>

---------

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>
Co-authored-by: Whit Waldo <whit.waldo@innovian.net>
sicoyle added a commit to dapr/python-sdk that referenced this pull request May 28, 2026
)

* feat(workflow): align history propagation API with go-sdk

Cassie (durabletask-go author) flagged divergence between python-sdk #1025
and the freshly-renamed go-sdk helpers in durabletask-go #105 (merged
2026-05-19, after #1025 landed). This brings python-sdk's surface back
in line for cross-SDK parity before 1.18 ships.

Read API renames (mirror durabletask-go GetLast*ByName):
- PropagatedHistory.get_workflow_by_name      -> get_last_workflow_by_name
- WorkflowResult.get_activity_by_name         -> get_last_activity_by_name
- WorkflowResult.get_child_workflow_by_name   -> get_last_child_workflow_by_name

Plural variants (get_workflows_by_name, get_activities_by_name,
get_child_workflows_by_name) and the chain-level helpers are unchanged.

Scheduling helpers (mirror go-sdk workflow.PropagateLineage /
workflow.PropagateOwnHistory):
- propagate_lineage()      -> PropagationScope.LINEAGE
- propagate_own_history()  -> PropagationScope.OWN_HISTORY

PropagationScope enum is kept as the underlying value, so both
`propagation=propagate_lineage()` and
`propagation=PropagationScope.LINEAGE` work.

Example, README snippet, and tests updated to use the renamed/new
surface. No runtime/proto changes.

Refs: #1001, dapr/durabletask-go#105, dapr/go-sdk#823


* refactor(workflow): drop propagate_lineage/propagate_own_history factories

Per review feedback, Go-style factory helpers are not idiomatic Python: they
obscure the actual enum value at the call site and confuse static type
checkers (return annotation only shows PropagationScope, not the specific
member). Use PropagationScope.LINEAGE / PropagationScope.OWN_HISTORY
directly instead.



---------


(cherry picked from commit 2fd3237)

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>
Signed-off-by: dapr-bot <dapr-bot@users.noreply.github.com>
Co-authored-by: Nelson Parente <nelson_parente@live.com.pt>
Co-authored-by: Sam <sam@diagrid.io>
alicejgibbons pushed a commit to dapr/quickstarts that referenced this pull request Jun 10, 2026
Ports Cassie Coyle's Go-SDK reference example (dapr/go-sdk#823) to Python.
Demonstrates PropagationScope.LINEAGE and PropagationScope.OWN_HISTORY in a
fraud-detection payment scenario with a 3-level workflow hierarchy.

Requires Dapr 1.18+ (dapr/dapr#9810) and dapr-ext-workflow 1.18+ (dapr/python-sdk#1025).

Signed-off-by: Nelson Parente <nelson_parente@live.com.pt>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants