Skip to content

Commit be17ea7

Browse files
committed
docs(solverforge): update site for 0.8.2 release
1 parent eaf098e commit be17ea7

File tree

8 files changed

+138
-9
lines changed

8 files changed

+138
-9
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
---
2+
title: 'SolverForge 0.8.2: Retained Runtime Refinement'
3+
date: 2026-04-11
4+
draft: false
5+
description: >
6+
SolverForge 0.8.2 is now available with more responsive retained-runtime
7+
controls, list-variable solution trait bounds, and pause lifecycle fixes.
8+
---
9+
10+
SolverForge **0.8.2** is now available.
11+
12+
This release tightens the retained-runtime surface introduced in `0.8.0` and
13+
rounds out a few gaps for production applications:
14+
15+
- **Interruptible retained phases** so built-in search work responds faster to
16+
`pause()`, `cancel()`, and config termination
17+
- **List-variable solution trait bounds** via
18+
`#[planning_list_variable(solution_trait = "...")]` when routing helpers or
19+
meters need extra solution-side contracts
20+
- **Serialized pause lifecycle publication** so `PauseRequested` remains
21+
authoritative before later pause-state events
22+
- **Pause-resume construction fixes** so interrupted placements are retried
23+
correctly after a retained pause
24+
25+
## Why this release matters
26+
27+
If you are building a service, UI, or embedded runtime around `SolverManager`,
28+
`0.8.2` makes the retained lifecycle more predictable under real interactive
29+
control. Pause and cancellation settle faster, pause-state events stay ordered,
30+
and list-heavy domains have a cleaner way to express extra trait requirements
31+
without local macro forks.
32+
33+
## Upgrade notes
34+
35+
- Keep using the retained job lifecycle from `SolverManager`; the public model
36+
is still job, snapshot, and checkpoint based.
37+
- Prefer `#[planning_solution(config = "...")]` when a solve should decorate
38+
the loaded `solver.toml` rather than replace it.
39+
- For list-heavy models with custom meters or helpers, add
40+
`solution_trait = "path::Trait"` only when generated stock helpers need an
41+
explicit extra solution-side bound.
42+
- The current crate line targets Rust `1.92+`.
43+
44+
## What's next
45+
46+
The next documentation pass will keep tightening the public API guides around
47+
retained lifecycle orchestration, list-heavy planning models, and scaffold
48+
extension workflows.

content/en/docs/getting-started/employee-scheduling-rust.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ icon: fa-brands fa-rust
55
date: 2026-04-05
66
weight: 5
77
description:
8-
"Build an employee scheduler with the current SolverForge 0.7.1 runtime
8+
"Build an employee scheduler with the current SolverForge 0.8.2 runtime
99
surface"
1010
categories: [Quickstarts]
1111
tags: [quickstart, rust]
1212
---
1313

1414
{{% pageinfo color="primary" %}} This guide is written against the current
15-
**SolverForge 0.7.1** runtime surface: generated constraint-stream accessors,
15+
**SolverForge 0.8.2** runtime surface: generated constraint-stream accessors,
1616
`solver.toml`, and `SolverEvent`-based solving through `SolverManager`.
1717
{{% /pageinfo %}}
1818

@@ -287,6 +287,10 @@ For list-heavy models, nearby search is expressed by picking a nearby selector
287287
variant such as `nearby_list_change_move_selector` or
288288
`nearby_list_swap_move_selector`.
289289

290+
When runtime policy needs per-problem tweaks, use
291+
`#[planning_solution(config = "...")]` to decorate the loaded `solver.toml`
292+
config instead of replacing it outright.
293+
290294
## Useful Generated Surface
291295

