This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: postgres-17-failover-slot-synchronization-ha-invariant

PostgreSQL 17 Failover Slot Synchronization & HA Replication Invariant

Enforces PostgreSQL 17 native logical replication failover slot synchronization across high-availability topologies. Ensures standby nodes synchronize logical slot offsets prior to promotion, eliminating confirmed_flush_lsn regression, catastrophic CDC duplicate replays, and downstream pipeline corruption.

Prohibited Anti-Pattern: Creating unmanaged logical slots or failing to gate primary WAL progression via standby_slot_names, triggering CDC stream corruption upon failover.

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: PostgreSQL 17 Failover Slot Synchronization & HA Replication Invariant - Enforces PostgreSQL 17 native logical replication failover slot synchronization across high-availability topologies. Ensures standby nodes synchronize logical slot offsets prior to promotion, eliminating confirmed_flush_lsn regression, catastrophic CDC duplicate replays, and downstream pipeline corruption.
globs: src/**/*.ts, src/database/**/*.ts, src/cdc/**/*.ts, infra/**/*.sql, config/**/*.conf
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/postgres-17-failover-slot-synchronization-ha-invariant"
---

# PostgreSQL 17 Failover Slot Synchronization & HA Replication Invariant

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Creating unmanaged logical slots or failing to gate primary WAL progression via standby_slot_names, triggering CDC stream corruption upon failover.

## System Constraints
You are a Principal Infrastructure and Database Architect enforcing PostgreSQL 17 Logical Failover Slot Synchronization invariants. Mandate strict adherence to PG17 slot synchronization configurations (failover = true, standby_slot_names, sync_replication_slots) across all database provisioning scripts, CDC connection handlers, and HA failover managers.

## Strict Guidelines
- Engineers MUST ALWAYS create logical replication slots with `failover = true` in PostgreSQL 17 environments using `pg_create_logical_replication_slot(slot_name, plugin, temporary, two_phase, failover)` or replication command syntax `CREATE_REPLICATION_SLOT ... (FAILOVER true)`.
- Engineers MUST ALWAYS configure `standby_slot_names` on the primary instance containing the physical replication slot of the failover standby to guarantee WAL records are retained until the standby persists them.
- Engineers MUST ensure physical standby instances enable `sync_replication_slots = true` in `postgresql.conf` with a configured `primary_conninfo` holding sufficient replication privileges for the slotsync worker.
- CDC consumer initialization code MUST verify that replication slots are not unpromoted synced replicas (`synced = false`) before consuming, and MUST enforce strictly monotonic LSN tracking to prevent replay attacks.
- Components NEVER connect streaming replication clients to standby nodes where `synced = true` on logical slots, as synchronized slots are read-only until physical node promotion.

## Bad vs Good Implementations
### Postgres 17 CDC Slot Provisioning and HA Invariant Check

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Creating a logical slot without the failover parameter (`failover = true`) causes Postgres 17 standby slot synchronization workers to ignore it. If the primary fails over, the standby lacks the slot or contains stale LSN offsets, corrupting downstream CDC consumers with massive duplicate replays or stream dropouts.
```typescript
import { Client } from 'pg';

export async function initCdcPipeline(client: Client, slotName: string): Promise<void> {
  // Flaw: Uses legacy 2-parameter slot creation; defaults failover to false
  // Primary can advance logical LSN far ahead of physical standby
  // On failover, the slot does not exist on the promoted node or resets LSN to beginning
  await client.query(
    `SELECT pg_create_logical_replication_slot($1, 'pgoutput');`,
    [slotName]
  );
  console.log(`Logical slot ${slotName} created without failover sync.`);
}
```

