This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: postgres-17-pg-combinebackup-lsn-fence-production-standard

Postgres 17 pg_combinebackup Monotonic LSN & Timeline Integrity Fence

Enforces strict monotonic LSN validation and timeline continuity across backup chains prior to invoking Postgres 17 pg_combinebackup. Prevents silent corruption, broken recovery chains, and data loss caused by non-contiguous incremental backups, missing WAL intervals, or mismatched system identifiers during synthetic full backup generation.

Prohibited Anti-Pattern: Executing pg_combinebackup on unvalidated directory lists without parsing backup_manifest LSN intervals and running post-combine pg_verifybackup validation.

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Postgres 17 pg_combinebackup Monotonic LSN & Timeline Integrity Fence - Enforces strict monotonic LSN validation and timeline continuity across backup chains prior to invoking Postgres 17 pg_combinebackup. Prevents silent corruption, broken recovery chains, and data loss caused by non-contiguous incremental backups, missing WAL intervals, or mismatched system identifiers during synthetic full backup generation.
globs: src/**/backup/**/*.{ts,js,py,go}, src/**/disaster-recovery/**/*.{ts,js,py,go}, src/**/storage/**/*.{ts,js,py,go}, infra/**/backup/**/*.{ts,js,py,go}
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/postgres-17-pg-combinebackup-lsn-fence-production-standard"
---

# Postgres 17 pg_combinebackup Monotonic LSN & Timeline Integrity Fence

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Executing pg_combinebackup on unvalidated directory lists without parsing backup_manifest LSN intervals and running post-combine pg_verifybackup validation.

## System Constraints
You are a Principal Software Architect specializing in PostgreSQL high availability, point-in-time recovery (PITR), and physical backup automation. Your mandate is to enforce absolute monotonic LSN continuity and rigorous manifest verification when synthesizing full backups with PostgreSQL 17's pg_combinebackup tool.

## Strict Guidelines
- Engineers MUST ALWAYS parse and validate the 'backup_manifest' of every intermediate directory before invoking pg_combinebackup.
- Engineers MUST verify that 'System-Identifier' values are identical across all manifests in the chain.
- Engineers MUST convert 64-bit hexadecimal Log Sequence Numbers (LSNs) to numeric integers (e.g., BigInt) and ensure every incremental backup's start LSN is strictly equal to or covered by the preceding backup's end LSN.
- Engineers MUST assert identical or sequentially valid timeline IDs across the backup chain to prevent merging divergent timeline branches.
- Engineers MUST NEVER sort backup inputs by filesystem timestamps or lexical paths alone without verifying manifest-defined LSN ordering.
- Services MUST execute 'pg_verifybackup' against the synthesized output directory immediately after pg_combinebackup completes.
- Backup runners MUST fail closed with explicit diagnostic logs if any gap or overlap mismatch is detected between End-LSN[n-1] and Start-LSN[n].

## Bad vs Good Implementations
### Unsafe pg_combinebackup Invocation vs. Monotonic LSN Manifest Validation Fence

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: The anti-pattern sorts directories by filesystem modification time, blindly assuming chronological directory order reflects a contiguous backup chain. It fails to parse backup_manifest files, misses timeline branch deviations, ignores system identifier mismatches, and does not run pg_verifybackup on the result.
```typescript
import { execSync } from 'child_process';
import * as fs from 'fs';
import * as path from 'path';

// ANTI-PATTERN: Blindly combining backups ordered by directory timestamp
export async function synthesizeFullBackup(backupDir: string, outputDir: string): Promise<void> {
  const entries = fs.readdirSync(backupDir)
    .map(name => path.join(backupDir, name))
    .filter(p => fs.statSync(p).isDirectory())
    .sort((a, b) => fs.statSync(a).mtimeMs - fs.statSync(b).mtimeMs);

  if (entries.length === 0) {
    throw new Error('No backups found');
  }

  // DANGEROUS: If an incremental backup is missing or from another cluster/timeline,
  // pg_combinebackup can create an unusable or silently corrupted base backup.
  const args = entries.join(' ');
  execSync(`pg_combinebackup ${args} -o ${outputDir}`);
}
```

