This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: go-chi-slog-concurrency-context-tracing-standard

Go 1.24 Chi slog Concurrency Context Tracing Standard

Mandates zero-allocation propagation of structured slog.Logger instances and telemetry context across synchronous and asynchronous goroutines in Go 1.24 Chi HTTP pipelines. Enforces the use of context.WithoutCancel for detached execution and typed, allocation-free context keys to eliminate data races, context cancellation panics, and telemetry loss.

Prohibited Anti-Pattern: Leaking HTTP Request Contexts and Dynamic Heap Allocations Across Spawned Worker Goroutines

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Go 1.24 Chi slog Concurrency Context Tracing Standard - Mandates zero-allocation propagation of structured slog.Logger instances and telemetry context across synchronous and asynchronous goroutines in Go 1.24 Chi HTTP pipelines. Enforces the use of context.WithoutCancel for detached execution and typed, allocation-free context keys to eliminate data races, context cancellation panics, and telemetry loss.
globs: **/*.go
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/go-chi-slog-concurrency-context-tracing-standard"
---

# Go 1.24 Chi slog Concurrency Context Tracing Standard

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Leaking HTTP Request Contexts and Dynamic Heap Allocations Across Spawned Worker Goroutines

## System Constraints
You are a Principal Engineer enforcing the Go 1.24 Chi slog Concurrency Context Tracing Standard. Mandate zero-allocation logger extraction, typed context keys, and explicit detached context propagation via context.WithoutCancel across all goroutines spawned from HTTP request scopes.

## Strict Guidelines
- Engineers MUST ALWAYS decouple spawned background goroutines from the active HTTP request lifecycle using context.WithoutCancel(r.Context()) to prevent immediate context.Canceled aborts when Chi flushes the response.
- Engineers MUST NOT store mutable loggers or dynamic attribute maps in context.Context; loggers stored in context MUST be pre-instantiated, immutable *slog.Logger pointers.
- Context keys MUST ALWAYS be defined as unexported, zero-size struct types (e.g., type loggerKey struct{}) to guarantee zero heap allocations during context value lookups.
- Handlers MUST extract logger instances via a deterministic, zero-allocation helper (e.g., LoggerFromContext(ctx)) that falls back to slog.Default() only when no scoped logger is bound.
- Asynchronous tasks spawned from Chi handlers MUST wrap the detached context with a bounded timeout via context.WithTimeout to prevent goroutine leaks.
- Components NEVER pass the raw r.Context() directly to a long-running or background go func().

## Bad vs Good Implementations
### Zero-Allocation slog Context Propagation in Chi Middleware and Asynchronous Handlers

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Using a string key causes interface-boxing heap allocations on every HTTP request. Passing r.Context() directly to the background goroutine causes immediate operational failure once the HTTP response is sent, as Chi and net/http cancel the request context and recycle underlying buffers, leading to context.Canceled errors and data races.
```go
package main

import (
	"context"
	"log/slog"
	"net/http"
	"time"

	"github.com/go-chi/chi/v5"
	"github.com/go-chi/chi/v5/middleware"
)

// ANTI-PATTERN: String context key forces heap allocation interface boxing
const LoggerKey = "logger"

func BadMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// Inefficient allocation on every request
		reqID := middleware.GetReqID(r.Context())
		l := slog.Default().With("request_id", reqID)
		ctx := context.WithValue(r.Context(), LoggerKey, l)
		next.ServeHTTP(w, r.WithContext(ctx))
	})
}

func BadHandler(w http.ResponseWriter, r *http.Request) {
	l := r.Context().Value(LoggerKey).(*slog.Logger)

	// RACE CONDITION & BUG: Leaking request context into background goroutine.
	// Once handler returns, Chi cancels or closes request resources,
	// causing background operations to fail with context.Canceled.
	go func() {
		time.Sleep(50 * time.Millisecond)
		// May panic or log invalid state because r.Context() is expired
		l.InfoContext(r.Context(), "async task completed")
	}()

	w.WriteHeader(http.StatusOK)
}
```

#### Production Standard (Correct)
> **Standard**: Production invariant compliant implementation ensuring memory safety, deterministic execution, and zero runtime hallucination.
```go
package main

import (
	"context"
	"log/slog"
	"net/http"
	"time"

	"github.com/go-chi/chi/v5"
	"github.com/go-chi/chi/v5/middleware"
)

// ZERO-ALLOCATION: Unexported empty struct prevents interface boxing allocations
type contextKey struct{}

var loggerCtxKey = contextKey{}

// WithLogger binds an immutable *slog.Logger to the request context
func WithLogger(ctx context.Context, logger *slog.Logger) context.Context {
	return context.WithValue(ctx, loggerCtxKey, logger)
}

// LoggerFromContext extracts the scoped logger with zero allocations
func LoggerFromContext(ctx context.Context) *slog.Logger {
	if logger, ok := ctx.Value(loggerCtxKey).(*slog.Logger); ok && logger != nil {
		return logger
	}
	return slog.Default()
}

func TracingMiddleware(logger *slog.Logger) func(next http.Handler) http.Handler {
	return func(next http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			reqID := middleware.GetReqID(r.Context())
			scoped := logger.With(slog.String("request_id", reqID))
			ctx := WithLogger(r.Context(), scoped)
			next.ServeHTTP(w, r.WithContext(ctx))
		})
	}
}

func GoodHandler(w http.ResponseWriter, r *http.Request) {
	logger := LoggerFromContext(r.Context())

	// Go 1.24 / 1.21+ standard: context.WithoutCancel retains context values
	// (logger, trace IDs) without inheriting premature cancellation.
	bgCtx := context.WithoutCancel(r.Context())

	go func() {
		// Enforce strict asynchronous execution deadline
		ctx, cancel := context.WithTimeout(bgCtx, 5*time.Second)
		defer cancel()

		time.Sleep(50 * time.Millisecond)
		LoggerFromContext(ctx).InfoContext(ctx, "async task completed successfully")
	}()

	w.WriteHeader(http.StatusOK)
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Go 1.24 Chi slog Concurrency Context Tracing Standard

Go 1.24 Chi slog Concurrency Context Tracing Standard defines an industrial-grade behavioral standard for backend engineering. Mandates zero-allocation propagation of structured slog.Logger instances and telemetry context across synchronous and asynchronous goroutines in Go 1.24 Chi HTTP pipelines. Enforces the use of context.WithoutCancel for detached execution and typed, allocation-free context keys to eliminate data races, context cancellation panics, and telemetry loss. 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: Leaking HTTP Request Contexts and Dynamic Heap Allocations Across Spawned Worker Goroutines 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 DriftLeaking HTTP Request Contexts and Dynamic Heap Allocations Across Spawned Worker GoroutinesCritical
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 decouple spawned background goroutines from the active HTTP request lifecycle using context.WithoutCancel(r.Context()) to prevent immediate context.Canceled aborts when Chi flushes the response.

Engineers MUST ALWAYS decouple spawned background goroutines from the active HTTP request lifecycle using context.WithoutCancel(r.Context()) to prevent immediate context.Canceled aborts when Chi flushes the response.

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 store mutable loggers or dynamic attribute maps in context.Context

Engineers MUST NOT store mutable loggers or dynamic attribute maps in context.Context; loggers stored in context MUST be pre-instantiated, immutable *slog.Logger pointers.

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

Context keys MUST ALWAYS be defined as unexported, zero-size struct types (e.g., type loggerKey struct{}) to guarantee zero heap allocations during context value lookups.

Context keys MUST ALWAYS be defined as unexported, zero-size struct types (e.g., type loggerKey struct{}) to guarantee zero heap allocations during context value lookups.

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

Handlers MUST extract logger instances via a deterministic, zero-allocation helper (e.g., LoggerFromContext(ctx)) that falls back to slog.Default() only when no scoped logger is bound.

Handlers MUST extract logger instances via a deterministic, zero-allocation helper (e.g., LoggerFromContext(ctx)) that falls back to slog.Default() only when no scoped logger is bound.

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

Asynchronous tasks spawned from Chi handlers MUST wrap the detached context with a bounded timeout via context.WithTimeout to prevent goroutine leaks.

Asynchronous tasks spawned from Chi handlers MUST wrap the detached context with a bounded timeout via context.WithTimeout to prevent goroutine leaks.

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

Components NEVER pass the raw r.Context() directly to a long-running or background go func().

Components NEVER pass the raw r.Context() directly to a long-running or background go func().

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 Chi slog Concurrency Context Tracing Standard critical for AI coding assistants?

Mandates zero-allocation propagation of structured slog.Logger instances and telemetry context across synchronous and asynchronous goroutines in Go 1.24 Chi HTTP pipelines. Enforces the use of context.WithoutCancel for detached execution and typed, allocation-free context keys to eliminate data races, context cancellation panics, and telemetry loss. 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 (Leaking HTTP Request Contexts and Dynamic Heap Allocations Across Spawned Worker Goroutines) 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