292296
The macros generate several helpers that are worth leaning on:
@@ -306,6 +310,8 @@ That generated surface is the main reason the current docs prefer
306310
on standard variables
307311
- Use `#[planning_list_variable(element_collection = "visits")]` plus `Vec<usize>`
308312
for stock list variables
313+
- Add `config = "..."` on `#[planning_solution]` when a solve should layer
314+
per-solution runtime policy on top of `solver.toml`
309315
- Use `.join(equal(...))` for self-joins and `.join((extractor, equal_bi(...)))`
310316
for cross-joins
311317
- Use `.named("...")`, not `as_constraint`

content/en/docs/overview.md

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,14 @@ constraints.
152152
# Project Status & Roadmap
153153

154154
{{% pageinfo %}} SolverForge is a **production-ready constraint solver** written
155-
in Rust. This documentation set is aligned with **SolverForge 0.7.1**. {{% /pageinfo %}}
155+
in Rust. This documentation set is aligned with **SolverForge 0.8.2** and the
156+
current crate line targets **Rust 1.92+**. {{% /pageinfo %}}
156157

157158
## Current Status
158159

159160
| Component | Status | Description |
160161
| ------------- | ------------------- | ---------------------------------------------------------------- |
161-
| **Rust Core** | ✅ Production-ready | Native Rust constraint solver with the current `0.7.1` runtime surface |
162+
| **Rust Core** | ✅ Production-ready | Native Rust constraint solver with the current `0.8.2` runtime surface |
162163

163164
**Want to try it today?**
164165

@@ -196,7 +197,21 @@ SolverForge Rust is **feature-complete** as a production constraint solver:
196197
`SolverStatus`, exact in-process pause/resume checkpoints, retained
197198
snapshots, snapshot-bound analysis, and terminal-job deletion
198199
- **Configuration**: stock `solver.toml` loading plus
199-
`SolverConfig::load()`, `from_toml_str()`, and `from_yaml_str()`
200+
`SolverConfig::load()`, `from_toml_str()`, `from_yaml_str()`, and
201+
`#[planning_solution(config = "...")]` overlays that decorate the loaded
202+
runtime config
203+
204+
## Latest Runtime Additions in 0.8.2
205+
206+
- **Prompt retained-runtime controls**: built-in search phases now poll pause,
207+
cancel, and config termination state during large neighborhood work so
208+
interactive controls settle promptly without app-side watchdogs
209+
- **List-variable solution trait bounds**: `#[planning_list_variable]` can now
210+
declare `solution_trait = "path::Trait"` when meters or helpers require extra
211+
solution-side API
212+
- **Serialized pause lifecycle publication**: the retained event stream keeps
213+
`PauseRequested` authoritative and ordered before later worker-side
214+
pause-state events
200215

201216
## Roadmap
202217

@@ -316,7 +331,7 @@ optimized native code.
316331
</details>
317332

318333
<details>
319-
<summary><strong>What's implemented (0.7.1)</strong></summary>
334+
<summary><strong>What's implemented (0.8.2)</strong></summary>
320335

