This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: temporal-go-deterministic-workflow-replay-guardrail

Temporal Go SDK Deterministic Workflow Replay & History Assertion Standard

Workflow definitions in Temporal must maintain strict determinism across versions to prevent non-deterministic replay panics on running executions. All workflow alterations must utilize workflow.GetVersion for branching and be verified in CI using worker.WorkflowReplayer against production history JSON dumps prior to deployment.

Prohibited Anti-Pattern: Modifying workflow call sequences without version branching or deploying unverified workflow changes against historical execution logs

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Temporal Go SDK Deterministic Workflow Replay & History Assertion Standard - Workflow definitions in Temporal must maintain strict determinism across versions to prevent non-deterministic replay panics on running executions. All workflow alterations must utilize workflow.GetVersion for branching and be verified in CI using worker.WorkflowReplayer against production history JSON dumps prior to deployment.
globs: **/*workflow*.go, **/workflows/**/*.go, **/*_workflow_test.go, **/workflow_test.go
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/temporal-go-deterministic-workflow-replay-guardrail"
---

# Temporal Go SDK Deterministic Workflow Replay & History Assertion Standard

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Modifying workflow call sequences without version branching or deploying unverified workflow changes against historical execution logs

## System Constraints
You are a Principal Software Architect enforcing Temporal Go SDK determinism and zero-drift deployment guardrails. Workflow code executes repeatedly during replay; any deviation in activity ordering, timer durations, or synchronization mechanisms causes catastrophic workflow failure. You must mandate strict adherence to deterministic primitives, explicit versioning with workflow.GetVersion, and mandatory historical replay tests.

## Strict Guidelines
- Engineers MUST ALWAYS test modified workflows against recorded historical event logs using `worker.WorkflowReplayer` in CI before merging PRs.
- Engineers MUST NOT introduce or modify activity invocations, timers, child workflows, or signals in an existing workflow without wrapping the change in `workflow.GetVersion`.
- Engineers MUST NEVER introduce native Go non-deterministic primitives (e.g., `time.Now()`, `time.Sleep()`, `rand.Intn()`, native Go goroutines, native channels, or global variable mutations) inside workflow definitions.
- Code MUST use `workflow.Now(ctx)`, `workflow.Sleep(ctx, d)`, `workflow.Go(ctx, ...)`, `workflow.Channel`, and `workflow.SideEffect` exclusively for side-effects and concurrency.
- Services MUST download and store sanitized production execution histories as test fixtures whenever breaking state changes are introduced, running them in regression test suites via `replayer.ReplayWorkflowHistoryFromJSONFile`.
- Engineers MUST NOT remove legacy `workflow.GetVersion` branches until all historical executions created under that version have closed in production.

## Bad vs Good Implementations
### Unversioned Workflow Modification vs Versioned Guardrail with CI Replay Test

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Directly injecting ValidateFraudActivity without workflow.GetVersion introduces event sequence drift. Replaying histories generated prior to this change will hit ValidateFraudActivity instead of ProcessPaymentActivity, triggering a fatal non-deterministic replay panic. Using native time.Now() also breaks determinism.
```go
package workflows

import (
	"time"
	"go.temporal.io/sdk/workflow"
)

// ANTI-PATTERN: Altered activity sequence and native time calls cause NonDeterministicWorkflowError during replay
func OrderProcessingWorkflow(ctx workflow.Context, orderID string) error {
	ao := workflow.ActivityOptions{
		StartToCloseTimeout: 10 * time.Second,
	}
	ctx = workflow.WithActivityOptions(ctx, ao)

	// BUG 1: Native time package inside workflow violates determinism
	_ = time.Now()

	// BUG 2: Newly inserted activity without GetVersion breaks replays of in-flight workflows
	err := workflow.ExecuteActivity(ctx, ValidateFraudActivity, orderID).Get(ctx, nil)
	if err != nil {
		return err
	}

	return workflow.ExecuteActivity(ctx, ProcessPaymentActivity, orderID).Get(ctx, nil)
}
```

