Skip to content

Releases: debe/libpetri

TypeScript v2.10.4

Choose a tag to compare

@debe debe released this 02 Jul 10:15

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

Choose a tag to compare

@debe debe released this 02 Jul 10:18

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

Choose a tag to compare

@debe debe released this 02 Jul 10:19

Java v2.10.4

Choose a tag to compare

@debe debe released this 02 Jul 10:13

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

Choose a tag to compare

@debe debe released this 01 Jul 18:14

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 carried match_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

Choose a tag to compare

@debe debe released this 01 Jul 18:13

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 carried match_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

Choose a tag to compare

@debe debe released this 01 Jul 18:17

Java v2.10.3

Choose a tag to compare

@debe debe released this 01 Jul 18:45

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 carried match_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

Choose a tag to compare

@debe debe released this 26 Jun 09:46

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.mjs gains 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

Choose a tag to compare

@debe debe released this 26 Jun 08:32

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:viewer now runs check-viewer-wasm.mjs, which WebAssembly.validates the WASM embedded in the built IIFE and renders a graph through @viz-js/viz. scripts/build-viewer.sh inherits it, so a bad bundle can't reach the resource dirs.
  • CI: new viewer job 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) and esbuild (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.