Contents
layout: default title: Release 0.13.0
nav_order: 10
Release 0.13.0
This page is the repo-owned release note for v0.13.0.
Summary
0.13.0 promotes the narrow fact-shaped GraphRAG contract to the stable
release surface.
Stable in this release:
sorted_heaptable AMsorted_hnswIndex AM forsvecandhsvec- Partition-aware
sorted_hnswhelpers:sorted_hnsw_partition_search(...)sorted_hnsw_partition_search_status(...)- explicit
exact_fallback := truefor selected-leaf underfill
- Fact-shaped GraphRAG (single-table):
sorted_heap_graph_rag(...)sorted_heap_graph_register(...)sorted_heap_graph_config(...)sorted_heap_graph_unregister(...)sorted_heap_graph_rag_stats()sorted_heap_graph_rag_reset_stats()sorted_heap_graph_route_last_stats()
- Routed GraphRAG (multi-shard, the recommended app-facing flow):
sorted_heap_graph_route(...)— unified routed query dispatchersorted_heap_graph_route_plan(...)— routing introspection/explain- Setup helpers for the canonical flow:
sorted_heap_graph_exact_register(...)/_unregister(...)sorted_heap_graph_segment_register(...)/_unregister(...)sorted_heap_graph_route_profile_register(...)/_unregister(...)sorted_heap_graph_route_default_register(...)/_unregister(...)sorted_heap_graph_route_policy_register(...)/_unregister(...)sorted_heap_graph_segment_meta_register(...)/_unregister(...)
Still beta:
- Lower-level routed GraphRAG building blocks:
_routed(...),_routed_exact(...),_routed_policy(...),_routed_profile(...),_routed_default(...)and their exact-key variantssorted_heap_graph_rag_segmented(...)(direct shard-array merge)- Deep catalog/introspection helpers (
_segment_catalog,_exact_catalog,_route_profile_catalog,_route_catalog) - Config/resolve helpers (
_segment_config,_exact_config,_route_profile_config,_route_default_config, etc.)
- Lower-level GraphRAG expand/rerank helpers and scan wrappers
- Code-corpus snippet/symbol/lexical retrieval contracts
- FlashHadamard experimental retrieval lane:
- SQL surface from
sql/flashhadamard_experimental.sql - file-backed mmap store + exhaustive parallel engine scan
- optional
FH_INT16=1Apple/NEON path - documented tech debt around
pthreadinside the backend
- SQL surface from
Legacy/manual:
svec_ann_scan(...)svec_ann_search(...)svec_hnsw_scan(...)
Highlights
Stable fact-shaped GraphRAG API
The primary entry point is now:
SELECT *
FROM sorted_heap_graph_rag(
'facts'::regclass,
'[0.1,0.2,0.3,...]'::svec,
relation_path := ARRAY[1, 2],
ann_k := 64,
top_k := 10,
score_mode := 'path'
);
This stable contract is intentionally narrow:
- fact rows clustered by
(entity_id, relation_id, target_id), or an equivalent registered alias mapping - one-hop or two-hop expansion
score_mode := 'endpoint' | 'path'- exact rerank on the expanded candidate set
Schema registration for non-canonical fact tables
GraphRAG now supports alias schemas through:
sorted_heap_graph_register(...)sorted_heap_graph_config(...)sorted_heap_graph_unregister(...)
This keeps the user-facing GraphRAG syntax stable even when fact tables use different column names.
Lifecycle hardening
The fact-shaped GraphRAG path now has dedicated coverage for:
0.12.0 -> 0.13.0extension upgrade- dump/restore persistence of graph registration metadata
- dump/restore persistence of segmented/routed GraphRAG registries, including
shared shard metadata, shared
segment_labels, and effective defaultsegment_labels - dump/restore persistence of the unified router flow:
sorted_heap_graph_route(...)andsorted_heap_graph_route_plan(...)produce identical results before and after restore - crash recovery for registered/indexed graph tables
- concurrent DML with
sorted_heap_compact_online(...) - concurrent DML with
sorted_heap_merge_online(...) sorted_hnswchunked cache integration test covering local-only, shared-cache publish/attach, and multi-index overwrite scenarios
Unified routed GraphRAG dispatcher
For multi-shard workloads (tenant isolation, knowledge-base routing), the new unified dispatcher replaces the previous zoo of per-routing-mode wrappers with one app-facing entry point:
SELECT *
FROM sorted_heap_graph_route(
'tenants',
'[0.1,0.2,0.3,...]'::svec,
relation_path := ARRAY[1, 2],
route_key := 'acme',
ann_k := 64,
top_k := 10,
score_mode := 'path'
);
SELECT * FROM sorted_heap_graph_route_plan(
'tenants', route_key := 'acme');
Resolution order: exact/range key → explicit profile → explicit policy →
call-site overrides → default profile → base dispatcher. See docs/api.md
“Routed GraphRAG: operator recipe” for the full setup/inspect/query flow.
Shared cache correctness fix
Fixed a multi-index shared-cache corruption bug where
shnsw_shared_scan_cache_attach() held bare pointers into shared memory.
A second index’s publish could silently corrupt the first index’s cache.
The attach path now deep-copies all bulk data. Regression-guarded by the
multi-index overwrite phase in scripts/test_hnsw_chunked_cache.sh.
Backend-local stage observability
GraphRAG now exposes backend-local last-call stats through:
sorted_heap_graph_rag_stats()sorted_heap_graph_rag_reset_stats()sorted_heap_graph_route_last_stats()for segmented/routed per-shard rows
The stats cover:
- seed count
- expanded row count
- reranked row count
- returned row count
- ANN / expand / rerank / total timing
For segmented/routed calls, sorted_heap_graph_route_last_stats() identifies
the concrete source_rel for each shard and the public aggregate stats row is
the sum of those shard rows in the same backend.
Benchmark snapshots
AWS Gutenberg (~104K x 2880D, top-10)
sorted_hnsw (hsvec):1.404 ms,100.0% Recall@10- pgvector
halfvec:2.031 ms,99.8% Recall@10
AWS fact-shaped multihop GraphRAG (5K chains, 384D)
sorted_heap_expand_twohop_path_rerank(): median0.962 ms, stable98.4% / 98.4%sorted_heap_graph_rag_twohop_path_scan(): median1.025 ms, stable98.4% / 98.4%pgvectorparity row: median1.434 ms,84.4-89.1zvec: median1.711 ms,100.0 / 100.0Qdrant: median3.355 ms,100.0 / 100.0
These numbers describe the narrow stable fact-shaped contract, not the broader code-corpus reference workflows.
FlashHadamard experimental engine snapshot (~103K x 2880D)
- canonical engine point: exhaustive parallel scan,
5-8 msp50 on the local Gutenberg workload - benchmark-reference external helper path:
8.7 ms - Apple/NEON
FH_INT16=1remains experimental, with a current approximately9%end-to-end win on the validated local query set - Intel AVX2 int16 LUT port is refuted for the current design; the stronger
x86 kernel branch is the separate AVX2 gather float experiment and is not
part of the
0.13integrated release surface
FlashHadamard is included in 0.13 as an experimental research lane, not as
part of the stable GraphRAG contract or the default ANN path.
Upgrade
ALTER EXTENSION pg_sorted_heap UPDATE TO '0.13.0';
Recommended verification after upgrade
make test-release
If you only need the narrow fact-shaped GraphRAG release bundle:
make test-graphrag-release
make test-release runs the full extension-wide 0.13 release-candidate
bundle, including the narrower GraphRAG bundle.
make test-graphrag-release runs the full narrow GraphRAG release bundle:
- SQL regression (
pg_sorted_heap,sorted_hnsw,graph_rag) - lifecycle
- crash recovery
- concurrent online-operation coverage
Release-candidate verification
Fresh 0.13.0 release-candidate checks ran on 2026-04-07:
make test-release
Observed GraphRAG-related signals from that full release bundle:
make installcheck ...->All 3 tests passedmake test-graphrag-lifecycle->status=ok pass=60 fail=0 total=60make test-graphrag-crash->status=ok pass=22 fail=0 total=22make test-graphrag-concurrent->status=ok pass=40 fail=0 total=40make test-hnsw-chunked-cache->status=ok pass=31 fail=0 total=31
This bundle covers the narrow stable GraphRAG surface directly:
- SQL regression coverage for unified syntax, schema registration, unified router, and stats
- upgrade + dump/restore lifecycle for registered fact graphs, the
segmented/routed GraphRAG control plane, unified router flow, shared/default
segment_labelspersistence - crash recovery for registered/indexed graph tables
- concurrent DML with online compact / online merge on registered fact graphs
sorted_hnswchunked cache integration including multi-index shared-cache overwrite regression
Extension-wide release-candidate checks
Fresh extension-wide release checks ran on 2026-04-07:
make test-release
Observed signals:
make test-release-> wrapper target verified end-to-end with the constituent pass signals belowmake pg-core-regression-smoke->status=ok|installcheck_target=present|tap_prove=present|isolation_regress=missingmake policy-safety-selftest-> all constituent selftests reportedstatus=okmake test-dump-restore->status=ok pass=13 fail=0 total=13make test-toast->status=ok pass=26 fail=0 total=26make test-alter-table->status=ok pass=36 fail=0 total=36make test-crash-recovery->status=ok pass=15 fail=0 total=15make test-concurrent->status=ok pass=8 fail=0 total=8make test-pg-upgrade->status=ok pass=13 fail=0 total=13
These checks exercise the already-stable core extension surface around:
- table AM crash recovery
- online compact / merge under concurrent DML
- TOAST integrity across rewrite paths
- ALTER TABLE compatibility
- dump / restore lifecycle
pg_upgradecompatibility from PostgreSQL 16 to 18 and from 17 to 18
Release positioning
The clean 0.13 split is:
- stable: sorted storage, planner-integrated vector search, the narrow
fact-shaped GraphRAG API, and the unified routed GraphRAG app flow
(
sorted_heap_graph_route+sorted_heap_graph_route_plan+ setup helpers) - beta: lower-level routed building blocks, expand/rerank helpers, scan wrappers, deep catalog/introspection functions, and the FlashHadamard experimental retrieval lane
- reference logic: code-corpus retrieval contracts from the benchmark harnesses
The stable routed flow is safe to release because:
- It dispatches to the existing beta building blocks without introducing new scoring or retrieval semantics
- It has explicit validation for ambiguous/conflicting parameters
- Zero-shard resolution returns empty results (no crash, no silent error)
- The canonical setup → inspect → query flow is lifecycle-covered through extension upgrade and dump/restore (60 lifecycle checks)
- The underlying shared-cache correctness bug is fixed and regression-guarded (31 chunked-cache checks including multi-index overwrite)