mirror of
https://github.com/temporalio/skill-temporal-developer.git
synced 2026-09-14 13:52:58 +08:00
b5719bc143
* Add initial skill for testing, which is simply Steve's skill (#1) * Add initial skill for testing, which is simply Steve's skill * Rename skill to 'temporal-dev' and update version Updated skill name and version for Temporal Python. * Use claude to merge Steve's, Max's, and Mason's skills. (#2) * Use claude to merge Steve's, Max's, and Mason's skills. Did a review pass using claude's skill devlopment skills * Add missing things from Steve * trigger tweaks * Add in common gotchas from Johann * add simple feedback mechanism (#3) * Change skill name to kebab-case, for compatibility with Amp and Cline (#7) * Clean up references/core/ai-integration.md * Clean up references/core/common-gotchas.md * Clean up references/core/common-gotchas.md * Clean up references/core/determinism.md * Clean up references/core/determinism.md * Update error-reference.md * Update interactive-workflows.md * Clean up patterns.md * Cut shell scripts * Edit troubleshooting.md * remove interceptors for now * remove dynamic workflows * clarify on heartbeating of async activity completions, and prompt it a bit in relation to signals * Improve references/python/advanced-features.md * Use explicit namespace in connect * remove duplicated content from determinism.md, clean up * Improve references/python/data-handling.md * Prefer start_to_close_timeout * don't explicitely provide defaults for retry policies * error-handling.md cleanup * move idempotency patterns to patterns.md * remove multi-param activities * small edits * Unify sandbox stuff into one file * local activities aren't experimental * Clean up references/python/sync-vs-async.md * Cleanup observability.md, remove duplicated search attributes * Cut otel for now * cut a lot of duplicate stuff from python gotchas, address comments * de-duplicate content * Lots of improvements to testing * cleanup to top level of skill (like CLI install instructions), and to top-level of python * Improve patterns.md * clean up ai-patterns.md * Update readme with installation instructions * remove ts directory * De-couple core from python and TypeScript as much as possible * Remove TypeScript hints * add prompting for feedback at startup - wait for ethan on slack channel * shorten url * Update slack channel * Automated pass over on python cleanup & deduplication * Remove multi-patching from Python, since its obvious, dont waste tokens on it. (#34) * Add TypeScript (#31) Adds initial support for TypeScript to the skill --------- Co-authored-by: James Watkins-Harvey <mjameswh@users.noreply.github.com> Co-authored-by: Chris Olszewski <chrisdolszewski@gmail.com> * Fix typos and reference links (#36) * Fix typos and reference links * 2 more typo fixes * quick edit to readme (#37) * Fix saga compensations to run under cancellation protection (#43) When a workflow is cancelled mid-saga, compensations must run in a cancellation-protected scope, otherwise they are immediately cancelled before they can execute. - Python: wrap compensation loop in asyncio.shield() so it runs even when the workflow receives a CancelledError - TypeScript: wrap compensation loop in CancellationScope.nonCancellable() so it runs even when the root scope is cancelled (per official docs: "Cleanup logic must be in a nonCancellable scope") - TypeScript: also fix compensation registration order — register BEFORE calling the activity (was already correct in Python) Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com> * Update readme for public preview (#45) * a few more readme tweaks (#46) * Add MIT License to the project (#47) * Add Go (supersedes other PR) (#38) * progress on go * Go translation workflow completed. * missed a few spots * Manual edits * Address feedback * Add gotcha about anonymous local activities * Sample code for payload converter * clarify sdk protection mechanisms * Setup CODEOWNERS to AI SDK team (#48) * Align version number in SKILL.md and plugin.json. (#49) --------- Co-authored-by: James Watkins-Harvey <mjameswh@users.noreply.github.com> Co-authored-by: Chris Olszewski <chrisdolszewski@gmail.com> Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
52 lines
1.9 KiB
Markdown
52 lines
1.9 KiB
Markdown
# Python SDK Determinism
|
|
|
|
## Overview
|
|
|
|
The Python SDK runs workflows in a sandbox that provides automatic protection against many non-deterministic operations.
|
|
|
|
## Why Determinism Matters: History Replay
|
|
|
|
Temporal provides durable execution through **History Replay**. When a Worker needs to restore workflow state (after a crash, cache eviction, or to continue after a long timer), it re-executes the workflow code from the beginning, which requires the workflow code to be **deterministic**.
|
|
|
|
## Forbidden Operations
|
|
|
|
- Direct I/O (network, filesystem)
|
|
- Threading operations
|
|
- `subprocess` calls
|
|
- Global mutable state modification
|
|
- `time.sleep()` (use `workflow.sleep(timedelta(...))`)
|
|
- and so on
|
|
|
|
## Safe Builtin Alternatives to Common Non Deterministic Things
|
|
|
|
| Forbidden | Safe Alternative |
|
|
|-----------|------------------|
|
|
| `datetime.now()` | `workflow.now()` |
|
|
| `datetime.utcnow()` | `workflow.now()` |
|
|
| `random.random()` | `rng = workflow.new_random() ; rng.randint(1, 100)` |
|
|
| `uuid.uuid4()` | `workflow.uuid4()` |
|
|
| `time.time()` | `workflow.now().timestamp()` |
|
|
|
|
## Testing Replay Compatibility
|
|
|
|
Use the `Replayer` class to verify your code changes are compatible with existing histories. See the Workflow Replay Testing section of `references/python/testing.md`.
|
|
|
|
## Sandbox Behavior
|
|
|
|
The sandbox:
|
|
- Isolates global state via `exec` compilation
|
|
- Restricts non-deterministic library calls via proxy objects
|
|
- Passes through standard library with restrictions
|
|
|
|
See more info at `references/python/determinism-protection.md`
|
|
|
|
## Best Practices
|
|
|
|
1. Use `workflow.now()` for all time operations
|
|
2. Use `workflow.random()` for random values
|
|
3. Use `workflow.uuid4()` for unique identifiers
|
|
4. Pass through third-party libraries explicitly
|
|
5. Test with replay to catch non-determinism
|
|
6. Keep workflows focused on orchestration, delegate I/O to activities
|
|
7. Use `workflow.logger` instead of print() for replay-safe logging
|