This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: valkey-8-cluster-failover-io-threading

Valkey 8.0 Threaded I/O Topology, Hash Tags, and Failover Guardrails

Enforces strict key hash-tagging for multi-key operations and atomic Lua scripts, alongside cluster-aware client configuration for Valkey 8.0 threaded I/O deployments. Prevents CROSSSLOT runtime exceptions, pipeline stalls, unhandled MOVED/ASK redirect storms, and connection pool exhaustion during master failovers.

Prohibited Anti-Pattern: Executing un-tagged multi-key Lua scripts via non-clustered clients without backoff-resilient MOVED/ASK redirection handling.

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Valkey 8.0 Threaded I/O Topology, Hash Tags, and Failover Guardrails - Enforces strict key hash-tagging for multi-key operations and atomic Lua scripts, alongside cluster-aware client configuration for Valkey 8.0 threaded I/O deployments. Prevents CROSSSLOT runtime exceptions, pipeline stalls, unhandled MOVED/ASK redirect storms, and connection pool exhaustion during master failovers.
globs: src/**/*.ts, src/**/*.js, lib/**/*.ts, config/**/*.ts
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/valkey-8-cluster-failover-io-threading"
---

# Valkey 8.0 Threaded I/O Topology, Hash Tags, and Failover Guardrails

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Executing un-tagged multi-key Lua scripts via non-clustered clients without backoff-resilient MOVED/ASK redirection handling.

## System Constraints
You are a Principal Backend Architect enforcing Valkey 8.0 invariants. Valkey 8.0 parallelizes socket read/write operations via threaded I/O, but executes commands and Lua scripts on the primary engine thread. You must strictly mandate key hash-tagging for multi-key atomicity, topology-aware cluster clients, and automated recovery from MOVED/ASK redirects and cluster failovers.

## Strict Guidelines
- Engineers MUST ALWAYS use hash tags (e.g., `{tenant:101}:counter` and `{tenant:101}:metadata`) for any multi-key commands, transactions, or Lua scripts targeting a Valkey cluster to guarantee keys map to the exact same hash slot (0-16383).
- Engineers MUST instantiate cluster-aware client drivers configured with automatic cluster slot discovery, refresh policies on MOVED redirects, and exponential backoff jitter on failover.
- Engineers MUST NOT execute ad-hoc, unbounded Lua scripts or multi-key operations with distinct hash roots; doing so triggers fatal `CROSSSLOT Keys in request don't hash to the same slot` errors.
- Code MUST explicitly separate cluster read-replica traffic (`scaleReads: 'slave'`) from write traffic when offloading I/O in read-heavy architectures, while honoring replica lag tolerances.
- Pipelines MUST NOT span cross-slot operations without client-side slot grouping; cluster-aware clients must partition commands by node before pipelining to avoid head-of-line blocking under threaded I/O.
- Lua scripts MUST declare all target keys via the `KEYS` array argument rather than hardcoding or dynamically computing key names in the script body, preserving engine slot validation and replication safety.

## Bad vs Good Implementations
### Cluster Token Bucket Rate Limiter with Hash-Tagged Keys and Clustered Client

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: The client lacks cluster topology configuration and fails to handle MOVED/ASK redirection during failover. The Lua script accesses multiple keys without hash tags (`{...}`) and computes key names dynamically, which causes immediate CROSSSLOT runtime rejections in a Valkey cluster.
```typescript
import Redis from 'ioredis';

// ANTI-PATTERN: Standard non-cluster client connected to a cluster node
// Keys do not share a hash tag, causing CROSSSLOT errors in Lua
const client = new Redis('redis://valkey-cluster-node-1:6379');

export async function consumeRateLimit(userId: string, cost: number): Promise<boolean> {
  const script = `
    local tokens = redis.call('GET', 'user:' .. KEYS[1] .. ':tokens')
    local lastUpdate = redis.call('GET', 'user:' .. KEYS[1] .. ':ts')
    -- Un-tagged separate keys fail in Valkey Cluster
    redis.call('SET', 'audit:user:' .. KEYS[1], 'checked')
    return 1
  `;
  
  // Runtime error: CROSSSLOT Keys in request don't hash to the same slot
  return await client.eval(script, 2, userId, `audit:user:${userId}`);
}
```

