4.0.0-rc.4 release ledgerTrain opened: 2026-08-24
Canonical tag: v4.0.0-rc.4
Policy: coordinated release runbook
Predecessor evidence: 4.0.0-rc.3
State: local source validation complete; immutable source freeze in progress.
This append-only ledger is the operational source of truth for RC.4. It records the clean-build corrections after RC.3, exact source commits and workflow runs, registry digests, and independent installed-byte proofs. The living runbook defines reusable procedure; this ledger records observed facts.
RC.3 root validation exposed two hidden prerequisites: a JavaScript test job loaded a native addon that it never built, and a JVM collection test used a native dictionary provider that it never staged. The RC.4 correction closes those defects and the version-drift weakness found while reproducing them:
ffi contract, publishes the interop JAR to an
isolated staging repository, and passes the provider directory explicitly.Cargo.lock. Native SDK bootstrap passes --locked and executes
Cargo from each crate owner, preventing a runtime-only patch overlay from
leaking patch.unused metadata into independent lockfiles.@cljs-oss/module-deps. The actual
ClojureScript compiler path does not use it; removal eliminates its obsolete
Babel/core-js dependency graph and the three critical clean-install
advisories it introduced.These are release-reproducibility repairs. They do not change dictionary or matching semantics.
A build-clean family was created under a unique
/tmp/vinary-release-family-rc4.* directory by cloning each current owner
through Git's shared-object mechanism and applying only its tracked RC.4 working
diff. No target, Gradle build, native addon, npm installation, or runtime SDK
output existed at the start.
| Contract | Clean-layout observation | Result |
|---|---|---|
| seven-owner identity | all seven owner synchronizers accepted RC.4; the root train checker accepted seven standalone owners, exact edges, npm next, Hackage/fpm embargoes, and legacy latest protection | passed |
| runtime bootstrap | local interop types installed with zero advisories; configure/bootstrap compiled libdictenstein, liblevenshtein, lling-llang, and duallity; node-gyp produced native/build/Release/vinary_tree_native.node | passed |
| locked SDK rebuild | all five owner lockfiles were copied from source, native bootstrap rebuilt with --locked, and byte comparison proved every lockfile remained unchanged | passed |
| root npm facade | npm ci installed only three local family packages with no obsolete bundler graph; build, TypeScript contract tests, three runtime facade tests, and two ClojureScript tests/four assertions passed | passed |
| JVM dependency staging | exact interop 4.0.0-rc.4 staged locally; exact libdictenstein 4.0.0-rc.4 built with ffi; root tests received absolute native directories | passed |
| JVM collection/resource behavior | clean Gradle test javadoc completed successfully, including DictionaryCollectionsTest; local JDK 26 compiled Java 22 bytecode, while the tag workflow remains pinned to JDK 25 | passed |
| workflow syntax | every YAML workflow/action in all seven repositories parsed successfully | passed |
The temporary family is retained only until commits and local tags have been verified, then removed explicitly together with older RC rehearsal directories.
The clean-layout reproduction was followed by the owner-native gates below. Every command used Rust 1.95 where the owner declares that MSRV. Generated artifacts were rebuilt before package inspection rather than accepted from a prior candidate.
| Owner or surface | Local observation | Result |
|---|---|---|
vinary-tree-interop | full verifier passed Rust layout/evolution tests, C17 and C++23 headers, JavaScript, Python, Go, .NET, JVM/Javadoc, Swift, Fortran, OCaml, and Haskell; cargo package --locked built and verified the crate archive | passed |
javascript-runtime | source and built verifiers passed native, leak, property, browser-WASM, WASI, and package-shape tests; a full npm prepack rebuilt both WebAssembly targets and produced the expected 15-file archive | passed |
libdictenstein | 862 default tests, 3,046 debug all-feature tests, and 3,046 release all-feature tests passed; the exact FFI suite passed 97 tests and the query-start snapshot contract passed 7; binding, documentation, ABI, MathJax, Clippy, npm prepack, and native staging gates passed | passed |
liblevenshtein-rust | 1,775 default tests, 4,903 debug all-feature tests, and 4,903 release all-feature tests passed with five intentional skips in each all-feature run; the exact snapshot contracts passed 7, 10, and 5 tests; binding, ABI, MathJax, Clippy, npm/TypeScript/ClojureScript, JVM/Javadoc, and native staging gates passed | passed |
lling-llang | 2,567 default and 2,841 release all-feature tests passed; both release-workflow FFI matrices, binding/documentation/ABI/MathJax, Clippy, npm prepack, native staging, and installed shared/static CMake consumers passed | passed |
duallity | 257 default and 374 release all-feature tests passed; the FFI-only workflow matrix passed 152 unit, 33 integration, and 10 documentation tests; binding/documentation/ABI/MathJax, Clippy, npm prepack, native staging, and installed shared/static CMake consumers passed | passed |
| scoped and compatibility npm facades | all seven prepack lifecycles passed and exposed exact 4.0.0-rc.4 identities, exact family pins, and the intended archive file sets | passed |
| repository policy | all seven workflow trees parsed as YAML, all synchronizers and the aggregate train checker accepted the graph, formatting and whitespace checks passed, and all seven pgmcp bug-gate invocations reported no open bug anchored to a changed file | passed |
Cargo fully verified the dependency-free interop crate archive. Packaging each
downstream crate then stopped at its first exact, intentionally unpublished
RC.4 crates.io edge. This is the expected dependency barrier, not a substituted
source dependency: each downstream cargo package/cargo publish verification
is repeated only after its exact upstream registry version resolves.
Populate this table only after each worktree is clean, every local gate passes, and the enumerated commit has been created. Tags are annotated locally only after the complete source graph is frozen. No branch or tag is pushed without a fresh, explicit operator approval naming the exact repositories and refs.
| Owner | RC.4 commit | Local gates | Immutable-tag run | State |
|---|---|---|---|---|
vinary-tree-interop | 1614a522172ca33c90815920c82c5e07afec6918 | full platform verifier, crate/npm package, docs, lock, and policy gates passed | pending | source frozen |
javascript-runtime | 589b7570f38e9fbb98b10c54258bab8fcabde252 | native/WASM/WASI, leak/property, npm package, docs, lock, and policy gates passed | pending | source frozen |
libdictenstein | 085f61c22f714f6a9c2aee528077be180b9545d4 | default/all-feature, exact FFI/snapshot, binding, native/npm package, docs, lock, and policy gates passed | pending | source frozen |
liblevenshtein-rust | recorded by the RC.4 tag after this ledger commit | default/all-feature, exact snapshot, binding, clean npm/JVM, native/npm package, docs, lock, and policy gates passed | pending | freezing |
lling-llang | 0930c458dbec804210f521425ef901ebd00be86b on local release/4.0.0-rc.4 | default/all-feature, FFI, binding, native/npm package, docs, lock, and policy gates passed | pending | source frozen |
duallity | 6a79b8c571dac0ec3f1477c3046ab1bd86164199 on local release/4.0.0-rc.4 | default/all-feature, FFI, binding, native/npm package, docs, lock, and policy gates passed | pending | source frozen |
liblevenshtein-npm | 44c9812d983bddd7343828ee48095a2c3732aa0c | compatibility, delegation, npm package, legacy-channel, and policy gates passed | pending | source frozen |
Every stage begins only after the exact public bytes from the preceding stage resolve and pass an independent consumer:
@vinary-tree/interop;@vinary-tree/vinary-tree native/WASM/WASI runtime;liblevenshtein under next only; andEach GitHub dispatch uses refs/tags/v4.0.0-rc.4, one registry selector, and a
tag-restricted protected environment. A downstream dispatch never substitutes
a source checkout for a required public dependency.
| Coordinate | Workflow/protected environment | Public digest | Independent consumer | State |
|---|---|---|---|---|
vinary-tree-interop@4.0.0-rc.4 | pending | pending | Cargo ABI/status/resource smoke pending | not published |
@vinary-tree/interop@4.0.0-rc.4 | pending | pending | CommonJS/ESM identity smoke pending | not published |
libdictenstein@4.0.0-rc.4 | pending | pending | dictionary/map/snapshot smoke pending | not published |
@vinary-tree/libdictenstein@4.0.0-rc.4 | pending | pending | CRUD/traversal/batching/disposal smoke pending | not published |
liblevenshtein@4.0.0-rc.4 crate | pending | pending | construction/query smoke pending | not published |
@vinary-tree/liblevenshtein@4.0.0-rc.4 | pending | pending | query/stream/disposal smoke pending | not published |
lling-llang@4.0.0-rc.4 crate and facade | pending | pending | automata/traversal smoke pending | not published |
duallity@4.0.0-rc.4 crate and facade | pending | pending | WFST/bridge/disposal smoke pending | not published |
@vinary-tree/vinary-tree@4.0.0-rc.4 | pending | pending | native CJS/ESM, browser-WASM, and WASI smoke pending | not published |
liblevenshtein@4.0.0-rc.4 compatibility facade | pending under next only | pending | CommonJS/ESM delegation smoke pending | not published |
Only after all exact RC.4 tarballs pass the combined installed-package smoke:
latest = next = 4.0.0-rc.4;bootstrap;0.0.0 namespace reservation must carry the documented
bootstrap deprecation;@vinary-tree/libdictenstein@4.0.0-rc.1 must direct users to RC.4
or newer; andliblevenshtein must report latest = 2.0.4 and
next = 4.0.0-rc.4.Interactive web authentication is used for dist-tag and deprecation mutations. Publishing uses the repository workflow's provenance-bearing trusted publisher; no long-lived 2FA-bypass token is required.
pgmcp bug-gate
validation; retain downstream Cargo package verification at its exact
public-dependency barrier.RC.4 is complete only when all intended coordinates have exact source, workflow, digest, and clean-consumer evidence; every npm tag/deprecation invariant holds; all documentation and pgmcp records agree; temporary evidence has been removed; and every release worktree is clean. A local pass, tag, upload, or registry metadata listing alone is not completion.
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |