# Versioning And Compatibility

pgGraph 1.x uses semantic versioning for its documented SQL API, configuration,
diagnostics, packages, and operational behavior. PostgreSQL tables remain the
source of truth across upgrades, and pgGraph can rebuild its graph indexes from
those tables.

## Supported Release Matrix

pgGraph 1.2 supports PostgreSQL 14 through 18. PostgreSQL 17 is the default
development and playground reference version. Published container images target
Linux on AMD64 and ARM64, and PGXN carries the verified 1.2.0 source bundle.

A patch release never removes a PostgreSQL major. A minor 1.x release may
retire a major only after upstream PostgreSQL support ends, with at least one
minor release and 90 days of notice. The final compatible pgGraph minor remains
the supported line for installations that cannot yet upgrade PostgreSQL.

## Stable 1.x Surfaces

Within the 1.x line, pgGraph preserves documented SQL function names,
signatures, argument defaults, result shapes, volatility and security context;
documented GUC names, accepted values, and defaults; standard SQLSTATE classes
and stable `PGxxx` diagnostic identifiers; extension-catalog meaning and
supported upgrade paths; and documented script entry points, flags, environment
variables, exit semantics, and user-visible output locations.

Minor releases may add new functions, configuration values, or supported query
capabilities. They do not append fields to an existing result row or otherwise
change a positional contract. A new result shape uses a new explicitly
versioned function or contract.

Undocumented internal Rust modules, extension-owned catalog tables, helper
scripts, temporary files, and artifact bytes are not public APIs. They may
change, but supported upgrades migrate internal catalogs safely and never ask
users to edit them directly.

## Artifacts And Rebuilds

Before loading a persisted graph index, pgGraph checks its format, version, and
completeness. Compatible indexes load normally. An index that is corrupt,
incomplete, or from an incompatible version is rejected with instructions to
rebuild it; pgGraph never guesses how to interpret the file.

pgGraph publishes a replacement index only after validating it and retains the
last valid index so other backends do not see a partial update. These guarantees
apply to every 1.x release.

If a release cannot reuse an existing graph index, rebuild it from the
PostgreSQL tables. Release notes identify releases that require a rebuild and
provide the exact build, validation, and rollback steps.

## Deprecation

An ordinary 1.x deprecation provides a documented replacement, retains the old
surface for at least two minor releases and six months (whichever is longer),
and tests both paths throughout that window. Removal waits for a major release.
Security or data-corruption emergencies may require a faster change; those
releases include an upgrade preflight, prominent migration instructions, and a
supported restore or rebuild procedure.

## Upgrade Procedure

Before upgrading, take a PostgreSQL backup and record the installed version and
graph state:

```bash
pg_dump --format=custom --file=pggraph-before-upgrade.dump DBNAME
psql -X -d DBNAME -c "SELECT extversion FROM pg_extension WHERE extname = 'graph';"
psql -X -d DBNAME -c "SELECT * FROM graph.status();"
```

For a supported 1.x-to-1.x update, install the new package for the same
PostgreSQL major, then run and validate:

```sql
ALTER EXTENSION graph UPDATE TO 'X.Y.Z';
SELECT extversion FROM pg_extension WHERE extname = 'graph';
SELECT * FROM graph.status();
```

For the 1.1.0-to-1.2.0 update, use:

```sql
ALTER EXTENSION graph UPDATE TO '1.2.0';
SELECT extversion FROM pg_extension WHERE extname = 'graph';
SELECT * FROM graph.status();
```

The update adds the paginated `graph.edge_types()` inventory and the
registration-clearing `graph.reset(boolean)` overload. Existing SQL objects,
owners, explicit grants, source rows, and registrations remain unchanged.
Existing v6 graph artifacts remain readable without a blanket rebuild. New
builds and mutable segments use adaptive v7 type storage; rebuild when you want
the base artifact itself to carry more than 254 relationship types.

<Callout type="info">
The update does not clear registrations. The existing `graph.reset()` call
still clears only the selected graph's projection and artifacts. Use
`graph.reset(true)` when you intentionally need to clear its registrations,
such as when stale relation OIDs produce `PG000`. Reapply every required
registration before calling `graph.build()`. See
[Stale Registration Produces PG000](/user_guide/troubleshooting#stale-registration-produces-pg000)
for the recovery sequence.
</Callout>

The historical 1.0.0-to-1.1.0 update uses:

```sql
ALTER EXTENSION graph UPDATE TO '1.1.0';
SELECT extversion FROM pg_extension WHERE extname = 'graph';
SELECT * FROM graph.status();
```

The update preserves the existing SQL signatures, adds relationship-typed
shortest-path overloads, and changes traversal, connected-components, and
component-statistics entry points to caller-preserving `SECURITY INVOKER`.
Existing v6 artifacts remain compatible. If an RLS-active relationship mapping
lacks a usable durable relationship identity, the query fails closed with
diagnostic `PG023` until `graph.build()` publishes a replacement.

To move from an alpha release to 1.0, preserve or restore the PostgreSQL source
tables, install 1.0 cleanly, reapply the reviewed graph registration, and run
`graph.build()`. Do not reuse alpha extension catalogs or graph files. The
repository's signed `v0.1.8` migration fixture verifies this source-preserving
path.

pgGraph 1.2 does not support an in-place SQL downgrade to 1.1.0. Keep the
pre-upgrade database backup and matching 1.1.0 package until cutover is
accepted. Rollback restores that backup into a clean database or server using
the 1.1.0 package; do not install a 1.1 shared library over 1.2 catalogs or v7
artifacts. A logical restore assigns new relation OIDs, so treat the projection
as derived state: on the restored 1.1 installation run `graph.reset()`,
re-register the restored source tables and relationships, and run
`graph.build()` before serving graph queries.

The same backup-restore rule applies to the historical 1.1.0-to-1.0.0
rollback, using the matching 1.0.0 package and zero-argument `graph.reset()`.

Installing an older binary over 1.x catalogs or artifacts is unsupported.
Binary downgrade is supported only when the target release notes say its
catalogs and artifacts remain compatible. Otherwise restore the pre-upgrade
backup and package. pgGraph stops before an irreversible migration when a safe
rollback cannot be guaranteed.

## Compatibility Inventory

The repository maintains `release/v1-contract.json` as a machine-readable
inventory of supported PostgreSQL majors, distribution targets, SQL function
names, GUCs, diagnostics, and the declared GQL profile. Release checks compare
that inventory with implementation sources. Any drift requires an explicit
compatibility review before the inventory can be regenerated.
