Release notes¶
User-facing release notes for the Viper runtime and the two dsviper bindings.
There is one runtime contract — Viper C++ on the 1.2 line (MAJOR.MINOR) —
delivered through two installable packages, each with its own independent
PATCH stream:
dsviper — the Python wheel on PyPI (
pip install dsviper)@digitalsubstrate/dsviper — the Node.js binding on npm
See Naming for how these names relate. The Viper C++ runtime is not installed on its own — it ships inside both packages; each binding entry notes the runtime version it carries. Only released versions are listed, and breaking changes are flagged inline.
Viper C++ runtime¶
The engine shipped inside both bindings; viperVersion() reports this version.
Releases with no runtime change are omitted.
1.2.16 — 2026-06-13¶
Added — Commit engine: pre-merge (virtual) reconciliation on
CommitStateBuilder(mergeState,analyzeVirtualMerge,reconcileState,materializeMerge,mergeEnabledByCommitId) — additive analysis over the public commit API.Fixed — Path serialization: non-regular paths (
Entry/Elementsteps) round-trip losslessly.
1.2.15 — 2026-06-11¶
Changed (breaking) — head navigation and commit-state construction move out of
CommitDatabaseintoCommitDatabaseHelper(reduceHeads/forward/fastForward) andCommitStateBuilder(initialState/state/enabledByCommitId); callers now pass the database explicitly.Added —
reduceHeadsselectable merge anchor; a non-head anchor raises a structured “not a head” error.Removed (breaking) — the global
CommitStoresingleton; construct and own a store explicitly.Fixed —
XArraycontains/positionOfover key element types.
1.2.14 — 2026-06-10¶
Added —
Fuzzeris now deterministic and seedable: a seed reproduces the generated keys and blob ids.
1.2.13 — 2026-06-04¶
Fixed — malformed JSON/BSON now yields a structured error (previously undefined behavior) on both the generic and DSM-typed decode paths; value and id hashing made thread-safe.
Added — stream-read interface:
remaining()/size().
1.2.11 — 2026-05-29¶
Added — post-merge supervised reconciliation (
CommitMergeAnalyzer):analyzeMergereconstructs, per document, the points where a branch’s intent did not survive a target-wins merge;reconcilecomposes per-locus decisions into a single child of the merge. NewCommitMergeAnalysis/CommitMergeDocument/CommitMergeConflict/CommitMergeResolution.Fixed — unified key-decode conformance (null / concept / club keys); JSON decoder path-tracking diagnostics; restored the
runtimeIdmismatch guard in the binary Definitions decoder.
1.2.10 — 2026-05-11¶
Changed (breaking) —
CommitIdis now derived only from(parentCommitId, type, targetCommitId, opcodesBlob);timestamp/labelare no longer hashed, giving intrinsic idempotence. All priorCommitIdvalues change.Fixed —
reduceHeadswrapped in an exclusive transaction (atomic against a concurrent writer); deterministiclastCommitIdtie-break.
1.2.9 — 2026-05-08¶
Fixed — JSON
DSMDefinitionsdecoder preservesisMutable; corrected decode error context.Changed — JSON decoder errors carry a runtime JSON path instead of a static label.
1.2.7 — 2026-04-16¶
Fixed — defined behavior for ±Inf / NaN in floats and doubles (total order over NaN;
INF/NEG_INF/NANconstants; codec round-trip), plus a broad pass of value-semantics, blob, stream I/O, definitions/DSM, SQLite, and path/XArraycorrectness fixes and cross-platform cleanups (Windows shared memory, environment lookups).
1.2.5 — 2026-03-24¶
Fixed — SQLite extend-definitions argument; nested
Entry/Elementpath decomposition.
1.2.0 — 2026-03-20¶
Initial release.
Type/Value system with reference semantics; Database engine (SQLite backend); Commit engine with content-addressable storage (SHA-1); blob storage with attachment support; JSON and binary stream codecs; RPC and network services; a single structured exception type.
Platforms: macOS 15, Windows 10/11, Linux Ubuntu 24.04 LTS (x86_64 / arm64).
dsviper (Python)¶
The PyPI wheel (pip install dsviper). Its PATCH stream is independent of the
runtime; each release notes the runtime version it ships.
1.2.17 — 2026-06-28¶
Added —
viper_version()reports the embedded Viper runtime version, distinct fromversion()(the wheel version); the wheel’sPATCHstream now moves independently of the runtime over the shared1.2contract.Fixed —
ValueBlobId.encoded()now returns astr(previously returned aValueBlobId).Fixed —
TypeMap.values_type()now returns the value type (avector) instead of the key type (aset).Fixed — bound
size()/hash()methods that the runtime exposes but the binding was missing.Fixed — type stubs:
ValueOptional.unwrap()/get()were annotatedencoded=Falsebut the binding defaults toencoded=True(hint-only correction); corrected thedispatchreturn annotation; removed phantom declarations bound nowhere (CommitData.transcode,DSMParseError.part).Fixed — packaging: the documentation URL now points at the dsviper landing page; the PyPI Quick Start routes through
CommitStateBuilder.initial_state(db)/state(db, commit_id).Ships runtime 1.2.17.
1.2.16 — 2026-06-13¶
Fixed — memory-safety hardening in the binding (reference-count leaks across the encode and commit paths);
blob/del_blobnow type-check the blob id; exception boundaries aroundDefinitionsConstinject/discard and tuple/XArrayoperations.Ships runtime 1.2.16.
1.2.15 — 2026-06-11¶
Changed — binding call sites moved to the runtime’s new free-function namespaces (
CommitDatabaseHelper/CommitStateBuilder); no other change.Ships runtime 1.2.15.
1.2.14 — 2026-06-10¶
Added —
Fuzzergains an optionalseedkeyword andseed()method (deterministic, replayable runs).Ships runtime 1.2.14.
1.2.13 — 2026-06-04¶
Fixed — use-after-free on the streaming read channel: the source
ValueBlobis retained for the stream’s lifetime.Added —
remaining()/size()on the streaming reader types.Ships runtime 1.2.13.
1.2.12 — 2026-05-31¶
Added — Database ↔ CommitDatabase transfer toolkit:
DatabaseToCommitDatabaseConverter,CommitDatabaseToDatabaseConverter,DatabaseCopier,CommitDatabaseFlattener; a sharedDatabaseTransferInfo; a subclassableStepperDelegate; pre-opened handles, 64 MiB blob streaming, and orphan/superseded blob dropping.Changed (breaking) —
Databasing.create_blobis now(BlobId, BlobLayout, Blob) -> bool(the caller supplies the id), matchingCommitDatabasing.
1.2.11 — 2026-05-29¶
Ships runtime 1.2.11 (
CommitMergeAnalyzerpost-merge reconciliation; key-decode conformance; JSON decoder diagnostics).
1.2.10 — 2026-05-11¶
Ships runtime 1.2.10 (content-addressed
CommitIdnarrowed — breaking;reduceHeadsatomicity;lastCommitIdtie-break).
1.2.9 — 2026-05-08¶
Changed — the Python unit suite moved to the public, MIT-licensed
dsviper-testsrepo; the publish pipeline self-gates on it. Added cross-codec round-trip equivalence tests (DSMDefinitions: binary ↔ JSON ↔ BSON).Ships runtime 1.2.9.
1.2.8 — 2026-05-03¶
Changed — packaging moved to PEP 639 license metadata (
License-Expression: LicenseRef-DigitalSubstrate-Commercial-1.2;LICENSEand third-party notices embedded underdist-info/licenses/).
1.2.7 — 2026-04-16¶
Fixed — error-path safety in the binding; corrected several type-stub (
__init__.pyi) return types.Added — multi-platform CI test matrix (Linux / macOS / Windows × 5 Python versions) and automated PyPI publication; robustness hardening with 270 new unit tests.
Ships runtime 1.2.7.
1.2.5 — 2026-03-24¶
Fixed —
CommitStoredispatch error handling aligned with the C++ semantics; inject/discard may target any namespace; complete wheel metadata.Added — semantic-version release tooling.
Ships runtime 1.2.5.
1.2.0 — 2026-03-20¶
Initial release.
Strong-typed Python C-API binding with seamless conversion; native Python collections accepted as input (metadata-driven). Published on PyPI (
pip install dsviper).Ships runtime 1.2.0.
dsviper for Node.js¶
The npm package @digitalsubstrate/dsviper. See dsviper for Node.js.
1.2.0 — 2026-06-27¶
First release — the in-process Node.js binding over the Viper runtime, bound roughly 1:1 with the Python surface via N-API.
Added — the Type/Value system, Commit Database, Definitions & DSM, Key/Path/Attachment, Blob, codecs, and the blocking remote-service client, with a structured exception bridge.
Added — native JS idioms:
number/bigintnumerics, prototype inheritance (instanceof),util.inspectrendering, object-literal structs (assign/toObject), Immutable.js-stylegetIn/setIn, strict non-negative.at().Added — two-axis versioning:
version()reports the binding,viperVersion()the embedded runtime.Added — prebuilt binaries for Linux (x64/arm64), macOS (Apple Silicon), and Windows (x64/arm64); N-API ABI-stable, no toolchain required at install.
Note — the remote-service server tier, transport, and IPC/threading primitives are intentionally not bound (incompatible with Node’s event loop).
Ships runtime 1.2.