#### Production Standard (Correct)
> **Standard**: All accessed keys share the exact same hash tag `{user:id}`, ensuring deterministic placement on the same hash slot and safe atomic execution. The client is explicitly cluster-aware with retry jitter and slot auto-refresh during node failover.
```typescript
import { Cluster } from 'ioredis';

// PRODUCTION FIX: Clustered client with automatic slot refresh and redirect handling
export const valkeyCluster = new Cluster([
  { host: 'valkey-cluster-node-1', port: 6379 },
  { host: 'valkey-cluster-node-2', port: 6379 }
], {
  enableReadyCheck: true,
  slotsRefreshTimeout: 2000,
  scaleReads: 'all',
  clusterRetryStrategy(times: number) {
    // Exponential backoff with jitter to survive master failover
    const delay = Math.min(100 * Math.pow(2, times), 3000);
    return delay + Math.floor(Math.random() * 200);
  }
});

const RATE_LIMIT_LUA = `
  local keyTokens = KEYS[1]
  local keyAudit = KEYS[2]
  local cost = tonumber(ARGV[1])
  local currentTokens = tonumber(redis.call('GET', keyTokens) or '100')
  if currentTokens >= cost then
    redis.call('DECRBY', keyTokens, cost)
    redis.call('SET', keyAudit, ARGV[2], 'EX', 60)
    return 1
  end
  return 0
`;

export async function consumeRateLimit(userId: string, cost: number): Promise<boolean> {
  // Invariant: Hash tag {...} forces all keys to the exact same cluster hash slot
  const tokenKey = `{user:${userId}}:tokens`;
  const auditKey = `{user:${userId}}:audit`;
  
  const result = await valkeyCluster.eval(
    RATE_LIMIT_LUA,
    2,
    tokenKey,
    auditKey,
    cost.toString(),
    Date.now().toString()
  );
  return result === 1;
}
```

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: Valkey 8.0 Threaded I/O Topology, Hash Tags, and Failover Guardrails

Valkey 8.0 Threaded I/O Topology, Hash Tags, and Failover Guardrails defines an industrial-grade behavioral standard for backend engineering. Enforces strict key hash-tagging for multi-key operations and atomic Lua scripts, alongside cluster-aware client configuration for Valkey 8.0 threaded I/O deployments. Prevents CROSSSLOT runtime exceptions, pipeline stalls, unhandled MOVED/ASK redirect storms, and connection pool exhaustion during master failovers. 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: Executing un-tagged multi-key Lua scripts via non-clustered clients without backoff-resilient MOVED/ASK redirection handling. 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 DriftExecuting un-tagged multi-key Lua scripts via non-clustered clients without backoff-resilient MOVED/ASK redirection handling.Critical
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 use hash tags (e.g., `{tenant

Engineers MUST ALWAYS use hash tags (e.g., `{tenant:101}:counter` and `{tenant:101}:metadata`) for any multi-key commands, transactions, or Lua scripts targeting a Valkey cluster to guarantee keys map to the exact same hash slot (0-16383).

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 instantiate cluster-aware client drivers configured with automatic cluster slot discovery, refresh policies on MOVED redirects, and exponential backoff jitter on failover.

Engineers MUST instantiate cluster-aware client drivers configured with automatic cluster slot discovery, refresh policies on MOVED redirects, and exponential backoff jitter on failover.

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 execute ad-hoc, unbounded Lua scripts or multi-key operations with distinct hash roots

Engineers MUST NOT execute ad-hoc, unbounded Lua scripts or multi-key operations with distinct hash roots; doing so triggers fatal `CROSSSLOT Keys in request don't hash to the same slot` errors.

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 explicitly separate cluster read-replica traffic (`scaleReads

Code MUST explicitly separate cluster read-replica traffic (`scaleReads: 'slave'`) from write traffic when offloading I/O in read-heavy architectures, while honoring replica lag tolerances.

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

Pipelines MUST NOT span cross-slot operations without client-side slot grouping

Pipelines MUST NOT span cross-slot operations without client-side slot grouping; cluster-aware clients must partition commands by node before pipelining to avoid head-of-line blocking under threaded I/O.

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

Lua scripts MUST declare all target keys via the `KEYS` array argument rather than hardcoding or dynamically computing key names in the script body, preserving engine slot validation and replication safety.

Lua scripts MUST declare all target keys via the `KEYS` array argument rather than hardcoding or dynamically computing key names in the script body, preserving engine slot validation and replication safety.

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 Valkey 8.0 Threaded I/O Topology, Hash Tags, and Failover Guardrails critical for AI coding assistants?

Enforces strict key hash-tagging for multi-key operations and atomic Lua scripts, alongside cluster-aware client configuration for Valkey 8.0 threaded I/O deployments. Prevents CROSSSLOT runtime exceptions, pipeline stalls, unhandled MOVED/ASK redirect storms, and connection pool exhaustion during master failovers. 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 (Executing un-tagged multi-key Lua scripts via non-clustered clients without backoff-resilient MOVED/ASK redirection handling.) 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

Valkey