This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: postgres-17-streaming-io-vector-pinning-standard

Postgres 17 Streaming I/O and Vector Scan Buffer Pinning Invariant

Enforces query-level buffer isolation, asynchronous streaming I/O prefetch boundaries, and strict index-scan enforcement for pgvector similarity searches under Postgres 17. Guarantees that concurrent vector scans utilize isolated BufferAccessStrategy rings and bounded prefetch queues, preventing shared buffer eviction storms and page pin exhaustion.

Prohibited Anti-Pattern: Unconstrained Vector Scans Causing Shared Buffer Cache Eviction and Pin Lock Contention

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Postgres 17 Streaming I/O and Vector Scan Buffer Pinning Invariant - Enforces query-level buffer isolation, asynchronous streaming I/O prefetch boundaries, and strict index-scan enforcement for pgvector similarity searches under Postgres 17. Guarantees that concurrent vector scans utilize isolated BufferAccessStrategy rings and bounded prefetch queues, preventing shared buffer eviction storms and page pin exhaustion.
globs: src/database/**/*.ts, src/repositories/**/*.ts, src/services/**/*.ts, src/lib/db/**/*.ts
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/postgres-17-streaming-io-vector-pinning-standard"
---

# Postgres 17 Streaming I/O and Vector Scan Buffer Pinning Invariant

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Unconstrained Vector Scans Causing Shared Buffer Cache Eviction and Pin Lock Contention

## System Constraints
You are a Principal Database Architect enforcing the Postgres 17 Streaming I/O Vector Scan Buffer Pinning Standard. Prevent shared buffer eviction storms, thrashing, and prolonged buffer pin holding during high-concurrency vector similarity scans. Mandate strict index scan enforcement, bounded prefetch depths, and transaction-isolated buffer access strategies.

## Strict Guidelines
- Engineers MUST ALWAYS wrap vector similarity queries in transaction-scoped contexts with bounded index tuning (`hnsw.ef_search` or `ivfflat.probes`) to prevent fallback to unindexed sequential heap scans.
- Engineers MUST NOT execute vector distance queries (`<->`, `<=>`, `<#>`) over unbounded sets without scalar partitioning or indexed pre-filtering, preventing sequential streaming prefetchers from replacing working-set cache.
- Code SHOULD explicitly set transaction-local query parameters (`SET LOCAL enable_seqscan = off`) when executing similarity searches on tables larger than `shared_buffers` to fail fast rather than trigger buffer eviction cascades.
- Services MUST configure Postgres 17 asynchronous I/O and streaming prefetch limits (`io_combine_limit`, `effective_io_concurrency`) proportionally to the connection pool size to prevent buffer pin starvation.
- Components NEVER issue streaming parallel vector queries that hold open cursor pins across network roundtrips or asynchronous application boundaries.

## Bad vs Good Implementations
### Vector Similarity Search Buffer Protection

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Executing vector distance queries without constraining query planner execution paths or index parameters allows Postgres 17's asynchronous streaming read engine to aggressively prefetch sequential pages into shared_buffers if the planner deviates from the HNSW index, rapidly evicting hot cache for the entire database cluster.
```typescript
import { Pool } from 'pg';

const pool = new Pool();

export async function searchEmbeddings(queryEmbedding: number[], tenantId: string, limit: number = 10) {
  // ANTI-PATTERN: Unbounded similarity search on large table.
  // If HNSW index is unavailable or planner chooses seq scan, PG17 streaming I/O
  // will prefetch massive chunks into shared_buffers, evicting active cache entries
  // and thrashing buffer pins under concurrent traffic.
  const query = `
    SELECT id, document_id, content, embedding <=> $1::vector AS distance
    FROM document_embeddings
    WHERE tenant_id = $2
    ORDER BY distance ASC
    LIMIT $3;
  `;
  const client = await pool.connect();
  try {
    const res = await client.query(query, [JSON.stringify(queryEmbedding), tenantId, limit]);
    return res.rows;
  } finally {
    client.release();
  }
}
```

