releases

solverforge 0.19.6 and 0.19.7: Planning Pin Enforcement and One Version Surface

solverforge 0.19.6 adds the typed planning pin predicate and enforces pinned entities across construction, local search, exhaustive search, and list-owner dispatch, while skipping pin scanning for models without pins. solverforge 0.19.7 moves every workspace version surface under the release tooling.

solverforge 0.19.6 and solverforge 0.19.7 are published on crates.io and released on GitHub (2026-09-25). The previous package, solverforge 0.19.5, retained the complete solution on cancellation and preserved complete Clarke-Wright construction.

Both releases keep the Rust 1.95 toolchain floor and the compiled runtime-graph execution model introduced on the 0.19 line.

What Changed

Pinned entities are enforced, not just declared

0.19.6 connects generated entity pin state to the existing descriptor/extractor boundary, so solver phases can inspect the current entity without reflecting on a field name. Manually assembled descriptors can supply the same predicate, and unpinned descriptors keep the cheap unrestricted path.

Enforcement now covers the paths where a pinned decision could previously be edited anyway:

  • scalar edits to pinned entities are rejected
  • pinned list owners keep their contents and order across construction and search
  • pinned assignments are retained in exhaustive search
  • sequential composite pin dispatch is covered by its own test
  • pin scanning is skipped entirely for models without pins

Add #[planning_pin] to a boolean planning-entity field to preserve that entity’s input planning variables during solving. A pinned route owner keeps its list contents and order; a pinned scalar keeps its input value. Pinned required assignments that start unassigned cannot be completed and cause the solve to fail; an optional pinned scalar may remain unassigned.

#[planning_entity]
pub struct Route {
    #[planning_id]
    pub id: usize,

    #[planning_pin]
    pub fixed: bool,

    #[planning_list_variable(element_collection = "visits")]
    pub visit_order: Vec<usize>,
}

The pinned scheduling lifecycle example verifies the contract end to end, so a pinned plan survives every phase rather than only the first one that touches the entity.

One workspace version surface

0.19.7 puts every workspace version surface under commit-and-tag-version, so the workspace, the published crates, and the tags are cut from a single declaration. The release tooling owns those surfaces instead of relying on each crate to be updated by hand, which removes the class of drift where a workspace member ships with a version no tag describes.

Published Version Boundaries

Surface Version Notes
Core runtime solverforge 0.19.8 Adds keyed cross-tri joins and the retained cross-tri incremental constraint on one arity-generic cross-join engine; historical 0.19.8 line
Core runtime (previous) solverforge 0.19.7 Every workspace version surface owned by the release tooling
Core runtime (previous) solverforge 0.19.6 Planning pin predicate and enforcement
Core runtime (previous) solverforge 0.19.5 Complete solution retained on cancellation

Patch History

Version Date Notes
0.19.14 2026-10-12 Inlines dense-key existence bookkeeping and documents borrowed-row keys on every later chained join.
0.19.13 2026-10-11 Rewrites the existence engine to answer semi/anti joins from per-key occurrence counts, with retained-key complement restore and caller-owned notification buffers.
0.19.12 2026-10-10 Mutates occupied equality buckets and existence links in place; preserves retained relationship semantics.
0.19.11 2026-10-10 Retains complete buffered Clarke-Wright merges on interruption, reuses relational buffers, and avoids redundant exact indexed equality extraction.
0.19.10 2026-10-09 Fixes optional construction progress and unary keyed source filtering; clarifies contracts and corrects the internal zero-regression gate.
0.19.9 2026-10-08 Independent-key joins and Chain past Penta, grouped joins, composable low-level row producers over the common operator tree, and the lost resume wakeup fix.
0.19.8 2026-10-02 Adds a third join source to keyed cross streams and the retained cross-tri incremental constraint; the local build gate runs the Rust checks CI runs.
0.19.7 2026-09-25 Owns every workspace version surface from the release tooling, so the workspace, crates, and tags are cut from one declaration.
0.19.6 2026-09-25 Exposes the typed planning pin predicate, rejects scalar edits to pinned entities, preserves pinned list owners across construction and search, retains pinned assignments in exhaustive search, and skips pin scanning for models without pins.
0.19.5 2026-09-15 Retains the complete solution on cancellation, initializes score history with a slice fill, and preserves complete Clarke-Wright construction.

Upgrade Checklist

  • For the historical 0.19.8 upgrade, run cargo update -p solverforge and confirm the resolved version is 0.19.8 before relying on pin enforcement, since the predicate only exists from 0.19.6.
  • If a model declares #[planning_pin], re-run its model and lifecycle tests: a pinned required assignment that starts unassigned now fails the solve rather than being completed by construction.
  • Models without pins need no change; pin scanning is skipped for them.

Use the SolverForge overview for the current crate surface, the modeling pages for planning entities and list variables, and the solver pages for how construction and local search consume pinned descriptors.