This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: axum-0-8-tokio-cooperative-budgeting-standard

Axum 0.8 Tokio Cooperative Task Budgeting & Cancellation Safety Standard

Mandates explicit cooperative task budgeting and cancellation-safe branching across Axum 0.8 middleware, extractors, and request streaming pipelines. Guarantees that compute-bound or tight I/O iterations yield control back to the Tokio runtime executor to prevent multi-threaded thread-pool starvation, latency tail spikes, and corrupt state on client disconnects.

Prohibited Anti-Pattern: Unbounded iteration without cooperative budget checks and cancellation-unsafe futures in tokio::select! middleware branches

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Axum 0.8 Tokio Cooperative Task Budgeting & Cancellation Safety Standard - Mandates explicit cooperative task budgeting and cancellation-safe branching across Axum 0.8 middleware, extractors, and request streaming pipelines. Guarantees that compute-bound or tight I/O iterations yield control back to the Tokio runtime executor to prevent multi-threaded thread-pool starvation, latency tail spikes, and corrupt state on client disconnects.
globs: src/**/*.rs, crates/**/*.rs
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/axum-0-8-tokio-cooperative-budgeting-standard"
---

# Axum 0.8 Tokio Cooperative Task Budgeting & Cancellation Safety Standard

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Unbounded iteration without cooperative budget checks and cancellation-unsafe futures in tokio::select! middleware branches

## System Constraints
You are a Principal Rust Architect enforcing cooperative async runtime invariants in Axum 0.8 and Tokio. Every async routine that processes streaming bodies, iterative middleware pipelines, or CPU-adjacent decoding MUST explicitly interact with Tokio's cooperative budgeting subsystem (`tokio::task::consume_budget().await` or `tokio::task::yield_now().await`) and ensure all branches inside `tokio::select!` blocks are provably cancellation-safe.

## Strict Guidelines
- Engineers MUST ALWAYS invoke `tokio::task::consume_budget().await` inside tight streaming body loops or batch token-validation routines to prevent multi-threaded runtime starvation.
- Engineers MUST NOT place cancellation-unsafe futures (such as `AsyncReadExt::read`, multi-stage transactions, or unpinned partial writes) directly inside race conditions within `tokio::select!` branches without pinning state outside the macro.
- Middleware pipelines processing multi-part or streaming request payloads MUST monitor connection termination via `axum::serve::IncomingConnection` and clean up state safely on abrupt client drop.
- Services MUST route long-running, blocking CPU-bound tasks (such as Argon2/Bcrypt hashing, image transcoding, or heavy cryptographic validation) to `tokio::task::spawn_blocking` rather than saturating cooperative async worker pools.
- Components NEVER execute raw synchronizing primitives (`std::sync::Mutex`, `std::sync::RwLock`) across `.await` points; all concurrent state within Axum extractors MUST utilize `tokio::sync` equivalents or decouple lock acquisition from async suspension.

## Bad vs Good Implementations
### Cancellation-Unsafe Stream Middleware vs. Cancellation-Safe Cooperative Budget Yielding

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Iterating over unbudgeted data streams starves the Tokio worker thread because cooperative budget limits are bypassed when stream processing is tightly coupled without yield points. Additionally, if wrapped in external timeouts or select! blocks, partially processed chunks drop without cleanup.
```rust
use axum::{body::Body, extract::Request, middleware::Next, response::Response};
use futures_util::StreamExt;
use tokio::io::AsyncReadExt;

pub async fn unbudgeted_middleware(req: Request<Body>, next: Next) -> Response {
    let (parts, body) = req.into_parts();
    let mut stream = body.into_data_stream();
    let mut buffer = Vec::new();

    // ANTI-PATTERN 1: Cancellation unsafe tokio::select! recreates read state on drop
    // ANTI-PATTERN 2: No cooperative budget yielding; starves executor under multi-megabyte streams
    while let Some(chunk_res) = stream.next().await {
        if let Ok(chunk) = chunk_res {
            buffer.extend_from_slice(&chunk);
            // Starves worker thread on large uploads: Tokio budget never checked
        }
    }

    let req = Request::from_parts(parts, Body::from(buffer));
    next.run(req).await
}
```

