This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: pg17-stat-io-direct-io-memory-guardrail

PostgreSQL 17 pg_stat_io Telemetry and Cache Double-Buffering Guardrail

Establishes automated telemetry thresholds on PostgreSQL 17 pg_stat_io metrics to identify and prevent OS page cache double-buffering and shared buffer eviction storms during high-concurrency analytical and streaming workloads. Mandates automated rate-of-change tripwires on bulkread and normal I/O contexts alongside cursor-constrained streaming in application services.

Prohibited Anti-Pattern: Unmonitored Bulk Ingestion and Analytics Inducing OS Page Cache Double-Buffering and Buffer Thrashing

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: PostgreSQL 17 pg_stat_io Telemetry and Cache Double-Buffering Guardrail - Establishes automated telemetry thresholds on PostgreSQL 17 pg_stat_io metrics to identify and prevent OS page cache double-buffering and shared buffer eviction storms during high-concurrency analytical and streaming workloads. Mandates automated rate-of-change tripwires on bulkread and normal I/O contexts alongside cursor-constrained streaming in application services.
globs: src/database/**/*.ts, src/monitoring/**/*.ts, src/services/**/*.ts, src/jobs/**/*.ts
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/pg17-stat-io-direct-io-memory-guardrail"
---

# PostgreSQL 17 pg_stat_io Telemetry and Cache Double-Buffering Guardrail

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Unmonitored Bulk Ingestion and Analytics Inducing OS Page Cache Double-Buffering and Buffer Thrashing

## System Constraints
You are a Principal Database Infrastructure Engineer enforcing PostgreSQL 17 pg_stat_io memory safety and Direct I/O invariants. You must prevent memory exhaustion and OS page cache double-buffering caused by unbounded streaming queries and misconfigured backend I/O contexts. Mandate strict metric validation and cursor-driven access patterns.

## Strict Guidelines
- Engineers MUST ALWAYS monitor PostgreSQL 17 `pg_stat_io` differentiating `context = 'bulkread'` vs `context = 'normal'` to identify unbuffered OS file reads competing with `shared_buffers`.
- Engineers MUST NOT execute unbounded analytical queries or full-table exports without cursor batching or chunking, which circumvents PostgreSQL BAS_BULKREAD ring-buffer safety mechanisms and evicts working set memory.
- Database telemetry services MUST compute differential (delta) counters for `reads`, `writes`, and `extends` on `pg_stat_io` across sampling intervals rather than logging cumulative values.
- Services MUST trip alert thresholds and engage circuit breakers when the ratio of `pg_stat_io` client backend `reads` in `normal` context to `bulkread` context exceeds safe operational baselines during bulk queries.
- Analytical jobs MUST configure per-session `work_mem` and explicit cursor streaming fetch limits (max 5,000 rows per round-trip) to preserve query worker memory boundaries.

## Bad vs Good Implementations
### Analytical Streaming Data Ingestion with pg_stat_io Delta Guardrail

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Executing unbounded analytical queries loads massive result sets into memory, circumventing PostgreSQL ring buffers, triggering unmonitored disk I/O reads, and polluting OS page cache. Without pg_stat_io telemetry, cache eviction and buffer exhaustion go undetected until production latencies spike.
```typescript
import { Pool } from 'pg';

export async function streamCustomerMetrics(pool: Pool): Promise<void> {
  const client = await pool.connect();
  try {
    // ANTI-PATTERN: Unbounded raw sequential query loads millions of rows into node memory,
    // blows through shared_buffers without monitoring pg_stat_io, and causes OS page cache
    // double-buffering thrashing for concurrent transaction workers.
    const res = await client.query('SELECT * FROM large_analytical_events WHERE created_at > NOW() - INTERVAL \'30 days\'');
    for (const row of res.rows) {
      processRow(row);
    }
  } finally {
    client.release();
  }
}

function processRow(row: unknown): void {
  // Processing logic
}
```

