This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: go-iter-pipeline-cancellation-propagation

Go 1.24 Range-Over-Func Pipeline Cancellation Propagation Invariant

Enforces strict cooperative context cancellation and iterator yield-break propagation across Go 1.24 range-over-func (`iter.Seq` and `iter.Seq2`) processing pipelines. Failure to check `ctx.Done()` alongside `yield()` return values within continuous iterators triggers orphan background goroutines, blocked channel writes, and unbounded memory leaks. Mandates clean early returns, defensive deferred resource teardown, and deterministic propagation of loop termination signals across multi-stage iterator pipelines.

Prohibited Anti-Pattern: Ignoring yield Boolean Return Values and Context Deadlines in Range-Over-Func Pipelines

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Go 1.24 Range-Over-Func Pipeline Cancellation Propagation Invariant - Enforces strict cooperative context cancellation and iterator yield-break propagation across Go 1.24 range-over-func (`iter.Seq` and `iter.Seq2`) processing pipelines. Failure to check `ctx.Done()` alongside `yield()` return values within continuous iterators triggers orphan background goroutines, blocked channel writes, and unbounded memory leaks. Mandates clean early returns, defensive deferred resource teardown, and deterministic propagation of loop termination signals across multi-stage iterator pipelines.
globs: **/*.go
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/go-iter-pipeline-cancellation-propagation"
---

# Go 1.24 Range-Over-Func Pipeline Cancellation Propagation Invariant

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Ignoring yield Boolean Return Values and Context Deadlines in Range-Over-Func Pipelines

## System Constraints
You are a Principal Go Architect enforcing strict resource management and concurrency invariants under Go 1.24+. You must enforce cooperative context cancellation and consumer-break propagation in all range-over-func (`iter.Seq`, `iter.Seq2`) iterator implementations. Every iterator producer that spawns goroutines or reads from external channels must actively evaluate both `yield(...) == false` and `ctx.Done()`, immediately terminating iteration and unwinding pipeline stages without leaving orphan goroutines or unconsumed buffered allocations.

## Strict Guidelines
- Engineers MUST ALWAYS treat the boolean return value of `yield(...)` as an immediate termination signal; if `yield` returns `false`, the iterator function MUST immediately return and cease emitting items.
- Engineers MUST ALWAYS pass `context.Context` to streaming iterators and check `ctx.Err() != nil` or select on `ctx.Done()` alongside worker channel reads to guarantee teardown when consumers stall or cancel.
- Engineers MUST NOT spawn unbounded worker goroutines inside or alongside `iter.Seq` pipelines without tying their lifecycle to both context cancellation and consumer yield termination via synchronization primitives (e.g., `sync.WaitGroup`, errgroup, or cancellation channels).
- Iterators bridging channels to `iter.Seq` MUST ensure that writer goroutines are unblocked via buffered sizing, explicit cancellation signaling, or drain loops upon early consumer `break`.
- Pipeline stage transformers (e.g., `Filter`, `Map`, `Batch`) MUST propagate the downstream `yield` signal directly upstream; an upstream iterator MUST NOT be invoked further once a downstream stage has signaled abort (`false`).

## Bad vs Good Implementations
### Continuous Pipeline Iterator with Context and Yield Cancellation

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: The iterator ignores the boolean return value of `yield(batch)`. When the downstream consumer breaks out of a `for ... := range StreamBatches(...)` loop, `StreamBatches` continues reading from `in`, creating an orphaned producer loop. Additionally, it lacks context cancellation handling, leaking goroutines if the input channel blocks.
```go
package pipeline

import (
	"context"
	"iter"
)

// BAD: Ignores yield return value and context cancellation in pipeline producer.
func StreamBatches[T any](ctx context.Context, in <-chan T, batchSize int) iter.Seq[[]T] {
	return func(yield func([]T) bool) {
		var batch []T
		for item := range in { // Blocks indefinitely if producer never closes, ignores ctx
			batch = append(batch, item)
			if len(batch) >= batchSize {
				yield(batch) // Ignores boolean return! Continues iterating even if consumer broke out
				batch = nil
			}
		}
		if len(batch) > 0 {
			yield(batch)
		}
	}
}
```

#### Production Standard (Correct)
> **Standard**: The iterator monitors `ctx.Done()` on every intake operation and rigorously checks the return value of `yield(batch)`. If the consumer terminates iteration early (e.g., via `break`), `yield` evaluates to `false`, and the iterator immediately returns, preventing channel draining, thread starvation, and goroutine leaks.
```go
package pipeline

import (
	"context"
	"iter"
)

// GOOD: Cooperatively checks context and immediately halts on yield() == false.
func StreamBatches[T any](ctx context.Context, in <-chan T, batchSize int) iter.Seq[[]T] {
	return func(yield func([]T) bool) {
		batch := make([]T, 0, batchSize)
		defer func() {
			// Ensure local state cleanup on early break or context abort
			batch = nil
		}()

		for {
			select {
			case <-ctx.Done():
				return
			case item, ok := <-in:
				if !ok {
					if len(batch) > 0 {
						_ = yield(batch)
					}
					return
				}
				batch = append(batch, item)
				if len(batch) >= batchSize {
					if !yield(batch) {
						return // Consumer broke out; halt upstream consumption immediately
					}
					batch = make([]T, 0, batchSize)
				}
			}
		}
	}
}
```

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Go 1.24 Range-Over-Func Pipeline Cancellation Propagation Invariant

Go 1.24 Range-Over-Func Pipeline Cancellation Propagation Invariant defines an industrial-grade behavioral standard for backend engineering. Enforces strict cooperative context cancellation and iterator yield-break propagation across Go 1.24 range-over-func (`iter.Seq` and `iter.Seq2`) processing pipelines. Failure to check `ctx.Done()` alongside `yield()` return values within continuous iterators triggers orphan background goroutines, blocked channel writes, and unbounded memory leaks. Mandates clean early returns, defensive deferred resource teardown, and deterministic propagation of loop termination signals across multi-stage iterator pipelines. 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: Ignoring yield Boolean Return Values and Context Deadlines in Range-Over-Func Pipelines 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 DriftIgnoring yield Boolean Return Values and Context Deadlines in Range-Over-Func PipelinesCritical
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 treat the boolean return value of `yield(...)` as an immediate termination signal

Engineers MUST ALWAYS treat the boolean return value of `yield(...)` as an immediate termination signal; if `yield` returns `false`, the iterator function MUST immediately return and cease emitting items.

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 ALWAYS pass `context.Context` to streaming iterators and check `ctx.Err() != nil` or select on `ctx.Done()` alongside worker channel reads to guarantee teardown when consumers stall or cancel.

Engineers MUST ALWAYS pass `context.Context` to streaming iterators and check `ctx.Err() != nil` or select on `ctx.Done()` alongside worker channel reads to guarantee teardown when consumers stall or cancel.

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 NOT spawn unbounded worker goroutines inside or alongside `iter.Seq` pipelines without tying their lifecycle to both context cancellation and consumer yield termination via synchronization primitives (e.g., `sync.WaitGroup`, errgroup, or cancellation channels).

Engineers MUST NOT spawn unbounded worker goroutines inside or alongside `iter.Seq` pipelines without tying their lifecycle to both context cancellation and consumer yield termination via synchronization primitives (e.g., `sync.WaitGroup`, errgroup, or cancellation channels).

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

Iterators bridging channels to `iter.Seq` MUST ensure that writer goroutines are unblocked via buffered sizing, explicit cancellation signaling, or drain loops upon early consumer `break`.

Iterators bridging channels to `iter.Seq` MUST ensure that writer goroutines are unblocked via buffered sizing, explicit cancellation signaling, or drain loops upon early consumer `break`.

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

Pipeline stage transformers (e.g., `Filter`, `Map`, `Batch`) MUST propagate the downstream `yield` signal directly upstream

Pipeline stage transformers (e.g., `Filter`, `Map`, `Batch`) MUST propagate the downstream `yield` signal directly upstream; an upstream iterator MUST NOT be invoked further once a downstream stage has signaled abort (`false`).

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 Go 1.24 Range-Over-Func Pipeline Cancellation Propagation Invariant critical for AI coding assistants?

Enforces strict cooperative context cancellation and iterator yield-break propagation across Go 1.24 range-over-func (`iter.Seq` and `iter.Seq2`) processing pipelines. Failure to check `ctx.Done()` alongside `yield()` return values within continuous iterators triggers orphan background goroutines, blocked channel writes, and unbounded memory leaks. Mandates clean early returns, defensive deferred resource teardown, and deterministic propagation of loop termination signals across multi-stage iterator pipelines. 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 (Ignoring yield Boolean Return Values and Context Deadlines in Range-Over-Func Pipelines) 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

Go