Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
0589a99
Clean up references/core/ai-integration.md
donald-pinckney Feb 13, 2026
22d90c5
Clean up references/core/common-gotchas.md
donald-pinckney Feb 13, 2026
a32152b
Clean up references/core/common-gotchas.md
donald-pinckney Feb 13, 2026
9ce8441
Clean up references/core/determinism.md
donald-pinckney Feb 13, 2026
519b2ea
Clean up references/core/determinism.md
donald-pinckney Feb 13, 2026
49c449a
Update error-reference.md
donald-pinckney Feb 17, 2026
d2a4af3
Update interactive-workflows.md
donald-pinckney Feb 17, 2026
e62865a
Clean up patterns.md
donald-pinckney Feb 17, 2026
324b532
Cut shell scripts
donald-pinckney Feb 17, 2026
5d3f79f
Edit troubleshooting.md
donald-pinckney Feb 17, 2026
19a9589
remove interceptors for now
donald-pinckney Feb 18, 2026
761b220
remove dynamic workflows
donald-pinckney Feb 18, 2026
4d032f4
clarify on heartbeating of async activity completions, and prompt it …
donald-pinckney Feb 18, 2026
8d77164
Improve references/python/advanced-features.md
donald-pinckney Feb 18, 2026
ceb40a0
Use explicit namespace in connect
donald-pinckney Feb 18, 2026
c61bc64
remove duplicated content from determinism.md, clean up
donald-pinckney Feb 18, 2026
236eab2
Improve references/python/data-handling.md
donald-pinckney Feb 18, 2026
43b1ed7
Prefer start_to_close_timeout
donald-pinckney Feb 18, 2026
cc593e3
don't explicitely provide defaults for retry policies
donald-pinckney Feb 18, 2026
24f0e3e
error-handling.md cleanup
donald-pinckney Feb 18, 2026
18cb1e8
move idempotency patterns to patterns.md
donald-pinckney Feb 18, 2026
03e8706
remove multi-param activities
donald-pinckney Feb 18, 2026
3f7dc9d
small edits
donald-pinckney Feb 18, 2026
9163fa2
Unify sandbox stuff into one file
donald-pinckney Feb 18, 2026
4c288cf
local activities aren't experimental
donald-pinckney Feb 18, 2026
b8b47ca
Clean up references/python/sync-vs-async.md
donald-pinckney Feb 18, 2026
9bc285f
Cleanup observability.md, remove duplicated search attributes
donald-pinckney Feb 19, 2026
f455d39
Cut otel for now
donald-pinckney Feb 19, 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
Prev Previous commit
Next Next commit
Prefer start_to_close_timeout
  • Loading branch information
donald-pinckney committed Feb 18, 2026
commit 43b1ed7ec45503a5ab15741c810e6a16a5b87080
2 changes: 1 addition & 1 deletion references/python/advanced-features.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class BatchProcessingWorkflow:
# Process next batch
state = await workflow.execute_activity(
process_batch, state,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)