#### Production Standard (Correct)
> **Standard**: Implements cursor-based chunking within a read-only transaction, constraining working memory and preventing node heap exhaustion. Actively queries PostgreSQL 17's pg_stat_io to monitor delta reads on the bulkread context, enforcing a hard circuit breaker if disk reads exceed safety thresholds.
```typescript
import { Pool, PoolClient } from 'pg';
import Cursor from 'pg-cursor';

interface PgStatIoSnapshot {
  reads: number;
  context: string;
  object: string;
}

export async function streamCustomerMetricsSafely(pool: Pool): Promise<void> {
  const client = await pool.connect();
  const BATCH_SIZE = 2500;
  const MAX_IO_READ_DELTA_THRESHOLD = 50000;

  try {
    const initialIo = await getBulkReadIoSnapshot(client);
    await client.query('BEGIN READ ONLY');

    const queryText = 'SELECT id, payload FROM large_analytical_events WHERE created_at > NOW() - INTERVAL \'30 days\'';
    const cursor = client.query(new Cursor(queryText));

    let rows = await cursor.read(BATCH_SIZE);
    while (rows.length > 0) {
      for (const row of rows) {
        processRow(row);
      }

      const currentIo = await getBulkReadIoSnapshot(client);
      const readDelta = currentIo.reads - initialIo.reads;

      if (readDelta > MAX_IO_READ_DELTA_THRESHOLD) {
        throw new Error(`I/O Guardrail breached: excessive bulk I/O reads detected (${readDelta}). Aborting stream to prevent buffer thrashing.`);
      }

      rows = await cursor.read(BATCH_SIZE);
    }

    await client.query('COMMIT');
  } catch (err) {
    await client.query('ROLLBACK');
    throw err;
  } finally {
    client.release();
  }
}

async function getBulkReadIoSnapshot(client: PoolClient): Promise<PgStatIoSnapshot> {
  const { rows } = await client.query<PgStatIoSnapshot>(
    `SELECT COALESCE(SUM(reads), 0)::bigint AS reads, context, object
     FROM pg_stat_io
     WHERE backend_type = 'client backend' AND context = 'bulkread' AND object = 'relation'
     GROUP BY context, object`
  );
  return rows[0] ?? { reads: 0, context: 'bulkread', object: 'relation' };
}

function processRow(row: unknown): void {
  // Processing logic
}
```

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: PostgreSQL 17 pg_stat_io Telemetry and Cache Double-Buffering Guardrail

PostgreSQL 17 pg_stat_io Telemetry and Cache Double-Buffering Guardrail defines an industrial-grade behavioral standard for backend engineering. Establishes automated telemetry thresholds on PostgreSQL 17 pg_stat_io metrics to identify and prevent OS page cache double-buffering and shared buffer eviction storms during high-concurrency analytical and streaming workloads. Mandates automated rate-of-change tripwires on bulkread and normal I/O contexts alongside cursor-constrained streaming in application services. 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: Unmonitored Bulk Ingestion and Analytics Inducing OS Page Cache Double-Buffering and Buffer Thrashing 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 DriftUnmonitored Bulk Ingestion and Analytics Inducing OS Page Cache Double-Buffering and Buffer ThrashingCritical
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 monitor PostgreSQL 17 `pg_stat_io` differentiating `context = 'bulkread'` vs `context = 'normal'` to identify unbuffered OS file reads competing with `shared_buffers`.

Engineers MUST ALWAYS monitor PostgreSQL 17 `pg_stat_io` differentiating `context = 'bulkread'` vs `context = 'normal'` to identify unbuffered OS file reads competing with `shared_buffers`.

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 execute unbounded analytical queries or full-table exports without cursor batching or chunking, which circumvents PostgreSQL BAS_BULKREAD ring-buffer safety mechanisms and evicts working set memory.

Engineers MUST NOT execute unbounded analytical queries or full-table exports without cursor batching or chunking, which circumvents PostgreSQL BAS_BULKREAD ring-buffer safety mechanisms and evicts working set memory.

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

Database telemetry services MUST compute differential (delta) counters for `reads`, `writes`, and `extends` on `pg_stat_io` across sampling intervals rather than logging cumulative values.

Database telemetry services MUST compute differential (delta) counters for `reads`, `writes`, and `extends` on `pg_stat_io` across sampling intervals rather than logging cumulative values.

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 trip alert thresholds and engage circuit breakers when the ratio of `pg_stat_io` client backend `reads` in `normal` context to `bulkread` context exceeds safe operational baselines during bulk queries.

Services MUST trip alert thresholds and engage circuit breakers when the ratio of `pg_stat_io` client backend `reads` in `normal` context to `bulkread` context exceeds safe operational baselines during bulk queries.

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

Analytical jobs MUST configure per-session `work_mem` and explicit cursor streaming fetch limits (max 5,000 rows per round-trip) to preserve query worker memory boundaries.

Analytical jobs MUST configure per-session `work_mem` and explicit cursor streaming fetch limits (max 5,000 rows per round-trip) to preserve query worker memory boundaries.

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 PostgreSQL 17 pg_stat_io Telemetry and Cache Double-Buffering Guardrail critical for AI coding assistants?

Establishes automated telemetry thresholds on PostgreSQL 17 pg_stat_io metrics to identify and prevent OS page cache double-buffering and shared buffer eviction storms during high-concurrency analytical and streaming workloads. Mandates automated rate-of-change tripwires on bulkread and normal I/O contexts alongside cursor-constrained streaming in application services. 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 (Unmonitored Bulk Ingestion and Analytics Inducing OS Page Cache Double-Buffering and Buffer Thrashing) 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

PostgreSQL