#### Production Standard (Correct)
> **Standard**: The query executes within a localized read-only transaction enforcing `SET LOCAL enable_seqscan = off` and an explicit `hnsw.ef_search` budget. This guarantees the Postgres 17 query engine strictly utilizes the vector index, isolating block reads to index traversals and preventing streaming sequential heap scans from wiping out shared buffers.
```typescript
import { Pool, PoolClient } from 'pg';

const pool = new Pool();

export async function searchEmbeddings(
  queryEmbedding: number[],
  tenantId: string,
  limit: number = 10
) {
  const client: PoolClient = await pool.connect();
  try {
    await client.query('BEGIN READ ONLY');
    // 1. Bound HNSW search complexity to keep scan buffers deterministic
    // 2. Disable sequential scans locally to prevent catastrophic fallback to streaming buffer eviction
    await client.query('SET LOCAL hnsw.ef_search = 100');
    await client.query('SET LOCAL enable_seqscan = off');

    const query = `
      SELECT id, document_id, content, embedding <=> $1::vector AS distance
      FROM document_embeddings
      WHERE tenant_id = $2
      ORDER BY embedding <=> $1::vector ASC
      LIMIT $3;
    `;
    
    const res = await client.query(query, [JSON.stringify(queryEmbedding), tenantId, limit]);
    await client.query('COMMIT');
    return res.rows;
  } catch (error) {
    await client.query('ROLLBACK');
    throw error;
  } finally {
    client.release();
  }
}
```

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Postgres 17 Streaming I/O and Vector Scan Buffer Pinning Invariant

Postgres 17 Streaming I/O and Vector Scan Buffer Pinning Invariant defines an industrial-grade behavioral standard for backend engineering. Enforces query-level buffer isolation, asynchronous streaming I/O prefetch boundaries, and strict index-scan enforcement for pgvector similarity searches under Postgres 17. Guarantees that concurrent vector scans utilize isolated BufferAccessStrategy rings and bounded prefetch queues, preventing shared buffer eviction storms and page pin exhaustion. 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: Unconstrained Vector Scans Causing Shared Buffer Cache Eviction and Pin Lock Contention 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 DriftUnconstrained Vector Scans Causing Shared Buffer Cache Eviction and Pin Lock ContentionCritical
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 wrap vector similarity queries in transaction-scoped contexts with bounded index tuning (`hnsw.ef_search` or `ivfflat.probes`) to prevent fallback to unindexed sequential heap scans.

Engineers MUST ALWAYS wrap vector similarity queries in transaction-scoped contexts with bounded index tuning (`hnsw.ef_search` or `ivfflat.probes`) to prevent fallback to unindexed sequential heap scans.

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 vector distance queries (`<->`, `<=>`, `<#>`) over unbounded sets without scalar partitioning or indexed pre-filtering, preventing sequential streaming prefetchers from replacing working-set cache.

Engineers MUST NOT execute vector distance queries (`<->`, `<=>`, `<#>`) over unbounded sets without scalar partitioning or indexed pre-filtering, preventing sequential streaming prefetchers from replacing working-set cache.

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

Code SHOULD explicitly set transaction-local query parameters (`SET LOCAL enable_seqscan = off`) when executing similarity searches on tables larger than `shared_buffers` to fail fast rather than trigger buffer eviction cascades.

Code SHOULD explicitly set transaction-local query parameters (`SET LOCAL enable_seqscan = off`) when executing similarity searches on tables larger than `shared_buffers` to fail fast rather than trigger buffer eviction cascades.

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 configure Postgres 17 asynchronous I/O and streaming prefetch limits (`io_combine_limit`, `effective_io_concurrency`) proportionally to the connection pool size to prevent buffer pin starvation.

Services MUST configure Postgres 17 asynchronous I/O and streaming prefetch limits (`io_combine_limit`, `effective_io_concurrency`) proportionally to the connection pool size to prevent buffer pin 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.
5

Components NEVER issue streaming parallel vector queries that hold open cursor pins across network roundtrips or asynchronous application boundaries.

Components NEVER issue streaming parallel vector queries that hold open cursor pins across network roundtrips or asynchronous application 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 Postgres 17 Streaming I/O and Vector Scan Buffer Pinning Invariant critical for AI coding assistants?

Enforces query-level buffer isolation, asynchronous streaming I/O prefetch boundaries, and strict index-scan enforcement for pgvector similarity searches under Postgres 17. Guarantees that concurrent vector scans utilize isolated BufferAccessStrategy rings and bounded prefetch queues, preventing shared buffer eviction storms and page pin exhaustion. 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 (Unconstrained Vector Scans Causing Shared Buffer Cache Eviction and Pin Lock Contention) 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

Postgres