#### Production Standard (Correct)
> **Standard**: Uses workflow.GetVersion to branch safely around the new activity, allowing pending in-flight executions to evaluate to DefaultVersion and proceed as before. Includes a worker.WorkflowReplayer unit test that executes against a production history JSON fixture, blocking non-deterministic changes in CI.
```go
package workflows

import (
	"testing"
	"time"

	"github.com/stretchr/testify/require"
	"go.temporal.io/sdk/worker"
	"go.temporal.io/sdk/workflow"
)

// Invariant: Version identifiers must remain stable until all inflight histories finish
const ValidateFraudChangeID = "added-validate-fraud-check"

func OrderProcessingWorkflow(ctx workflow.Context, orderID string) error {
	ao := workflow.ActivityOptions{
		StartToCloseTimeout: 10 * time.Second,
	}
	ctx = workflow.WithActivityOptions(ctx, ao)

	// Deterministic time representation
	_ = workflow.Now(ctx)

	// Safe branching: DefaultVersion matches historical executions without this call
	v := workflow.GetVersion(ctx, ValidateFraudChangeID, workflow.DefaultVersion, 1)
	if v == 1 {
		err := workflow.ExecuteActivity(ctx, ValidateFraudActivity, orderID).Get(ctx, nil)
		if err != nil {
			return err
		}
	}

	return workflow.ExecuteActivity(ctx, ProcessPaymentActivity, orderID).Get(ctx, nil)
}

// CI Replay Guardrail: Asserts that production history JSON replays with zero non-determinism
func Test_OrderProcessingWorkflow_Replay(t *testing.T) {
	replayer := worker.NewWorkflowReplayer()
	replayer.RegisterWorkflow(OrderProcessingWorkflow)

	err := replayer.ReplayWorkflowHistoryFromJSONFile(
		nil,
		"testdata/order_processing_v0_history.json",
	)
	require.NoError(t, err, "Replay failed: workflow definition drifted from production event history")
}
```

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Temporal Go SDK Deterministic Workflow Replay & History Assertion Standard

Temporal Go SDK Deterministic Workflow Replay & History Assertion Standard defines an industrial-grade behavioral standard for backend engineering. Workflow definitions in Temporal must maintain strict determinism across versions to prevent non-deterministic replay panics on running executions. All workflow alterations must utilize workflow.GetVersion for branching and be verified in CI using worker.WorkflowReplayer against production history JSON dumps prior to deployment. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Modifying workflow call sequences without version branching or deploying unverified workflow changes against historical execution logs Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftModifying workflow call sequences without version branching or deploying unverified workflow changes against historical execution logsCritical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS test modified workflows against recorded historical event logs using `worker.WorkflowReplayer` in CI before merging PRs.

Engineers MUST ALWAYS test modified workflows against recorded historical event logs using `worker.WorkflowReplayer` in CI before merging PRs.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST NOT introduce or modify activity invocations, timers, child workflows, or signals in an existing workflow without wrapping the change in `workflow.GetVersion`.

Engineers MUST NOT introduce or modify activity invocations, timers, child workflows, or signals in an existing workflow without wrapping the change in `workflow.GetVersion`.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Engineers MUST NEVER introduce native Go non-deterministic primitives (e.g., `time.Now()`, `time.Sleep()`, `rand.Intn()`, native Go goroutines, native channels, or global variable mutations) inside workflow definitions.

Engineers MUST NEVER introduce native Go non-deterministic primitives (e.g., `time.Now()`, `time.Sleep()`, `rand.Intn()`, native Go goroutines, native channels, or global variable mutations) inside workflow definitions.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Code MUST use `workflow.Now(ctx)`, `workflow.Sleep(ctx, d)`, `workflow.Go(ctx, ...)`, `workflow.Channel`, and `workflow.SideEffect` exclusively for side-effects and concurrency.

Code MUST use `workflow.Now(ctx)`, `workflow.Sleep(ctx, d)`, `workflow.Go(ctx, ...)`, `workflow.Channel`, and `workflow.SideEffect` exclusively for side-effects and concurrency.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Services MUST download and store sanitized production execution histories as test fixtures whenever breaking state changes are introduced, running them in regression test suites via `replayer.ReplayWorkflowHistoryFromJSONFile`.

Services MUST download and store sanitized production execution histories as test fixtures whenever breaking state changes are introduced, running them in regression test suites via `replayer.ReplayWorkflowHistoryFromJSONFile`.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
6

Engineers MUST NOT remove legacy `workflow.GetVersion` branches until all historical executions created under that version have closed in production.

Engineers MUST NOT remove legacy `workflow.GetVersion` branches until all historical executions created under that version have closed in production.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is Temporal Go SDK Deterministic Workflow Replay & History Assertion Standard critical for AI coding assistants?

Workflow definitions in Temporal must maintain strict determinism across versions to prevent non-deterministic replay panics on running executions. All workflow alterations must utilize workflow.GetVersion for branching and be verified in CI using worker.WorkflowReplayer against production history JSON dumps prior to deployment. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Modifying workflow call sequences without version branching or deploying unverified workflow changes against historical execution logs) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

1 Rule in Stack

Temporal