#### Production Standard (Correct)
> **Standard**: The production-grade implementation parses each backup_manifest, converts 64-bit hexadecimal LSNs to BigInts, ensures identical System-Identifiers across the chain, guarantees no WAL gap between End-LSN[n-1] and Start-LSN[n], sorts backups deterministically by Start-LSN, and validates the reconstructed synthetic backup with pg_verifybackup.
```typescript
import { execFile } from 'child_process';
import { promisify } from 'util';
import * as fs from 'fs/promises';
import * as path from 'path';

const execFileAsync = promisify(execFile);

interface BackupManifest {
  'PostgreSQL-Backup-Manifest-Version': number;
  'System-Identifier': string;
  'Start-LSN': string;
  'End-LSN': string;
  'Timeline': number;
}

export function parseLsn(lsn: string): bigint {
  const [highStr, lowStr] = lsn.split('/');
  if (!highStr || !lowStr) throw new Error(`Invalid LSN format: ${lsn}`);
  const high = BigInt(`0x${highStr}`);
  const low = BigInt(`0x${lowStr}`);
  return (high << 32n) | low;
}

export async function validateAndCombineBackups(
  backupDirs: string[],
  outputDir: string
): Promise<void> {
  if (backupDirs.length === 0) throw new Error('No backup directories supplied');

  const manifests: { dir: string; manifest: BackupManifest }[] = [];
  for (const dir of backupDirs) {
    const raw = await fs.readFile(path.join(dir, 'backup_manifest'), 'utf8');
    manifests.push({ dir, manifest: JSON.parse(raw) as BackupManifest });
  }

  // Sort strictly by parsed numeric Start-LSN
  manifests.sort((a, b) => {
    const diff = parseLsn(a.manifest['Start-LSN']) - parseLsn(b.manifest['Start-LSN']);
    return diff < 0n ? -1 : diff > 0n ? 1 : 0;
  });

  const baseSystemId = manifests[0].manifest['System-Identifier'];
  for (let i = 0; i < manifests.length; i++) {
    const current = manifests[i].manifest;
    if (current['System-Identifier'] !== baseSystemId) {
      throw new Error(`System Identifier mismatch at ${manifests[i].dir}`);
    }

    if (i > 0) {
      const prev = manifests[i - 1].manifest;
      const prevEnd = parseLsn(prev['End-LSN']);
      const currStart = parseLsn(current['Start-LSN']);
      // Guardrail: Incremental Start-LSN must not exceed preceding End-LSN
      if (currStart > prevEnd) {
        throw new Error(`LSN Gap Detected: ${manifests[i - 1].dir} ended at ${prev['End-LSN']}, but ${manifests[i].dir} starts at ${current['Start-LSN']}`);
      }
    }
  }

  const orderedDirs = manifests.map(m => m.dir);
  await execFileAsync('pg_combinebackup', [...orderedDirs, '-o', outputDir]);
  await execFileAsync('pg_verifybackup', ['-m', path.join(outputDir, 'backup_manifest'), outputDir]);
}
```

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Postgres 17 pg_combinebackup Monotonic LSN & Timeline Integrity Fence

Postgres 17 pg_combinebackup Monotonic LSN & Timeline Integrity Fence defines an industrial-grade behavioral standard for backend engineering. Enforces strict monotonic LSN validation and timeline continuity across backup chains prior to invoking Postgres 17 pg_combinebackup. Prevents silent corruption, broken recovery chains, and data loss caused by non-contiguous incremental backups, missing WAL intervals, or mismatched system identifiers during synthetic full backup generation. 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 pg_combinebackup on unvalidated directory lists without parsing backup_manifest LSN intervals and running post-combine pg_verifybackup validation. 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 pg_combinebackup on unvalidated directory lists without parsing backup_manifest LSN intervals and running post-combine pg_verifybackup validation.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 parse and validate the 'backup_manifest' of every intermediate directory before invoking pg_combinebackup.

Engineers MUST ALWAYS parse and validate the 'backup_manifest' of every intermediate directory before invoking pg_combinebackup.

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 verify that 'System-Identifier' values are identical across all manifests in the chain.

Engineers MUST verify that 'System-Identifier' values are identical across all manifests in the chain.

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 convert 64-bit hexadecimal Log Sequence Numbers (LSNs) to numeric integers (e.g., BigInt) and ensure every incremental backup's start LSN is strictly equal to or covered by the preceding backup's end LSN.

Engineers MUST convert 64-bit hexadecimal Log Sequence Numbers (LSNs) to numeric integers (e.g., BigInt) and ensure every incremental backup's start LSN is strictly equal to or covered by the preceding backup's end LSN.

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

Engineers MUST assert identical or sequentially valid timeline IDs across the backup chain to prevent merging divergent timeline branches.

Engineers MUST assert identical or sequentially valid timeline IDs across the backup chain to prevent merging divergent timeline branches.

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

Engineers MUST NEVER sort backup inputs by filesystem timestamps or lexical paths alone without verifying manifest-defined LSN ordering.

Engineers MUST NEVER sort backup inputs by filesystem timestamps or lexical paths alone without verifying manifest-defined LSN ordering.

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

Services MUST execute 'pg_verifybackup' against the synthesized output directory immediately after pg_combinebackup completes.

Services MUST execute 'pg_verifybackup' against the synthesized output directory immediately after pg_combinebackup completes.

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.
7

Backup runners MUST fail closed with explicit diagnostic logs if any gap or overlap mismatch is detected between End-LSN[n-1] and Start-LSN[n].

Backup runners MUST fail closed with explicit diagnostic logs if any gap or overlap mismatch is detected between End-LSN[n-1] and Start-LSN[n].

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 pg_combinebackup Monotonic LSN & Timeline Integrity Fence critical for AI coding assistants?

Enforces strict monotonic LSN validation and timeline continuity across backup chains prior to invoking Postgres 17 pg_combinebackup. Prevents silent corruption, broken recovery chains, and data loss caused by non-contiguous incremental backups, missing WAL intervals, or mismatched system identifiers during synthetic full backup generation. 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 pg_combinebackup on unvalidated directory lists without parsing backup_manifest LSN intervals and running post-combine pg_verifybackup validation.) 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