# Check history size and continue-as-new if needed
Expand Down
6 changes: 3 additions & 3 deletions references/python/error-handling.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ async def run(self) -> str:
try:
return await workflow.execute_activity(
risky_activity,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
except ActivityError as e:
workflow.logger.error(f"Activity failed: {e}")
Expand All @@ -53,7 +53,7 @@ from temporalio.common import RetryPolicy

result = await workflow.execute_activity(
my_activity,
schedule_to_close_timeout=timedelta(minutes=10),
start_to_close_timeout=timedelta(minutes=10),
retry_policy=RetryPolicy(
initial_interval=timedelta(seconds=1),
backoff_coefficient=2.0,
Expand Down Expand Up @@ -120,7 +120,7 @@ class OrderWorkflow:
if not self._payment_completed:
self._transaction_id = await workflow.execute_activity(
charge_payment, order.id, order.total,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
self._payment_completed = True

Expand Down
6 changes: 4 additions & 2 deletions references/python/gotchas.md
Original file line number Diff line number Diff line change
Expand Up @@ -291,14 +291,14 @@ async def call_api():
# BAD - Gives up too easily
result = await workflow.execute_activity(
flaky_api_call,
schedule_to_close_timeout=timedelta(seconds=30),
start_to_close_timeout=timedelta(seconds=30),
retry_policy=RetryPolicy(maximum_attempts=1),
)

# GOOD - Resilient to transient failures
result = await workflow.execute_activity(
flaky_api_call,
schedule_to_close_timeout=timedelta(minutes=10),
start_to_close_timeout=timedelta(minutes=10),
retry_policy=RetryPolicy(
initial_interval=timedelta(seconds=1),
maximum_interval=timedelta(minutes=1),
Expand All @@ -308,6 +308,8 @@ result = await workflow.execute_activity(
)
```

Generally, prefer to use the default RetryPolicy.

## Heartbeating

### Forgetting to Heartbeat Long Activities
Expand Down
2 changes: 1 addition & 1 deletion references/python/observability.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class MyWorkflow:

result = await workflow.execute_activity(
my_activity,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)

workflow.logger.info("Activity completed", extra={"result": result})
Expand Down
24 changes: 12 additions & 12 deletions references/python/patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ class StatusWorkflow:
self._progress = i
await workflow.execute_activity(
process_item, i,
schedule_to_close_timeout=timedelta(minutes=1)
start_to_close_timeout=timedelta(minutes=1)
)
self._status = "completed"
return "done"
Expand Down Expand Up @@ -166,7 +166,7 @@ async def run(self, items: list[str]) -> list[str]:
tasks = [
workflow.execute_activity(
process_item, item,
schedule_to_close_timeout=timedelta(minutes=5)
start_to_close_timeout=timedelta(minutes=5)
)
for item in items
]
Expand Down Expand Up @@ -232,25 +232,25 @@ async def run(self, order: Order) -> str:
try:
await workflow.execute_activity(
reserve_inventory, order,
schedule_to_close_timeout=timedelta(minutes=5)
start_to_close_timeout=timedelta(minutes=5)
)
compensations.append(lambda: workflow.execute_activity(
release_inventory, order,
schedule_to_close_timeout=timedelta(minutes=5)
start_to_close_timeout=timedelta(minutes=5)
))

await workflow.execute_activity(
charge_payment, order,
schedule_to_close_timeout=timedelta(minutes=5)
start_to_close_timeout=timedelta(minutes=5)
)
compensations.append(lambda: workflow.execute_activity(
refund_payment, order,
schedule_to_close_timeout=timedelta(minutes=5)
start_to_close_timeout=timedelta(minutes=5)
))

await workflow.execute_activity(
ship_order, order,
schedule_to_close_timeout=timedelta(minutes=5)
start_to_close_timeout=timedelta(minutes=5)
)

return "Order completed"
Expand Down Expand Up @@ -279,7 +279,7 @@ async def run(self) -> str:
try:
await workflow.execute_activity(
long_running_activity,
schedule_to_close_timeout=timedelta(hours=1),
start_to_close_timeout=timedelta(hours=1),
)
return "completed"
except asyncio.CancelledError:
Expand All @@ -288,7 +288,7 @@ async def run(self) -> str:
# Cleanup activities still run even after cancellation
await workflow.execute_activity(
cleanup_activity,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
raise # Re-raise to mark workflow as cancelled
```
Expand Down Expand Up @@ -375,13 +375,13 @@ async def run(self) -> str:
# New implementation
greeting = await workflow.execute_activity(
new_greet_activity,
schedule_to_close_timeout=timedelta(minutes=1)
start_to_close_timeout=timedelta(minutes=1)
)
else:
# Old implementation (for replay)
greeting = await workflow.execute_activity(
old_greet_activity,
schedule_to_close_timeout=timedelta(minutes=1)
start_to_close_timeout=timedelta(minutes=1)
)

return greeting
Expand Down Expand Up @@ -423,7 +423,7 @@ async def run(self) -> str:
result = await workflow.execute_local_activity(
quick_lookup,
"key",
schedule_to_close_timeout=timedelta(seconds=5),
start_to_close_timeout=timedelta(seconds=5),
)
return result
```
Expand Down
2 changes: 1 addition & 1 deletion references/python/python.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class GreetingWorkflow:
@workflow.run
async def run(self, name: str) -> str:
return await workflow.execute_activity(
greet, name, schedule_to_close_timeout=timedelta(seconds=30)
greet, name, start_to_close_timeout=timedelta(seconds=30)
)
```

Expand Down
4 changes: 2 additions & 2 deletions references/python/sandbox.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,12 @@ class OrderWorkflow:
await workflow.execute_activity(
process_payment,
order_id,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
return await workflow.execute_activity(
ship_order,
order_id,
schedule_to_close_timeout=timedelta(minutes=10),
start_to_close_timeout=timedelta(minutes=10),
)
```

Expand Down
24 changes: 12 additions & 12 deletions references/python/versioning.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ class ShippingWorkflow:
# New code path
await workflow.execute_activity(
send_email,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
else:
# Old code path (for replay of existing workflows)
await workflow.execute_activity(
send_fax,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
```

Expand All @@ -56,14 +56,14 @@ class OrderWorkflow:
await workflow.execute_activity(
check_fraud,
order,
schedule_to_close_timeout=timedelta(minutes=2),
start_to_close_timeout=timedelta(minutes=2),
)

# Original payment logic runs for both paths
return await workflow.execute_activity(
process_payment,
order,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
```

Expand All @@ -82,13 +82,13 @@ class OrderWorkflow:
await workflow.execute_activity(
check_fraud,
order,
schedule_to_close_timeout=timedelta(minutes=2),
start_to_close_timeout=timedelta(minutes=2),
)

return await workflow.execute_activity(
process_payment,
order,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
```

Expand All @@ -104,13 +104,13 @@ class OrderWorkflow:
await workflow.execute_activity(
check_fraud,
order,
schedule_to_close_timeout=timedelta(minutes=2),
start_to_close_timeout=timedelta(minutes=2),
)

return await workflow.execute_activity(
process_payment,
order,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
```

Expand All @@ -127,19 +127,19 @@ class NotificationWorkflow:
# Latest: SMS notifications
await workflow.execute_activity(
send_sms,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
elif workflow.patched("use-email"):
# Intermediate: Email notifications
await workflow.execute_activity(
send_email,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
else:
# Original: Fax notifications
await workflow.execute_activity(
send_fax,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
```

Expand Down Expand Up @@ -274,7 +274,7 @@ class StableWorkflow:
# This workflow will always run on its assigned version
return await workflow.execute_activity(
process_order,
schedule_to_close_timeout=timedelta(minutes=5),
start_to_close_timeout=timedelta(minutes=5),
)
```

Expand Down