@@ -5,6 +5,54 @@ All notable changes to VectorPin will be documented in this file.
55The format is based on [ Keep a Changelog] ( https://keepachangelog.com/en/1.1.0/ ) ,
66and this project adheres to [ Semantic Versioning] ( https://semver.org/spec/v2.0.0.html ) .
77
8+ ## [ 0.2.0] — 2026-05-15
9+
10+ Promotes 0.2.0-rc.1 to a stable release with one additive change since
11+ the release candidate: a new pgvector adapter and ` audit-pgvector ` CLI
12+ command. No wire-format changes from rc.1; pins produced by rc.1
13+ verify on 0.2.0 and vice-versa.
14+
15+ ### Added
16+
17+ - ` PgVectorAdapter ` (` vectorpin.adapters.pgvector ` ) — reads and writes
18+ pins on a pgvector-equipped Postgres table. Same shape as
19+ ` QdrantAdapter ` / ` LanceDBAdapter ` : ` iter_records ` , ` get ` ,
20+ ` attach_pin ` , classmethod `connect(dsn, table, * , id_column='id',
21+ vector_column='embedding', pin_column='vectorpin')`.
22+ - ` audit-pgvector ` CLI subcommand mirroring `audit-{lancedb,chroma,
23+ qdrant}`.
24+ - ` vectorpin[pgvector] ` optional extra (` psycopg[binary]>=3.1 ` +
25+ ` pgvector>=0.3 ` ).
26+ - ` scripts/pinecone_live_e2e.py ` — self-contained manual verification
27+ script that creates a fresh Pinecone serverless index, runs the
28+ full sign-attach-verify round-trip via ` PineconeAdapter ` , exercises
29+ tamper rejection, and deletes the index on exit. Verified against
30+ live Pinecone (AWS us-east-1).
31+ - 22 new tests (` tests/test_adapter_pgvector.py ` ): 14 offline TLS-guard
32+ / identifier-validation tests + 8 live integration tests that
33+ auto-discover the compose service via
34+ ` VECTORPIN_TEST_PGVECTOR_URL ` / ` PGVECTOR_URL ` env vars and skip
35+ cleanly otherwise.
36+
37+ ### Hardening
38+
39+ - pgvector adapter applies the same security guards as the other
40+ remote-DB adapters: refuses plaintext postgres DSNs to non-loopback
41+ hosts without ` sslmode=require ` (or stronger), with the
42+ ` VECTORPIN_ALLOW_INSECURE_HTTP=1 ` env-scoped escape hatch.
43+ - SQL identifier validation (` ^[A-Za-z_][A-Za-z0-9_]*$ ` ) on every
44+ interpolated name (table, id column, vector column, pin column),
45+ matching the LanceDB adapter's contract. Postgres has no
46+ parameterized form for identifiers, so this is the only line of
47+ defense against shell-style injection in those parameters.
48+
49+ ### Notes
50+
51+ The pgvector adapter accepts both JSONB and TEXT pin columns — JSONB
52+ returns a decoded ` dict ` (parsed via ` Pin.from_dict ` ), TEXT returns a
53+ ` str ` (parsed via ` Pin.from_json ` ). Both routes go through the strict
54+ v2 schema validation.
55+
856## [ 0.2.0-rc.1] — 2026-05-14
957
1058Release candidate for 0.2.0. ** This is a wire-format break.** Pins
0 commit comments