From 561563e6a4dce32f567956c1e58472459edaf986 Mon Sep 17 00:00:00 2001 From: Jurij Skornik Date: Tue, 28 Jul 2026 12:25:18 +0200 Subject: [PATCH 1/4] chore(release): bump version set to 10.0.10 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the root package and all 20 packages/* workspaces to 10.0.10 in lockstep, per the single-version release set rule in RELEASE_PROCESS.md §3, and add the 10.0.10 CHANGELOG entry. Version-only bump: pnpm-lock.yaml records third-party versions only and is untouched, so `pnpm install --frozen-lockfile` stays valid. `pnpm release:verify-versions --version 10.0.10` passes (21/21). CHANGELOG: the [Unreleased] SWM 4 MiB bullet moves into the 10.0.10 section verbatim. The section carries an `### Upgrading from 10.0.9` matrix covering the four builder-visible changes (SWM ceiling, the dkg-agent exports map, RFC-64 default-on state, dashboard 30 -> 31). RELEASE_PROCESS.md §10: upgrade guidance now scales to the migration. Small migrations live in the CHANGELOG section that §6c already copies verbatim into the GitHub Release, so the guidance ships where builders read it; standalone docs/UPGRADE_*.md is reserved for mass renames and contract changes. Also repoints the dangling docs/RELEASE.md link at docs/archive/internal/RELEASE.md, where it has lived since #1123, and records that docs/archive/internal/ is deliberately outside the GitBook navigation in docs/SUMMARY.md. No Solidity source, ABI, or deployment-registry changes since v10.0.9, so this release requires no contract deployment. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 47 +++++++++++++++++++++++++- RELEASE_PROCESS.md | 8 +++-- package.json | 2 +- packages/adapter-elizaos/package.json | 2 +- packages/adapter-hermes/package.json | 2 +- packages/adapter-openclaw/package.json | 2 +- packages/agent/package.json | 2 +- packages/chain/package.json | 2 +- packages/cli/package.json | 2 +- packages/core/package.json | 2 +- packages/epcis/package.json | 2 +- packages/evm-module/package.json | 2 +- packages/graph-viz/package.json | 2 +- packages/kafka-plugin/package.json | 2 +- packages/mcp-dkg/package.json | 2 +- packages/network-sim/package.json | 2 +- packages/node-ui/package.json | 2 +- packages/okf/package.json | 2 +- packages/publisher/package.json | 2 +- packages/query/package.json | 2 +- packages/random-sampling/package.json | 2 +- packages/rdf-utils/package.json | 2 +- packages/storage/package.json | 2 +- 23 files changed, 72 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70a12cf772..3a16dd50dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,54 @@ All notable changes to the DKG V10 node are documented here. The format is based ## [Unreleased] +## [10.0.10] - 2026-07-28 + +This release lands OT-RFC-64, the public author catalog: a node-local subsystem that announces, discovers, fetches, and verifies another author's finalized Knowledge Assets over five new `/dkg/catalog/1/*` libp2p protocols. It is active by default on every node with a data directory, while authoring, auto-publish, and bootstrap targets stay opt-in. Because its persistence opens before networking, such a node now requires a Node runtime exposing `node:sqlite` (Node 22.5 or newer). The rest is durability hardening on paths that could strand, mis-report, or lose verified work. Two changes are operator-visible: one encoded SWM share or promotion is capped at 4 MiB instead of 10 MB, and the dashboard database migrates 30 → 31. **No smart-contract changes — no deployment required** (no Solidity source, ABI, or deployment-registry changes since 10.0.9). + +### Upgrading from 10.0.9 + +| Change | Impact | Action | +| --- | --- | --- | +| RFC-64 persistence requires `node:sqlite` | on a node with a data directory the RFC-64 inventory and the finalization inbox open before networking, so a runtime without `node:sqlite` fails the start with `requires Node runtime support for node:sqlite` | run Node 22.5 or newer; the repo's `.nvmrc` baseline of 22 satisfies this, and `node:sqlite` resolves unflagged on current 22.x. Node releases before 22.5.0 do not ship the module at all. | +| SWM payload ceiling 10 MB → 4 MiB | one encoded SWM share or promotion above 4 MiB is rejected, and a 10.0.9 peer emitting more is dropped inbound | reduce importer batch size (`dkg-importer` guidance moves 1000 → 400 records) | +| `@origintrail-official/dkg-agent` declares `"exports"` | deep imports of internal paths fail with `ERR_PACKAGE_PATH_NOT_EXPORTED` | import from the package root | +| RFC-64 catalog is active by default | first boot creates `DKG_HOME/rfc64-sync/` and serves five new inbound catalog protocols (three without chain configuration) | no action; authoring/auto-publish stays opt-in | +| Dashboard database migrates 30 → 31 | one additive index table; rolling back to 10.0.9 is safe | no action | + +### Added + +- **Public author catalog (OT-RFC-64) runs on every node with a data directory** (#1930, #1882, #1929): first boot opens `DKG_HOME/rfc64-sync/` and registers the five catalog protocols, but a graph is answered for only after an operator accepts its current policy snapshot. +- **Catalog access follows the Context Graph policy cell** (#1835, #1881, #1905): every catalog operation is authorized in both directions against an accepted current `ContextGraphPolicyV1`, and an invite-only graph requires both ends in a roster bound to that policy digest. +- **Catalog chain state is read at one pinned finalized block** (#1821, #1909, #1911, #1913, #1914, #1915): policy, name binding, and finalized inventory resolve inside one EIP-1898 session, and rows are materialized before the applied-head pointer moves, so no node advertises a head it has not stored. +- **Opt-in catalog automation: cold start, bootstrap, and auto-advance** (#1819, #1926, #1928, #1927): a node can cold-start a public scope from a named provider, `rfc64PublicCatalogBootstrap` retries pinned provider targets across restarts, and `rfc64PublicCatalogAutoPublish` bridges a confirmed fully-public VM publish into it. +- **Clear a single terminal publish or share job by exact job ID** (#1883, #1910, #1899): new idempotent `clear-job` routes on the publisher and SWM share APIs remove one terminal record atomically; previously only a status-scoped bulk clear existed. + +### Fixed + +- **A transient store timeout no longer strands a verified Knowledge Asset outside Verifiable Memory** (#1939): finalization envelopes are now recorded in a durable SQLite inbox before any store work, so a crash or store failure between verification and materialization leaves the graph untouched and the evidence replayable instead of returning `verified-vm-metadata-pending` forever. Recovery surfaces as `finalizationRecovery` on `GET /api/status`. +- **Durable recovery drains its backlog and reports a truthful verdict** (#1967, #1898, #1908, #1895, #1937, #1906): exact VM repair now spends one peer attempt per asset under a far larger transfer ceiling and rotates the peer order, so large assets no longer time out together. A catch-up leg carries an explicit state, so a run that reached no eligible peer fails instead of reporting success, foreground catch-up retries backpressure, and a named `peerId` is probed. +- **The store no longer answers routine work with full scans** (#1877, #1959, #1873, #1917): a write racing an in-flight index probe demoted a scoped update to an `O(store)` rebuild that stalled publishes and starved sync; public exact-asset reads are now byte-bounded, and snapshot paging seeks to a persisted checkpoint. +- **Durable metadata pages no longer split an author seal** (#1916, #1936): pages end on a `(graph, subject)` boundary, so a seal straddling a boundary arrives whole instead of an unverifiable prefix that left curated Context Graphs unable to VM-publish, and a peer can no longer inject a non-IRI `_meta` subject. +- **Curator no longer silently publishes its own same-named Knowledge Asset** (#1969): author resolution returned the caller's own assertion before the ambiguity check, spending real TRAC and gas on the wrong asset; both VM publish routes now accept `selectedAuthorAgentAddress`, so a caller answered `409 AMBIGUOUS_ASSERTION_AUTHOR` can name one. +- **Publisher job records survive a crash mid-transition** (#1919, #1935, #1945, #1902): every async publish and share transition is now a single-subject atomic replace instead of a delete-then-insert that could strand it empty and lose the queue row; publisher admin routes also answer a malformed body without a 500. +- **Transport failures are classified by what they actually mean** (#1942, #1918, #1904): an aborted fetch now fails over instead of failing a publish whose mint is already on chain, an unambiguous pre-mempool reject terminates at once rather than entering recovery, and a failed chain read is no longer a negative authentication verdict. + ### Changed -- **SWM gossip payload ceiling aligned with StorageACK:** one encoded SWM share or promotion is now capped at 4 MiB, matching the untrusted inline StorageACK staging ceiling. GossipSub retains 256 KiB of framing headroom, while the general direct-protocol frame/read limit remains 10 MiB. +- **SWM gossip payload ceiling aligned with StorageACK** (#1932): one encoded SWM share or promotion is now capped at 4 MiB, matching the untrusted inline StorageACK staging ceiling. GossipSub retains 256 KiB of framing headroom, while the general direct-protocol frame/read limit remains 10 MiB. +- **`@origintrail-official/dkg-agent` declares an explicit `"exports"` map** (#1835, #1930): it previously had none, so any subpath resolved; it now exposes only the root, `./package.json`, an allowlist of catalog subpaths, and `./dist/*`. +- **Dashboard SQLite schema 30 → 31** (#1873): adds a `snapshot_page_indexes` table for public-snapshot page offsets; additive, so rolling back to 10.0.9 is safe. +- **Node UI metric snapshots are collected once a day** (#1981): the collector's interval moves from 30 seconds to 24 hours, cutting dashboard database growth and periodic store-scan counters by roughly three orders of magnitude. +- **Knowledge Asset metadata states how a confirmation was obtained** (#1920): `_meta` now carries `dkg:confirmationKind`, distinguishing an asset confirmed by its own publish transaction from one rebuilt by a finalized on-chain scan. +- **Release version set:** all workspace packages move together to 10.0.10. + +### Deployment + +- **No contract changes in this release.** No Solidity source, ABI, or mainnet/testnet deployment-registry files changed since 10.0.9; nodes can upgrade through the normal npm release path. + +### Known issues + +- A node pinned to a Node release older than 22.5 will not start if it has a data directory: `node:sqlite` does not exist before 22.5.0, and neither the RFC-64 inventory nor the finalization inbox degrades gracefully. The project's Node 22 baseline satisfies this — `node:sqlite` resolves unflagged on current 22.x — but no `engines` field pins the minimum. ## [10.0.9] - 2026-07-21 diff --git a/RELEASE_PROCESS.md b/RELEASE_PROCESS.md index 55b1846ceb..68047a1792 100644 --- a/RELEASE_PROCESS.md +++ b/RELEASE_PROCESS.md @@ -223,9 +223,11 @@ dkg start ## 10) Builder upgrade guides (per release) -Every breaking or builder-impacting release ships a focused upgrade guide alongside the CHANGELOG entry. The guide lives at `docs/UPGRADE__TO_.md` (e.g. `docs/UPGRADE_RC11_TO_RC12.md`). +Every breaking or builder-impacting release ships upgrade guidance alongside the CHANGELOG entry. Scale the artifact to the migration: -A good upgrade guide: +**Small migrations (a handful of discrete changes) — default.** Put an `### Upgrading from ` section directly in the release's `CHANGELOG.md` entry, immediately after the theme paragraph, as a `Change | Impact | Action` matrix. This is what builders actually read: §6c copies the CHANGELOG section verbatim into the GitHub Release, so the guidance ships where it is seen without a separate file to discover. No standalone document is required. + +**Large migrations (mass renames, contract/ABI changes, economic changes).** Write a standalone guide at `docs/UPGRADE__TO_.md` and link it from the `### Upgrading from ` section. `docs/` is synced to GitBook, so a standalone guide is published to builders — this is the correct home for builder-facing migration content. A good standalone guide: - Opens with an agent-prompt template builders can paste into Cursor / Claude Code / Codex CLI / any AGENTS.md-honouring tool to drive the migration end-to-end. - Includes a breaking-change matrix at the top so a reader can grep for what affects them in 30 seconds. @@ -233,7 +235,7 @@ A good upgrade guide: - Documents every economic / contract / wire-format change a downstream caller could trip on, with concrete `tokenAmount`, ABI, and Hub-registration steps. - Cross-links the relevant `CHANGELOG.md` section for per-PR detail. -Cross-link the new guide from [`docs/RELEASE.md`](docs/RELEASE.md) § "Upgrading from a prior release" before tagging. +Historical guides from the rc line are archived at [`docs/archive/internal/`](docs/archive/internal/) (e.g. `UPGRADE_RC11_TO_RC12.md`); the release runbook they referenced now lives at [`docs/archive/internal/RELEASE.md`](docs/archive/internal/RELEASE.md). `docs/archive/internal/` is deliberately outside the GitBook navigation in `docs/SUMMARY.md`, so it holds internal process docs only — never builder-facing migration content. ## 11) Promotion policy diff --git a/package.json b/package.json index ee2c8e7a77..e2143e8ef5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dkg-v10", - "version": "10.0.9", + "version": "10.0.10", "private": true, "packageManager": "pnpm@10.28.1", "dkgBuild": { diff --git a/packages/adapter-elizaos/package.json b/packages/adapter-elizaos/package.json index 0002ce39b3..7147f5696a 100644 --- a/packages/adapter-elizaos/package.json +++ b/packages/adapter-elizaos/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-adapter-elizaos", - "version": "10.0.9", + "version": "10.0.10", "description": "ElizaOS plugin adapter — turns any ElizaOS agent into a DKG V10 node", "type": "module", "main": "dist/index.js", diff --git a/packages/adapter-hermes/package.json b/packages/adapter-hermes/package.json index 4e83ab522e..f4ae412d42 100644 --- a/packages/adapter-hermes/package.json +++ b/packages/adapter-hermes/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-adapter-hermes", - "version": "10.0.9", + "version": "10.0.10", "description": "Hermes Agent adapter — connects Hermes AI agents to a DKG V10 node for verifiable shared memory", "type": "module", "main": "dist/index.js", diff --git a/packages/adapter-openclaw/package.json b/packages/adapter-openclaw/package.json index 15cfb4e510..bbae8c9614 100644 --- a/packages/adapter-openclaw/package.json +++ b/packages/adapter-openclaw/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-adapter-openclaw", - "version": "10.0.9", + "version": "10.0.10", "description": "OpenClaw plugin adapter for connecting a DKG V10 node and chat bridge to an OpenClaw agent", "type": "module", "main": "dist/index.js", diff --git a/packages/agent/package.json b/packages/agent/package.json index aeca5e75e9..d0fa7721b3 100644 --- a/packages/agent/package.json +++ b/packages/agent/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-agent", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/chain/package.json b/packages/chain/package.json index d1d2659af0..4cd6a9767d 100644 --- a/packages/chain/package.json +++ b/packages/chain/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-chain", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/cli/package.json b/packages/cli/package.json index 331b3b0ca2..5858a00ce1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/cli.js", "bin": { diff --git a/packages/core/package.json b/packages/core/package.json index b47004f471..23236feebe 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-core", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/epcis/package.json b/packages/epcis/package.json index eb84036e73..342cf12b14 100644 --- a/packages/epcis/package.json +++ b/packages/epcis/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-epcis", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/evm-module/package.json b/packages/evm-module/package.json index 6b66192047..5beb94fc19 100644 --- a/packages/evm-module/package.json +++ b/packages/evm-module/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-evm-module", - "version": "10.0.9", + "version": "10.0.10", "description": "DKG V10 smart contracts (forked from V8 dkg-evm-module)", "license": "Apache-2.0", "private": true, diff --git a/packages/graph-viz/package.json b/packages/graph-viz/package.json index 25e8024c7b..dfdaa27571 100644 --- a/packages/graph-viz/package.json +++ b/packages/graph-viz/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-graph-viz", - "version": "10.0.9", + "version": "10.0.10", "description": "RDF Knowledge Graph Visualizer — force-directed graph rendering with hexagonal nodes, declarative view configs, RDF-native data loading, and SPARQL-driven views", "type": "module", "main": "./dist/index.cjs", diff --git a/packages/kafka-plugin/package.json b/packages/kafka-plugin/package.json index 5620ec50bb..116dc074a5 100644 --- a/packages/kafka-plugin/package.json +++ b/packages/kafka-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/kafka-plugin", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/mcp-dkg/package.json b/packages/mcp-dkg/package.json index deddc51f7b..9faed3f836 100644 --- a/packages/mcp-dkg/package.json +++ b/packages/mcp-dkg/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-mcp", - "version": "10.0.9", + "version": "10.0.10", "description": "MCP server that exposes the local DKG daemon (projects, sub-graphs, activity, chat) to Cursor, Claude Code, and any other MCP-aware coding assistant.", "type": "module", "main": "dist/index.js", diff --git a/packages/network-sim/package.json b/packages/network-sim/package.json index c2f9979086..47daef2d50 100644 --- a/packages/network-sim/package.json +++ b/packages/network-sim/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-network-sim", - "version": "10.0.9", + "version": "10.0.10", "private": true, "type": "module", "scripts": { diff --git a/packages/node-ui/package.json b/packages/node-ui/package.json index f8912ebcc4..3cd31b63fa 100644 --- a/packages/node-ui/package.json +++ b/packages/node-ui/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-node-ui", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/okf/package.json b/packages/okf/package.json index d28ff71da1..2d64c6da7c 100644 --- a/packages/okf/package.json +++ b/packages/okf/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-okf", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/publisher/package.json b/packages/publisher/package.json index b9d9b7a092..a23b92f16d 100644 --- a/packages/publisher/package.json +++ b/packages/publisher/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-publisher", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/query/package.json b/packages/query/package.json index aaaf698504..c45494e4aa 100644 --- a/packages/query/package.json +++ b/packages/query/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-query", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/random-sampling/package.json b/packages/random-sampling/package.json index 505362dd45..9600c00055 100644 --- a/packages/random-sampling/package.json +++ b/packages/random-sampling/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-random-sampling", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/rdf-utils/package.json b/packages/rdf-utils/package.json index 61d2417ea6..93bc89dc43 100644 --- a/packages/rdf-utils/package.json +++ b/packages/rdf-utils/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-rdf-utils", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/storage/package.json b/packages/storage/package.json index cb50cb23e8..f84a4fb211 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -1,6 +1,6 @@ { "name": "@origintrail-official/dkg-storage", - "version": "10.0.9", + "version": "10.0.10", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", From 6bde742d701d399f151405f731ddfea779546b00 Mon Sep 17 00:00:00 2001 From: Jurij Skornik Date: Tue, 28 Jul 2026 12:28:45 +0200 Subject: [PATCH 2/4] docs(release): point long-form notes at docs/release-notes/, drop V9 runbook link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §10 previously sent large-migration guides to docs/UPGRADE__TO_.md and cited docs/archive/internal/RELEASE.md. Two problems: that archived file is the superseded DKG **V9** runbook (101 lines, replaced by this document), so citing it lends authority to obsolete instructions; and "put it in docs/" is not by itself enough to reach — or avoid — GitBook. Long-form notes now live at docs/release-notes/.md, one file per release. Shipped notes are immutable, per-release files stay linkable from the CHANGELOG and the GitHub Release, and they do not conflict on every release. Records the actual publishing rule: GitBook builds navigation from docs/SUMMARY.md, so a docs/ file absent from SUMMARY.md is not published. docs/release-notes/ stays unlisted, matching docs/reports/, docs/rfcs/ and docs/adr/, which already sit in docs/ outside the navigation. Co-Authored-By: Claude Opus 5 (1M context) --- RELEASE_PROCESS.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/RELEASE_PROCESS.md b/RELEASE_PROCESS.md index 68047a1792..064d9c09fe 100644 --- a/RELEASE_PROCESS.md +++ b/RELEASE_PROCESS.md @@ -227,7 +227,7 @@ Every breaking or builder-impacting release ships upgrade guidance alongside the **Small migrations (a handful of discrete changes) — default.** Put an `### Upgrading from ` section directly in the release's `CHANGELOG.md` entry, immediately after the theme paragraph, as a `Change | Impact | Action` matrix. This is what builders actually read: §6c copies the CHANGELOG section verbatim into the GitHub Release, so the guidance ships where it is seen without a separate file to discover. No standalone document is required. -**Large migrations (mass renames, contract/ABI changes, economic changes).** Write a standalone guide at `docs/UPGRADE__TO_.md` and link it from the `### Upgrading from ` section. `docs/` is synced to GitBook, so a standalone guide is published to builders — this is the correct home for builder-facing migration content. A good standalone guide: +**Large migrations (mass renames, contract/ABI changes, economic changes).** Write a standalone guide at `docs/release-notes/.md` (e.g. `docs/release-notes/v10-1-0.md`) and link it from the `### Upgrading from ` section. One file per release, never a growing shared file: shipped notes are immutable, per-release files stay directly linkable from the CHANGELOG and the GitHub Release, and they do not conflict on every release. A good standalone guide: - Opens with an agent-prompt template builders can paste into Cursor / Claude Code / Codex CLI / any AGENTS.md-honouring tool to drive the migration end-to-end. - Includes a breaking-change matrix at the top so a reader can grep for what affects them in 30 seconds. @@ -235,7 +235,9 @@ Every breaking or builder-impacting release ships upgrade guidance alongside the - Documents every economic / contract / wire-format change a downstream caller could trip on, with concrete `tokenAmount`, ABI, and Hub-registration steps. - Cross-links the relevant `CHANGELOG.md` section for per-PR detail. -Historical guides from the rc line are archived at [`docs/archive/internal/`](docs/archive/internal/) (e.g. `UPGRADE_RC11_TO_RC12.md`); the release runbook they referenced now lives at [`docs/archive/internal/RELEASE.md`](docs/archive/internal/RELEASE.md). `docs/archive/internal/` is deliberately outside the GitBook navigation in `docs/SUMMARY.md`, so it holds internal process docs only — never builder-facing migration content. +**Keep release notes out of GitBook.** GitBook syncs the `docs/` tree and builds its navigation from `docs/SUMMARY.md`, so a file under `docs/` that is **not** listed in `SUMMARY.md` is not published. `docs/release-notes/` must stay unlisted, matching `docs/reports/`, `docs/rfcs/`, and `docs/adr/`, which already live in `docs/` outside the navigation. Do not add a `SUMMARY.md` entry when adding a release-notes file. + +This document is the authoritative release runbook. Superseded V9-era material — the old `RELEASE.md` runbook and the rc-line `UPGRADE_RC11_TO_*.md` guides — is retained under `docs/archive/internal/` for history only and should not be followed or extended. ## 11) Promotion policy From 69ad5e147d3e1269b63cd7d04ab02d3803bf7fce Mon Sep 17 00:00:00 2001 From: Jurij Skornik Date: Tue, 28 Jul 2026 12:54:38 +0200 Subject: [PATCH 3/4] =?UTF-8?q?fix(release):=20correct=20Node=20floor=20to?= =?UTF-8?q?=2022.13,=20declare=20engines,=20unify=20=C2=A76c/=C2=A710?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review round 1 on #1984. 🔴 + 🟡 (Node floor) — resolved together, because the 🔴's suggested `engines.node >=22.5.0` carries the same error the 🟡 identifies. `node:sqlite` ships from Node 22.5.0 but stays behind `--experimental-sqlite` until 22.13.0 (and 23.4.0 on the 23.x line), per Node's own version-history table. The daemon builds its command from process.execArgv and never adds that flag, so 22.5–22.12 and 23.0–23.3 install cleanly and then fail at boot. Corrects all three CHANGELOG claims and declares the range on packages/cli — the only manifest an operator installs (`bin: {dkg}`; every other published package has none). Range is `>=22.13.0 <23.0.0 || >=23.4.0`; a bare `>=22.13.0` would wrongly admit 23.0–23.3, where the module is still flagged. `engines` is declarative only, and the Known-issues entry now says so rather than claiming a guard that does not exist: pnpm 10.28.1 and npm both default engine-strict=false and emit EBADENGINE as a warning over a successful install (verified empirically both ways). Blue-green auto-update gates activation on existsSync of build output only, never proving the slot boots, so an unsupported runtime can activate and then restart-loop. A runtime preflight closing that gap is proposed separately. 🟡 (§6c/§10) — my inconsistency from the previous commit. §6c now owns GitHub Release note generation and states the CHANGELOG section is copied verbatim with only fixed metadata added; §10 now only defines when guidance is required and where it is written, and defers to §6c. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 6 +++--- RELEASE_PROCESS.md | 13 +++++++++++-- packages/cli/package.json | 3 +++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a16dd50dc..fd981cbd97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,13 +6,13 @@ All notable changes to the DKG V10 node are documented here. The format is based ## [10.0.10] - 2026-07-28 -This release lands OT-RFC-64, the public author catalog: a node-local subsystem that announces, discovers, fetches, and verifies another author's finalized Knowledge Assets over five new `/dkg/catalog/1/*` libp2p protocols. It is active by default on every node with a data directory, while authoring, auto-publish, and bootstrap targets stay opt-in. Because its persistence opens before networking, such a node now requires a Node runtime exposing `node:sqlite` (Node 22.5 or newer). The rest is durability hardening on paths that could strand, mis-report, or lose verified work. Two changes are operator-visible: one encoded SWM share or promotion is capped at 4 MiB instead of 10 MB, and the dashboard database migrates 30 → 31. **No smart-contract changes — no deployment required** (no Solidity source, ABI, or deployment-registry changes since 10.0.9). +This release lands OT-RFC-64, the public author catalog: a node-local subsystem that announces, discovers, fetches, and verifies another author's finalized Knowledge Assets over five new `/dkg/catalog/1/*` libp2p protocols. It is active by default on every node with a data directory, while authoring, auto-publish, and bootstrap targets stay opt-in. Because its persistence opens before networking, such a node now requires a Node runtime where `node:sqlite` is available unflagged — Node 22.13 or newer, or 23.4 or newer on the 23.x line. The rest is durability hardening on paths that could strand, mis-report, or lose verified work. Two changes are operator-visible: one encoded SWM share or promotion is capped at 4 MiB instead of 10 MB, and the dashboard database migrates 30 → 31. **No smart-contract changes — no deployment required** (no Solidity source, ABI, or deployment-registry changes since 10.0.9). ### Upgrading from 10.0.9 | Change | Impact | Action | | --- | --- | --- | -| RFC-64 persistence requires `node:sqlite` | on a node with a data directory the RFC-64 inventory and the finalization inbox open before networking, so a runtime without `node:sqlite` fails the start with `requires Node runtime support for node:sqlite` | run Node 22.5 or newer; the repo's `.nvmrc` baseline of 22 satisfies this, and `node:sqlite` resolves unflagged on current 22.x. Node releases before 22.5.0 do not ship the module at all. | +| RFC-64 persistence requires unflagged `node:sqlite` | on a node with a data directory the RFC-64 inventory and the finalization inbox open before networking, so a runtime without `node:sqlite` fails the start with `requires Node runtime support for node:sqlite` | run **Node >= 22.13.0**, or **>= 23.4.0** on the 23.x line, or Node 24+. `node:sqlite` exists from 22.5.0 but stays behind `--experimental-sqlite` until 22.13.0/23.4.0, and the daemon never passes that flag — so 22.5–22.12 and 23.0–23.3 install cleanly and then fail to boot. `packages/cli` now declares this range in `engines.node`. | | SWM payload ceiling 10 MB → 4 MiB | one encoded SWM share or promotion above 4 MiB is rejected, and a 10.0.9 peer emitting more is dropped inbound | reduce importer batch size (`dkg-importer` guidance moves 1000 → 400 records) | | `@origintrail-official/dkg-agent` declares `"exports"` | deep imports of internal paths fail with `ERR_PACKAGE_PATH_NOT_EXPORTED` | import from the package root | | RFC-64 catalog is active by default | first boot creates `DKG_HOME/rfc64-sync/` and serves five new inbound catalog protocols (three without chain configuration) | no action; authoring/auto-publish stays opt-in | @@ -51,7 +51,7 @@ This release lands OT-RFC-64, the public author catalog: a node-local subsystem ### Known issues -- A node pinned to a Node release older than 22.5 will not start if it has a data directory: `node:sqlite` does not exist before 22.5.0, and neither the RFC-64 inventory nor the finalization inbox degrades gracefully. The project's Node 22 baseline satisfies this — `node:sqlite` resolves unflagged on current 22.x — but no `engines` field pins the minimum. +- `engines.node` on `@origintrail-official/dkg` declares the supported runtime range, but npm and pnpm both treat `engines` as advisory unless `engine-strict` is set, so an unsupported runtime still installs with only an `EBADENGINE` warning. Neither the RFC-64 inventory nor the finalization inbox degrades gracefully, so such a node then fails at daemon start. Blue-green auto-update verifies build output exists before activating a slot but does not prove the new slot boots, so a node auto-updating on an unsupported runtime can activate and then restart-loop. Check `node --version` before upgrading. ## [10.0.9] - 2026-07-21 diff --git a/RELEASE_PROCESS.md b/RELEASE_PROCESS.md index 064d9c09fe..d0032c1cbd 100644 --- a/RELEASE_PROCESS.md +++ b/RELEASE_PROCESS.md @@ -141,7 +141,14 @@ One OTP covers the batch; a TOTP code can expire mid-loop, so if some fail, re-r ### 6c) Create the GitHub Release (manual) -Because there is no tag-triggered release workflow, make the Release by hand from the signed tag, with notes taken from the matching `CHANGELOG.md` section (theme header, npm + channel line, PR-tagged bullets, a `compare/vPREV...vNEW` link): +Because there is no tag-triggered release workflow, make the Release by hand from the signed tag. **This section owns GitHub Release note generation.** The notes are the matching `CHANGELOG.md` section copied *verbatim* — including its `### Upgrading from ` matrix, if §10 put one there — with only fixed metadata added around it. Do not reword, reorder, or drop bullets while assembling; if the notes need to say something the CHANGELOG does not, fix the CHANGELOG first so the two cannot drift. + +Assemble `notes.md` as: + +1. A `# DKG vX.Y.Z` title line. +2. The CHANGELOG section body verbatim, minus its own `## [X.Y.Z] - DATE` heading. +3. An npm + channel line directly under the theme paragraph: ``**npm:** `@origintrail-official/dkg@X.Y.Z` — dist-tags `latest`, `testnet`, `mainnet``, naming only the tags this release actually moved. +4. A closing `**Full changelog:** https://github.com/OriginTrail/dkg/compare/vPREV...vX.Y.Z` link. ```bash gh release create vX.Y.Z --repo OriginTrail/dkg --verify-tag \ @@ -225,7 +232,9 @@ dkg start Every breaking or builder-impacting release ships upgrade guidance alongside the CHANGELOG entry. Scale the artifact to the migration: -**Small migrations (a handful of discrete changes) — default.** Put an `### Upgrading from ` section directly in the release's `CHANGELOG.md` entry, immediately after the theme paragraph, as a `Change | Impact | Action` matrix. This is what builders actually read: §6c copies the CHANGELOG section verbatim into the GitHub Release, so the guidance ships where it is seen without a separate file to discover. No standalone document is required. +This section defines **when** upgrade guidance is required and **where it is written**. §6c owns how it reaches the GitHub Release: it copies the matching CHANGELOG section verbatim, so anything placed in that section ships to builders automatically and the two cannot drift. + +**Small migrations (a handful of discrete changes) — default.** Put an `### Upgrading from ` section directly in the release's `CHANGELOG.md` entry, immediately after the theme paragraph, as a `Change | Impact | Action` matrix. No standalone document is required. **Large migrations (mass renames, contract/ABI changes, economic changes).** Write a standalone guide at `docs/release-notes/.md` (e.g. `docs/release-notes/v10-1-0.md`) and link it from the `### Upgrading from ` section. One file per release, never a growing shared file: shipped notes are immutable, per-release files stay directly linkable from the CHANGELOG and the GitHub Release, and they do not conflict on every release. A good standalone guide: diff --git a/packages/cli/package.json b/packages/cli/package.json index 5858a00ce1..c92f80edaf 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -2,6 +2,9 @@ "name": "@origintrail-official/dkg", "version": "10.0.10", "type": "module", + "engines": { + "node": ">=22.13.0 <23.0.0 || >=23.4.0" + }, "main": "dist/cli.js", "bin": { "dkg": "./dist/cli.js" From 92f6f612cc86564f381a16c03b80a4663fa390ef Mon Sep 17 00:00:00 2001 From: Jurij Skornik Date: Tue, 28 Jul 2026 13:01:06 +0200 Subject: [PATCH 4/4] fix(release): declare the Node runtime contract on dkg-agent too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review round 2 🔴 on #1984: @origintrail-official/dkg-agent is a public package and is the one that actually owns the node:sqlite code, so a builder installing it directly on 22.12 got no EBADENGINE warning and discovered the floor only when start() reached prepareRfc64PersistenceV1(). Round 1 declared the range on packages/cli alone, reasoning that it is the only manifest a node OPERATOR installs — true for operators, wrong for builders embedding the agent, and its new allowlisted RFC-64 subpath exports signal direct consumption is intended. Swept the class rather than the named instance: packages/agent is the only package referencing node:sqlite in src (node-ui uses the native better-sqlite3 dep and is unaffected), so cli + agent is the complete set. Same range on both. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 2 +- packages/agent/package.json | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd981cbd97..5984d2171a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ This release lands OT-RFC-64, the public author catalog: a node-local subsystem | Change | Impact | Action | | --- | --- | --- | -| RFC-64 persistence requires unflagged `node:sqlite` | on a node with a data directory the RFC-64 inventory and the finalization inbox open before networking, so a runtime without `node:sqlite` fails the start with `requires Node runtime support for node:sqlite` | run **Node >= 22.13.0**, or **>= 23.4.0** on the 23.x line, or Node 24+. `node:sqlite` exists from 22.5.0 but stays behind `--experimental-sqlite` until 22.13.0/23.4.0, and the daemon never passes that flag — so 22.5–22.12 and 23.0–23.3 install cleanly and then fail to boot. `packages/cli` now declares this range in `engines.node`. | +| RFC-64 persistence requires unflagged `node:sqlite` | on a node with a data directory the RFC-64 inventory and the finalization inbox open before networking, so a runtime without `node:sqlite` fails the start with `requires Node runtime support for node:sqlite` | run **Node >= 22.13.0**, or **>= 23.4.0** on the 23.x line, or Node 24+. `node:sqlite` exists from 22.5.0 but stays behind `--experimental-sqlite` until 22.13.0/23.4.0, and the daemon never passes that flag — so 22.5–22.12 and 23.0–23.3 install cleanly and then fail to boot. `@origintrail-official/dkg` and `@origintrail-official/dkg-agent` both declare this range in `engines.node` — the agent package owns the `node:sqlite` code, so a builder embedding it directly gets the same contract. | | SWM payload ceiling 10 MB → 4 MiB | one encoded SWM share or promotion above 4 MiB is rejected, and a 10.0.9 peer emitting more is dropped inbound | reduce importer batch size (`dkg-importer` guidance moves 1000 → 400 records) | | `@origintrail-official/dkg-agent` declares `"exports"` | deep imports of internal paths fail with `ERR_PACKAGE_PATH_NOT_EXPORTED` | import from the package root | | RFC-64 catalog is active by default | first boot creates `DKG_HOME/rfc64-sync/` and serves five new inbound catalog protocols (three without chain configuration) | no action; authoring/auto-publish stays opt-in | diff --git a/packages/agent/package.json b/packages/agent/package.json index d0fa7721b3..65b39be3fd 100644 --- a/packages/agent/package.json +++ b/packages/agent/package.json @@ -2,6 +2,9 @@ "name": "@origintrail-official/dkg-agent", "version": "10.0.10", "type": "module", + "engines": { + "node": ">=22.13.0 <23.0.0 || >=23.4.0" + }, "main": "dist/index.js", "types": "dist/index.d.ts", "exports": {