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 solverforgeand confirm the resolved version is0.19.8before relying on pin enforcement, since the predicate only exists from0.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.
Where to read next
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.