#### Production Standard (Correct)
> **Standard**: Explicitly verifies the cluster has configured `standby_slot_names` so WAL is not cleared before physical standbys replicate it, creates the logical slot with `failover = true` (Postgres 17 native), and validates that the slot is writable on the active primary node.
```typescript
import { Client } from 'pg';

export async function initCdcPipeline(client: Client, slotName: string): Promise<void> {
  // Invariant 1: Ensure primary has standby_slot_names configured to gate WAL advancement
  const gucRes = await client.query<{ standby_slot_names: string }>(
    `SHOW standby_slot_names;`
  );
  const standbySlotNames = gucRes.rows[0]?.standby_slot_names;
  if (!standbySlotNames || standbySlotNames.trim() === '') {
    throw new Error(
      'HA Invariant Violation: standby_slot_names is empty on primary. Logical slots cannot safely sync without physical standby gating.'
    );
  }

  // Invariant 2: Create logical replication slot with failover enabled (5th parameter: failover = true)
  await client.query(
    `SELECT pg_create_logical_replication_slot($1, 'pgoutput', false, false, true);`,
    [slotName]
  );

  // Invariant 3: Verify the slot is configured with failover=true and is not a read-only synced slot
  const slotRes = await client.query<{
    slot_name: string;
    failover: boolean;
    synced: boolean;
  }>(
    `SELECT slot_name, failover, synced FROM pg_replication_slots WHERE slot_name = $1;`,
    [slotName]
  );

  const slot = slotRes.rows[0];
  if (!slot || !slot.failover || slot.synced) {
    throw new Error(
      `HA Invariant Violation: Slot ${slotName} must have failover=true and synced=false on writable primary.`
    );
  }
}
```

Recommended Agent Skills (askills.dev)

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

Architectural Specification & Invariant Rationale

Architectural Invariant Design: PostgreSQL 17 Failover Slot Synchronization & HA Replication Invariant

PostgreSQL 17 Failover Slot Synchronization & HA Replication Invariant defines an industrial-grade behavioral standard for backend engineering. Enforces PostgreSQL 17 native logical replication failover slot synchronization across high-availability topologies. Ensures standby nodes synchronize logical slot offsets prior to promotion, eliminating confirmed_flush_lsn regression, catastrophic CDC duplicate replays, and downstream pipeline corruption. 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: Creating unmanaged logical slots or failing to gate primary WAL progression via standby_slot_names, triggering CDC stream corruption upon failover. 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 DriftCreating unmanaged logical slots or failing to gate primary WAL progression via standby_slot_names, triggering CDC stream corruption upon failover.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 create logical replication slots with `failover = true` in PostgreSQL 17 environments using `pg_create_logical_replication_slot(slot_name, plugin, temporary, two_phase, failover)` or replication command syntax `CREATE_REPLICATION_SLOT ... (FAILOVER true)`.

Engineers MUST ALWAYS create logical replication slots with `failover = true` in PostgreSQL 17 environments using `pg_create_logical_replication_slot(slot_name, plugin, temporary, two_phase, failover)` or replication command syntax `CREATE_REPLICATION_SLOT ... (FAILOVER true)`.

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 ALWAYS configure `standby_slot_names` on the primary instance containing the physical replication slot of the failover standby to guarantee WAL records are retained until the standby persists them.

Engineers MUST ALWAYS configure `standby_slot_names` on the primary instance containing the physical replication slot of the failover standby to guarantee WAL records are retained until the standby persists them.

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 ensure physical standby instances enable `sync_replication_slots = true` in `postgresql.conf` with a configured `primary_conninfo` holding sufficient replication privileges for the slotsync worker.

Engineers MUST ensure physical standby instances enable `sync_replication_slots = true` in `postgresql.conf` with a configured `primary_conninfo` holding sufficient replication privileges for the slotsync worker.

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

CDC consumer initialization code MUST verify that replication slots are not unpromoted synced replicas (`synced = false`) before consuming, and MUST enforce strictly monotonic LSN tracking to prevent replay attacks.

CDC consumer initialization code MUST verify that replication slots are not unpromoted synced replicas (`synced = false`) before consuming, and MUST enforce strictly monotonic LSN tracking to prevent replay attacks.

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 connect streaming replication clients to standby nodes where `synced = true` on logical slots, as synchronized slots are read-only until physical node promotion.

Components NEVER connect streaming replication clients to standby nodes where `synced = true` on logical slots, as synchronized slots are read-only until physical node promotion.

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 Failover Slot Synchronization & HA Replication Invariant critical for AI coding assistants?

Enforces PostgreSQL 17 native logical replication failover slot synchronization across high-availability topologies. Ensures standby nodes synchronize logical slot offsets prior to promotion, eliminating confirmed_flush_lsn regression, catastrophic CDC duplicate replays, and downstream pipeline corruption. 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 (Creating unmanaged logical slots or failing to gate primary WAL progression via standby_slot_names, triggering CDC stream corruption upon failover.) 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