#### Production Standard (Correct)
> **Standard**: Utilizes `tokio::task::consume_budget().await` on incoming data frames to cooperatively surrender execution time to other Tokio runtime tasks. Pins the frame reading inside a biased `tokio::select!` block to preserve partial buffers and enforce determinism.
```rust
use axum::{body::Body, extract::Request, middleware::Next, response::{Response, IntoResponse}};
use bytes::BytesMut;
use http::StatusCode;
use futures_util::StreamExt;
use tokio::task;

pub async fn budgeted_cancellation_safe_middleware(req: Request<Body>, next: Next) -> Result<Response, StatusCode> {
    let (parts, body) = req.into_parts();
    let mut stream = body.into_data_stream();
    let mut buffer = BytesMut::with_capacity(8192);

    // Invariant: Yield control cooperatively to the Tokio executor
    // and ensure clean abort without dropping un-flushed partial state
    loop {
        tokio::select! {
            biased;
            chunk_opt = stream.next() => {
                match chunk_opt {
                    Some(Ok(chunk)) => {
                        buffer.extend_from_slice(&chunk);
                        // Invariant: Explicitly consume Tokio budget to avoid thread starvation
                        task::consume_budget().await;
                    }
                    Some(Err(_)) => return Err(StatusCode::BAD_REQUEST),
                    None => break,
                }
            }
            _ = task::yield_now() => {
                // Secondary safety valve guaranteeing scheduler fairness under high packet density
            }
        }
    }

    let reconstructed_req = Request::from_parts(parts, Body::from(buffer.freeze()));
    Ok(next.run(reconstructed_req).await)
}
```

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Axum 0.8 Tokio Cooperative Task Budgeting & Cancellation Safety Standard

Axum 0.8 Tokio Cooperative Task Budgeting & Cancellation Safety Standard defines an industrial-grade behavioral standard for backend engineering. Mandates explicit cooperative task budgeting and cancellation-safe branching across Axum 0.8 middleware, extractors, and request streaming pipelines. Guarantees that compute-bound or tight I/O iterations yield control back to the Tokio runtime executor to prevent multi-threaded thread-pool starvation, latency tail spikes, and corrupt state on client disconnects. 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: Unbounded iteration without cooperative budget checks and cancellation-unsafe futures in tokio::select! middleware branches 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 DriftUnbounded iteration without cooperative budget checks and cancellation-unsafe futures in tokio::select! middleware branchesCritical
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 invoke `tokio

Engineers MUST ALWAYS invoke `tokio::task::consume_budget().await` inside tight streaming body loops or batch token-validation routines to prevent multi-threaded runtime starvation.

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 place cancellation-unsafe futures (such as `AsyncReadExt

Engineers MUST NOT place cancellation-unsafe futures (such as `AsyncReadExt::read`, multi-stage transactions, or unpinned partial writes) directly inside race conditions within `tokio::select!` branches without pinning state outside the macro.

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

Middleware pipelines processing multi-part or streaming request payloads MUST monitor connection termination via `axum

Middleware pipelines processing multi-part or streaming request payloads MUST monitor connection termination via `axum::serve::IncomingConnection` and clean up state safely on abrupt client drop.

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

Services MUST route long-running, blocking CPU-bound tasks (such as Argon2/Bcrypt hashing, image transcoding, or heavy cryptographic validation) to `tokio

Services MUST route long-running, blocking CPU-bound tasks (such as Argon2/Bcrypt hashing, image transcoding, or heavy cryptographic validation) to `tokio::task::spawn_blocking` rather than saturating cooperative async worker pools.

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

Components NEVER execute raw synchronizing primitives (`std

Components NEVER execute raw synchronizing primitives (`std::sync::Mutex`, `std::sync::RwLock`) across `.await` points; all concurrent state within Axum extractors MUST utilize `tokio::sync` equivalents or decouple lock acquisition from async suspension.

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 Axum 0.8 Tokio Cooperative Task Budgeting & Cancellation Safety Standard critical for AI coding assistants?

Mandates explicit cooperative task budgeting and cancellation-safe branching across Axum 0.8 middleware, extractors, and request streaming pipelines. Guarantees that compute-bound or tight I/O iterations yield control back to the Tokio runtime executor to prevent multi-threaded thread-pool starvation, latency tail spikes, and corrupt state on client disconnects. 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 (Unbounded iteration without cooperative budget checks and cancellation-unsafe futures in tokio::select! middleware branches) 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

Axum