Releases: debe/libpetri
Release list
TypeScript v2.10.4
Fix: ν-net join match dropped by bindActions (NU-030)
Follow-up to 2.10.3, which fixed the composition drop sites (mergeTransitions, rebuild_with_name) but missed a third: binding actions rebuilds every transition (rebuildWithAction / rebuild_with_action) to attach its action, and the Java and TypeScript path never carried matchSpec forward. A net composed with an intact ν-net join lost its correlation the moment actions were bound, reverting a correlated join-by-id to a plain FIFO AND join at runtime (pairing tokens by arrival order across overlapping fork/join generations, a stale cross-group result). A bind renames no places, so the match is carried as-is, unlike the compose/rename rebuild.
- Java / TypeScript: the action-bind rebuild now carries the transition's
matchSpec. Rust already carried it, so this locks the behaviour in with tests; Python inherits through the Rust runtime. - Regression tests added across all four languages: a structural check that a bound transition keeps its match, and a behavioral check that a bound matched join pairs by name, not FIFO (both executor backends where applicable).
Rust v3.4.4
Fix: ν-net join match dropped by bindActions (NU-030)
Follow-up to 2.10.3, which fixed the composition drop sites (mergeTransitions, rebuild_with_name) but missed a third: binding actions rebuilds every transition (rebuildWithAction / rebuild_with_action) to attach its action, and the Java and TypeScript path never carried matchSpec forward. A net composed with an intact ν-net join lost its correlation the moment actions were bound, reverting a correlated join-by-id to a plain FIFO AND join at runtime (pairing tokens by arrival order across overlapping fork/join generations, a stale cross-group result). A bind renames no places, so the match is carried as-is, unlike the compose/rename rebuild.
- Java / TypeScript: the action-bind rebuild now carries the transition's
matchSpec. Rust already carried it, so this locks the behaviour in with tests; Python inherits through the Rust runtime. - Regression tests added across all four languages: a structural check that a bound transition keeps its match, and a behavioral check that a bound matched join pairs by name, not FIFO (both executor backends where applicable).
Python v2.13.2
Full Changelog: java/v2.10.4...python/v2.13.2
Java v2.10.4
Fix: ν-net join match dropped by bindActions (NU-030)
Follow-up to 2.10.3, which fixed the composition drop sites (mergeTransitions, rebuild_with_name) but missed a third: binding actions rebuilds every transition (rebuildWithAction / rebuild_with_action) to attach its action, and the Java and TypeScript path never carried matchSpec forward. A net composed with an intact ν-net join lost its correlation the moment actions were bound, reverting a correlated join-by-id to a plain FIFO AND join at runtime (pairing tokens by arrival order across overlapping fork/join generations, a stale cross-group result). A bind renames no places, so the match is carried as-is, unlike the compose/rename rebuild.
- Java / TypeScript: the action-bind rebuild now carries the transition's
matchSpec. Rust already carried it, so this locks the behaviour in with tests; Python inherits through the Rust runtime. - Regression tests added across all four languages: a structural check that a bound transition keeps its match, and a behavioral check that a bound matched join pairs by name, not FIFO (both executor backends where applicable).
TypeScript v2.10.3
Fix: ν-net join match dropped during modular composition (NU-030 / NU-060)
Composition could silently drop a ν-net join's correlation (matchSpec / match_spec), reverting a correlated join-by-id to a plain FIFO AND join. At runtime that pairs tokens by arrival order instead of by name, so an overlapping fork/join could serve a stale cross-group result.
- Rust / Python: the rename/substitute rebuild (
rebuild_with_name) never carriedmatch_spec, so any ν-net join inside a port-composed or instantiated subnet lost its match (a violation of the NU-030 MUST). The match now follows the same place rewrite the arcs do. Python inherits the fix through the Rust runtime. - Java / TypeScript / Rust: the channel-merge path (
mergeTransitions/merge_transitions) dropped the match on fusion. It now carries a surviving one-sided match forward, and rejects a merge where both sides carry a match rather than silently dropping one (NU-060). The MOD-031 declared-to-actual place map is carried through the merge too, so a merged transition's composed action still resolves its declared place constants. - Regression tests added across Java, TypeScript, Rust, and Python, including a behavioral test that a composed matched join pairs by name, not FIFO.
Rust v3.4.3
Fix: ν-net join match dropped during modular composition (NU-030 / NU-060)
Composition could silently drop a ν-net join's correlation (matchSpec / match_spec), reverting a correlated join-by-id to a plain FIFO AND join. At runtime that pairs tokens by arrival order instead of by name, so an overlapping fork/join could serve a stale cross-group result.
- Rust / Python: the rename/substitute rebuild (
rebuild_with_name) never carriedmatch_spec, so any ν-net join inside a port-composed or instantiated subnet lost its match (a violation of the NU-030 MUST). The match now follows the same place rewrite the arcs do. Python inherits the fix through the Rust runtime. - Java / TypeScript / Rust: the channel-merge path (
mergeTransitions/merge_transitions) dropped the match on fusion. It now carries a surviving one-sided match forward, and rejects a merge where both sides carry a match rather than silently dropping one (NU-060). The MOD-031 declared-to-actual place map is carried through the merge too, so a merged transition's composed action still resolves its declared place constants. - Regression tests added across Java, TypeScript, Rust, and Python, including a behavioral test that a composed matched join pairs by name, not FIFO.
Python v2.13.1
Full Changelog: typescript/v2.10.3...python/v2.13.1
Java v2.10.3
Fix: ν-net join match dropped during modular composition (NU-030 / NU-060)
Composition could silently drop a ν-net join's correlation (matchSpec / match_spec), reverting a correlated join-by-id to a plain FIFO AND join. At runtime that pairs tokens by arrival order instead of by name, so an overlapping fork/join could serve a stale cross-group result.
- Rust / Python: the rename/substitute rebuild (
rebuild_with_name) never carriedmatch_spec, so any ν-net join inside a port-composed or instantiated subnet lost its match (a violation of the NU-030 MUST). The match now follows the same place rewrite the arcs do. Python inherits the fix through the Rust runtime. - Java / TypeScript / Rust: the channel-merge path (
mergeTransitions/merge_transitions) dropped the match on fusion. It now carries a surviving one-sided match forward, and rejects a merge where both sides carry a match rather than silently dropping one (NU-060). The MOD-031 declared-to-actual place map is carried through the merge too, so a merged transition's composed action still resolves its declared place constants. - Regression tests added across Java, TypeScript, Rust, and Python, including a behavioral test that a composed matched join pairs by name, not FIFO.
TypeScript v2.10.2
Fix: bundled viewer WASM rendered blank in rustdoc-embedded diagrams
The doc generators inline petrinet-diagrams.js as a <script> inside a Markdown doc comment. @viz-js/viz embeds the Graphviz WASM as a string whose bytes include raw newlines; when the doc comment isn't a clean leading HTML block (e.g. it has preceding /// prose), rustdoc's Markdown renderer collapsed those newlines, dropping WASM bytes and producing CompileError: signature index out of range in every browser.
- The viewer bundle is now built with esbuild template-literal lowering +
lineLimit, so no raw newline lands inside a string literal and lines stay short (rustdoc no longer scans multi-megabyte lines). The bundle is pure ASCII and survives Markdown inlining unchanged. check-viewer-wasm.mjsgains a Markdown-resilience gate: it re-validates the embedded WASM after a newline-collapse pass, so a regression that reintroduces raw newlines fails the build.- Verified by regenerating the downstream consumer's rustdoc page with the rebuilt asset: the diagram renders in Chrome 145 with no errors.
TypeScript v2.10.1
Doc-generator viewer bundle: WASM validation + anti-drift CI gate
The baked Graphviz-WASM in the shared petrinet-diagrams.js (Java taglet, Rust libpetri-docgen, TS doclet) is now validated before it can ship — closing the gap where a corrupt bake renders blank docs but passes all unit tests (which mock @viz-js/viz).
- Build gate:
npm run build:viewernow runscheck-viewer-wasm.mjs, whichWebAssembly.validates the WASM embedded in the built IIFE and renders a graph through@viz-js/viz.scripts/build-viewer.shinherits it, so a bad bundle can't reach the resource dirs. - CI: new
viewerjob builds the bundle, runs a headless-Chromium render smoke test (smoke:viewer, asserts an<svg>appears), and fails on viewer-asset drift (git diff --exit-code) — the committed assets must be the reproducible output of the locked toolchain. - Pinned + rebuilt:
@viz-js/viz(3.28.0) andesbuild(0.27.3) are exact-pinned so the bundle is reproducible; dependabot bumps are now gated by the checks above. The three resource bundles are rebuilt on the pinned toolchain, resolving prior 3.27/3.28 drift. No viewer behaviour change.