diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9687caa3..ad77012b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,45 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
Release notes for GitHub Releases are extracted from the matching version section here.
+## [0.14.0] - 2026-09-22
+
+
+### Documentation
+
+- **ops:** Document the optional ke-extraction in-process surface
+
+- **ops:** Narrow the persistence claim and affirm ke-extraction prose
+
+- **ops:** State entry_types and the provisional gate affirmatively
+
+- **protocol:** Document the ke-* capability registry and ownership fields
+
+- **protocol:** State the 21-file baseline schema subset
+
+- **connect:** Bridge the ke-* gates and trim page-to-page restatement
+
+- **ops:** Spell out the FullAdapter composition and end the extract sequence at the gate
+
+- **knowledge:** Record the docs-site anchor and link discipline
+
+- **protocol:** Identify the ten data objects and baseline data subset
+
+- **home:** State ten data objects in the wire-dialect bullet
+
+- Cover ke-extraction and ke-ownership across the integrator site (#109)
+
+
+### Fixed
+
+- **connect:** **BREAKING:** Upgrade libp2p to 0.57 and refresh native carriers (#110)
+
+
+### Internal
+
+- Skip matrix for docs-only changes
+
+- **docs:** Cover all markdown changes
+
## [0.13.1] - 2026-09-18
diff --git a/Cargo.lock b/Cargo.lock
index b73e40f8..547e8e66 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3100,7 +3100,7 @@ dependencies = [
[[package]]
name = "spoke-connect"
-version = "0.13.1"
+version = "0.14.0"
dependencies = [
"async-trait",
"base64",
@@ -3126,7 +3126,7 @@ dependencies = [
[[package]]
name = "spoke-connect-capi"
-version = "0.13.1"
+version = "0.14.0"
dependencies = [
"serde_json",
"spoke-connect",
@@ -3134,7 +3134,7 @@ dependencies = [
[[package]]
name = "spoke-fixture-toy-world"
-version = "0.13.1"
+version = "0.14.0"
dependencies = [
"async-trait",
"futures",
@@ -3147,7 +3147,7 @@ dependencies = [
[[package]]
name = "spoke-operations"
-version = "0.13.1"
+version = "0.14.0"
dependencies = [
"async-trait",
"chrono",
@@ -3160,7 +3160,7 @@ dependencies = [
[[package]]
name = "spoke-schemas"
-version = "0.13.1"
+version = "0.14.0"
dependencies = [
"chrono",
"regress",
diff --git a/Cargo.toml b/Cargo.toml
index 16b37940..fdc8b5a0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -18,7 +18,7 @@ default-members = [
resolver = "2"
[workspace.package]
-version = "0.13.1"
+version = "0.14.0"
edition = "2021"
authors = ["42ch"]
license = "Apache-2.0"
diff --git a/crates/spoke-connect/Cargo.toml b/crates/spoke-connect/Cargo.toml
index 66f2dbbd..36a51d29 100644
--- a/crates/spoke-connect/Cargo.toml
+++ b/crates/spoke-connect/Cargo.toml
@@ -13,11 +13,11 @@ description = "SPOKE Connect reference spike — libp2p transport, noise-peerid
exclude = ["bindings/**", "examples/**"]
[dependencies]
-spoke-schemas = { version = "0.13.1", path = "../spoke-schemas" }
+spoke-schemas = { version = "0.14.0", path = "../spoke-schemas" }
# RemoteAdapter (the `remote-adapter` feature) implements the operations
# BaselinePorts + SpokeResult types; optional so default connect builds stay
# lean (TS equivalent: the `./remote` subpath export).
-spoke-operations = { version = "0.13.1", path = "../spoke-operations", optional = true }
+spoke-operations = { version = "0.14.0", path = "../spoke-operations", optional = true }
# Loopback smoke host (RemoteAdapter FFI binding smokes; `ffi-smoke-host` only).
libp2p.workspace = true
serde.workspace = true
diff --git a/crates/spoke-connect/bindings/csharp/42ch.Spoke.Connect.csproj b/crates/spoke-connect/bindings/csharp/42ch.Spoke.Connect.csproj
index e4c58e66..d778139a 100644
--- a/crates/spoke-connect/bindings/csharp/42ch.Spoke.Connect.csproj
+++ b/crates/spoke-connect/bindings/csharp/42ch.Spoke.Connect.csproj
@@ -18,7 +18,7 @@
42ch.Spoke.Connect
- 0.13.1
+ 0.14.0
42ch
42ch
SPOKE Connect session-core C# bindings (uniffi + native spoke_connect FFI). Transport stays product-owned.
diff --git a/crates/spoke-connect/bindings/kotlin/build.gradle.kts b/crates/spoke-connect/bindings/kotlin/build.gradle.kts
index 1e02b6cf..dec30e7f 100644
--- a/crates/spoke-connect/bindings/kotlin/build.gradle.kts
+++ b/crates/spoke-connect/bindings/kotlin/build.gradle.kts
@@ -5,7 +5,7 @@ plugins {
group = "dev.42ch"
// Lockstep SemVer — asserted/bumped with tooling/release lockstep surfaces.
-version = "0.13.1"
+version = "0.14.0"
repositories {
mavenCentral()
diff --git a/crates/spoke-connect/bindings/python/pyproject.toml b/crates/spoke-connect/bindings/python/pyproject.toml
index 77920a73..6f4709f0 100644
--- a/crates/spoke-connect/bindings/python/pyproject.toml
+++ b/crates/spoke-connect/bindings/python/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "spoke-connect"
-version = "0.13.1"
+version = "0.14.0"
description = "SPOKE Connect session-core Python bindings (uniffi + native spoke_connect FFI)"
readme = "README.md"
license = "Apache-2.0"
diff --git a/crates/spoke-operations/Cargo.toml b/crates/spoke-operations/Cargo.toml
index 0310dd9f..8ce99221 100644
--- a/crates/spoke-operations/Cargo.toml
+++ b/crates/spoke-operations/Cargo.toml
@@ -11,7 +11,7 @@ keywords = ["spoke", "knowledge-entry", "operations"]
categories = ["data-structures"]
[dependencies]
-spoke-schemas = { version = "0.13.1", path = "../spoke-schemas" }
+spoke-schemas = { version = "0.14.0", path = "../spoke-schemas" }
serde.workspace = true
serde_json.workspace = true
chrono.workspace = true
diff --git a/fixtures/toy-world/package.json b/fixtures/toy-world/package.json
index 3ef09f73..9541f321 100644
--- a/fixtures/toy-world/package.json
+++ b/fixtures/toy-world/package.json
@@ -1,6 +1,6 @@
{
"name": "@42ch/spoke-fixture-toy-world",
- "version": "0.13.1",
+ "version": "0.14.0",
"private": true,
"description": "SPOKE toy-world protocol fixtures and AJV/Vitest conformance harness",
"license": "Apache-2.0",
diff --git a/package.json b/package.json
index 8883352e..23a42ec7 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "spoke",
- "version": "0.13.1",
+ "version": "0.14.0",
"private": true,
"description": "SPOKE protocol monorepo — JSON Schema SSOT with generated TypeScript and Rust types",
"license": "Apache-2.0",
diff --git a/packages/spoke-connect-ts/package.json b/packages/spoke-connect-ts/package.json
index 661c0743..e926347a 100644
--- a/packages/spoke-connect-ts/package.json
+++ b/packages/spoke-connect-ts/package.json
@@ -1,6 +1,6 @@
{
"name": "@42ch/spoke-connect",
- "version": "0.13.1",
+ "version": "0.14.0",
"description": "SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization",
"license": "Apache-2.0",
"repository": {
diff --git a/packages/spoke-operations/package.json b/packages/spoke-operations/package.json
index bfc185d3..42733ac3 100644
--- a/packages/spoke-operations/package.json
+++ b/packages/spoke-operations/package.json
@@ -1,6 +1,6 @@
{
"name": "@42ch/spoke-operations",
- "version": "0.13.1",
+ "version": "0.14.0",
"description": "SPOKE lifecycle operations — pure helpers over wire types",
"license": "Apache-2.0",
"repository": {
diff --git a/packages/spoke-schemas/package.json b/packages/spoke-schemas/package.json
index 42bddbdf..cfcc1b5c 100644
--- a/packages/spoke-schemas/package.json
+++ b/packages/spoke-schemas/package.json
@@ -1,6 +1,6 @@
{
"name": "@42ch/spoke-schemas",
- "version": "0.13.1",
+ "version": "0.14.0",
"description": "SPOKE wire types — TypeScript generated from JSON Schema",
"license": "Apache-2.0",
"repository": {
diff --git a/tooling/codegen/package.json b/tooling/codegen/package.json
index 985e4178..1987f14a 100644
--- a/tooling/codegen/package.json
+++ b/tooling/codegen/package.json
@@ -1,6 +1,6 @@
{
"name": "@42ch/spoke-codegen",
- "version": "0.13.1",
+ "version": "0.14.0",
"private": true,
"license": "Apache-2.0",
"description": "SPOKE schema-to-code generation pipeline (TypeScript + Rust)",