Files
Donald Pinckney b5719bc143 PR Tracking Initial Release (#4)
* 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>
2026-03-19 17:36:15 -04:00

2.9 KiB

Go SDK Determinism

Overview

The Go SDK has NO runtime sandbox (unlike Python/TypeScript). Workflows must be deterministic for replay, and determinism is enforced entirely by developer convention and optional static analysis via the workflowcheck tool (see references/go/determinism-protection.md).

Why Determinism Matters: History Replay

Temporal provides durable execution through History Replay. When a Worker restores workflow state, it re-executes workflow code from the beginning. This requires the code to be deterministic. See references/core/determinism.md for a deep explanation.

Forbidden Operations

Do not use any of the following in workflow code:

  • Native goroutines (go func()) -- use workflow.Go() instead
  • Native channels (chan, send, receive, range over channel) -- use workflow.Channel instead
  • Native select -- use workflow.Selector instead
  • time.Now() -- use workflow.Now(ctx) instead
  • time.Sleep() -- use workflow.Sleep(ctx, duration) instead
  • math/rand global (e.g., rand.Intn()) -- use workflow.SideEffect instead
  • crypto/rand.Reader -- use an activity instead
  • os.Stdin / os.Stdout / os.Stderr -- use workflow.GetLogger(ctx) for logging
  • Map range iteration (for k, v := range myMap) -- sort keys first, then iterate
  • Mutating global variables -- use local state or workflow.SideEffect
  • Anonymous functions as local activities -- the name is derived from the function and will be non-deterministic across replays; always use named functions for local activities

Safe Builtin Alternatives

Instead of Use
go func() { ... }() workflow.Go(ctx, func(ctx workflow.Context) { ... })
chan T workflow.NewChannel(ctx) / workflow.NewBufferedChannel(ctx, size)
select { ... } workflow.NewSelector(ctx)
time.Now() workflow.Now(ctx)
time.Sleep(d) workflow.Sleep(ctx, d)
rand.Intn(100) workflow.SideEffect(ctx, func(ctx workflow.Context) interface{} { return rand.Intn(100) })
uuid.New() workflow.SideEffect or pass as activity result
log.Println(...) workflow.GetLogger(ctx).Info(...)

Testing Replay Compatibility

Use worker.WorkflowReplayer to verify code changes are compatible with existing histories. See the Workflow Replay Testing section of references/go/testing.md

Best Practices

  1. Run workflowcheck ./... in CI to catch non-deterministic code early
  2. Always use workflow.* APIs instead of native Go concurrency and time primitives
  3. Move all I/O operations (network, filesystem, database) into activities
  4. Sort map keys before iterating if you must iterate over a map in workflow code
  5. Use workflow.GetLogger(ctx) instead of fmt.Println or log.Println for replay-safe logging
  6. Keep workflow code focused on orchestration; delegate non-deterministic work to activities
  7. Test with replay after making changes to workflow definitions