321336
**Repository**:
322337
[solverforge/solverforge](https://github.com/solverforge/solverforge)

content/en/docs/solverforge/_index.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ linkTitle: 'SolverForge'
44
icon: fa-brands fa-rust
55
weight: 10
66
description: >
7-
Native Rust constraint solver — aligned with the 0.7.1 runtime surface.
7+
Native Rust constraint solver — aligned with the 0.8.2 runtime surface.
88
---
99

1010
SolverForge is a native Rust constraint solver for planning and scheduling
@@ -27,6 +27,8 @@ cd my-scheduler
2727
solverforge server
2828
```
2929

30+
The current `0.8.2` crate line targets Rust `1.92+`.
31+
3032
## Minimal Example
3133

3234
```rust

content/en/docs/solverforge/modeling/list-variables.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,24 @@ pub struct VehicleRoutePlan {
5858
```
5959

6060
The list variable stores visit indices, not `Visit` structs directly. This keeps
61-
move generation and list manipulation aligned with the stock `0.7.1` runtime.
61+
move generation and list manipulation aligned with the stock `0.8.2` runtime.
62+
63+
## Solution-Side Trait Bounds
64+
65+
Some list-variable helpers, distance meters, or route utilities need more from
66+
the planning solution than the base `PlanningSolution` contract. In `0.8.2`,
67+
`#[planning_list_variable]` can express that directly:
68+
69+
```rust
70+
#[planning_list_variable(
71+
element_collection = "visits",
72+
solution_trait = "crate::routing::RouteContext"
73+
)]
74+
pub visits: Vec<usize>,
75+
```
76+
77+
Use `solution_trait` only when stock list-variable helpers must see an explicit
78+
extra trait on the solution type.
6279

6380
## Shadow Updates
6481

content/en/docs/solverforge/modeling/planning-entities.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@ this is represented as `Vec<usize>` plus an `element_collection` name.
6969
pub visits: Vec<usize>,
7070
```
7171

72+
Common parameters:
73+
74+
- `element_collection = "visits"`: names the solution collection that contains
75+
all list elements
76+
- `solution_trait = "path::Trait"`: adds an explicit solution-side trait bound
77+
for generated stock list-variable helpers when meters or route utilities need
78+
richer solution context
79+
7280
### `#[planning_pin]`
7381

7482
Prevents the solver from changing an entity's variables. Useful for pre-assigned or locked entities.

content/en/docs/solverforge/solver/configuration.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ helpers for TOML and YAML when you want to inspect or build configs directly.
1515
### From a TOML file
1616

1717
```rust
18-
let config = SolverConfig::load("solver-config.toml").unwrap();
18+
let config = SolverConfig::load("solver.toml").unwrap();
1919
```
2020

2121
### From a TOML string
@@ -170,6 +170,30 @@ let config = SolverConfig::new()
170170
.with_termination_seconds(30);
171171
```
172172

173+
## Per-Solution Overlays
174+
175+
Macro-generated retained solves can layer runtime policy on top of the loaded
176+
`solver.toml` by using `config = "..."` on `#[planning_solution]`:
177+
178+
```rust
179+
#[planning_solution(
180+
constraints = "define_constraints",
181+
config = "solver_config_for_solution"
182+
)]
183+
pub struct Schedule {
184+
#[planning_score]
185+
pub score: Option<HardSoftScore>,
186+
pub time_limit_secs: u64,
187+
}
188+
189+
fn solver_config_for_solution(solution: &Schedule, config: SolverConfig) -> SolverConfig {
190+
config.with_termination_seconds(solution.time_limit_secs)
191+
}
192+
```
193+
194+
The callback receives the already loaded `solver.toml` config, so it should
195+
decorate that base config rather than replace it from scratch.
196+
173197
## See Also
174198

175199
- [Phases](../phases/) — Phase types and configuration

content/en/docs/solverforge/solver/solver-manager.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,11 @@ MANAGER.cancel(job_id).expect("cancel should be accepted");
150150
retains a checkpoint-backed snapshot, emits `Paused`, and only then allows
151151
`resume()`.
152152

153+
In `0.8.2`, the built-in construction, local-search, and retained phase flow
154+
poll control state during large neighborhood work more aggressively, so
155+
`pause()`, `cancel()`, and config termination unwind promptly without extra
156+
watchdog code in the application.
157+
153158
## Snapshots and Analysis
154159

155160
Every retained solution snapshot has a monotonic `snapshot_revision` within its
@@ -175,6 +180,10 @@ println!("analysis score: {:?}", analysis.analysis.score);
175180

176181
Analysis is snapshot-bound. You do not analyze the live mutable job directly.
177182

183+
After `pause()` is accepted, `PauseRequested` is published before any later
184+
worker-side event already carrying `PauseRequested` state. Treat that ordering
185+
as authoritative when synchronizing UI or service-layer state.
186+
178187
## Delete and Slot Reuse
179188

180189
Jobs remain retained after `Completed`, `Cancelled`, or `Failed` so you can read

0 commit comments

Comments
 (0)