Skip to content

Commit cc7d03c

Browse files
committed
docs(usecases): align released bundle with 2.0.7 and FSR 2.0.8
The worked-use-case bundle was republished on 2026-09-13 on the SolverForge 0.19.4 line: solverforge-hospital@2.0.7, solverforge-lessons@2.0.7, solverforge-deliveries@2.0.7, and solverforge-fsr@2.0.8. All four tags passed bundle CI and the tag-triggered Hugging Face Space sync workflows, and the spaces were updated to match. The guides, status page, and 0.19.x release note still described the earlier 2.0.6/2.0.7 apps on solverforge 0.19.3. Move them to the published 2.0.7/2.0.8 contracts on solverforge 0.19.4 while keeping the recorded solverforge-cli 2.2.2 scaffold provenance and the published 2.2.3 scaffold target distinct. Move the machine-checked contract with the prose: verify-release-surface requires the new versions and forbids the superseded ones, the four tutorial verifiers assert the new app and runtime targets, and the site workflow checks out the solverforge-lessons@2.0.7 tag that contains all four republished apps.
1 parent 1379b19 commit cc7d03c

12 files changed

Lines changed: 131 additions & 69 deletions

‎.github/workflows/site.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ jobs:
4848
repository: SolverForge/solverforge-usecases
4949
# The coordinated releases were cut sequentially; the final tag
5050
# contains all four published app versions.
51-
ref: "solverforge-lessons@2.0.6"
51+
ref: "solverforge-lessons@2.0.7"
5252
path: .ci/solverforge-usecases
5353

5454
- name: Install Rust 1.95

‎scripts/verify-deliveries-tutorial.rb‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
SITE_ROOT = File.expand_path("..", SCRIPT_DIR)
1515
EXPECTED_CLI_VERSION = "2.2.3"
1616
EXPECTED_CLI_RUNTIME_VERSION = "0.19.3"
17-
EXPECTED_TUTORIAL_RUNTIME_VERSION = "0.19.3"
17+
EXPECTED_TUTORIAL_RUNTIME_VERSION = "0.19.4"
1818
EXPECTED_DELIVERIES_APP_CLI_VERSION = "2.2.2"
1919
EXPECTED_CLI_UI_VERSION = "0.7.0"
2020
EXPECTED_TUTORIAL_UI_VERSION = "0.6.5"
2121
EXPECTED_MAPS_VERSION = "2.1.4"
22-
EXPECTED_DELIVERIES_APP_VERSION = "2.0.6"
22+
EXPECTED_DELIVERIES_APP_VERSION = "2.0.7"
2323

2424
def log(message)
2525
puts "[verify-deliveries-tutorial] #{message}"

‎scripts/verify-fsr-tutorial.rb‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
EXPECTED_CLI_RUNTIME_VERSION = "0.19.3"
1717
EXPECTED_CLI_UI_VERSION = "0.7.0"
1818
EXPECTED_FSR_APP_CLI_VERSION = "2.2.2"
19-
EXPECTED_TUTORIAL_RUNTIME_VERSION = "0.19.3"
19+
EXPECTED_TUTORIAL_RUNTIME_VERSION = "0.19.4"
2020
EXPECTED_TUTORIAL_UI_VERSION = "0.6.5"
2121
EXPECTED_MAPS_VERSION = "2.1.4"
22-
EXPECTED_FSR_APP_VERSION = "2.0.7"
22+
EXPECTED_FSR_APP_VERSION = "2.0.8"
2323

2424
def log(message)
2525
puts "[verify-fsr-tutorial] #{message}"

‎scripts/verify-hospital-tutorial.rb‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
SITE_ROOT = File.expand_path("..", SCRIPT_DIR)
1515
EXPECTED_CLI_VERSION = "2.2.3"
1616
EXPECTED_CLI_RUNTIME_VERSION = "0.19.3"
17-
EXPECTED_TUTORIAL_RUNTIME_VERSION = "0.19.3"
17+
EXPECTED_TUTORIAL_RUNTIME_VERSION = "0.19.4"
1818
EXPECTED_CLI_UI_VERSION = "0.7.0"
1919
EXPECTED_TUTORIAL_UI_VERSION = "0.6.5"
2020
EXPECTED_MAPS_VERSION = "2.1.4"
2121
EXPECTED_HOSPITAL_APP_CLI_VERSION = "2.2.2"
22-
EXPECTED_HOSPITAL_APP_VERSION = "2.0.6"
22+
EXPECTED_HOSPITAL_APP_VERSION = "2.0.7"
2323

2424
def log(message)
2525
puts "[verify-hospital-tutorial] #{message}"

‎scripts/verify-lessons-tutorial.rb‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
SCRIPT_DIR = File.expand_path(__dir__)
55
SITE_ROOT = File.expand_path("..", SCRIPT_DIR)
6-
EXPECTED_RUNTIME_VERSION = "0.19.3"
6+
EXPECTED_RUNTIME_VERSION = "0.19.4"
77
EXPECTED_UI_VERSION = "0.6.5"
88
EXPECTED_CLI_VERSION = "2.2.2"
9-
EXPECTED_APP_VERSION = "2.0.6"
9+
EXPECTED_APP_VERSION = "2.0.7"
1010

1111
def log(message)
1212
puts "[verify-lessons-tutorial] #{message}"

‎scripts/verify-release-surface.rb‎

Lines changed: 66 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,35 +25,68 @@
2525
"SolverForge crate target 0.19.3",
2626
"solverforge-ui 0.7.0"
2727
],
28+
"src/docs/solverforge-ui/index.md" => [
29+
"solverforge-ui 0.8.0",
30+
"solverforge-cli 2.2.3",
31+
"solverforge-ui 0.7.0",
32+
"/sf/sf.0.8.0.css",
33+
"SF.version"
34+
],
35+
"src/docs/solverforge-ui/integration-assets.md" => [
36+
"solverforge-ui 0.8.0",
37+
"solverforge_ui::assets::version()",
38+
"SF.version",
39+
"onFailure",
40+
"onCancelled"
41+
],
42+
"src/docs/solverforge-ui/components.md" => [
43+
"content: { unsafeHtml:",
44+
"tabs[].content.unsafeHtml"
45+
],
46+
"src/docs/solverforge-ui/scheduling-views.md" => [
47+
"isWeekend",
48+
"non-zero layout dimensions",
49+
"unsafePopupHtml"
50+
],
51+
"src/reference/lifecycle-pause-resume-contract.md" => [
52+
"solverforge-ui 0.8.0"
53+
],
54+
"src/_posts/releases/2026-09-15-solverforge-ui-0-8-x.md" => [
55+
"`0.8.0` | 2026-09-15",
56+
"SF.version",
57+
"solverforge_ui::assets::version()"
58+
],
2859
"src/docs/status-and-roadmap.md" => [
2960
"solverforge 0.19.4",
3061
"solverforge-py 0.6.6",
3162
"solverforge-cli 2.2.3",
32-
"solverforge-hospital@2.0.6",
33-
"solverforge-lessons@2.0.6",
34-
"solverforge-deliveries@2.0.6",
35-
"solverforge-fsr@2.0.7"
63+
"solverforge-ui 0.8.0",
64+
"solverforge-hospital@2.0.7",
65+
"solverforge-lessons@2.0.7",
66+
"solverforge-deliveries@2.0.7",
67+
"solverforge-fsr@2.0.8"
3668
],
3769
"src/docs/getting-started/solverforge-hospital-use-case.md" => [
38-
"solverforge-hospital@2.0.6",
39-
"solverforge 0.19.3"
70+
"solverforge-hospital@2.0.7",
71+
"solverforge 0.19.4"
4072
],
4173
"src/docs/getting-started/solverforge-lessons-use-case.md" => [
42-
"solverforge-lessons@2.0.6",
43-
"solverforge 0.19.3"
74+
"solverforge-lessons@2.0.7",
75+
"solverforge 0.19.4"
4476
],
4577
"src/docs/getting-started/solverforge-deliveries-use-case.md" => [
46-
"solverforge-deliveries@2.0.6",
47-
"solverforge 0.19.3"
78+
"solverforge-deliveries@2.0.7",
79+
"solverforge 0.19.4"
4880
],
4981
"src/docs/getting-started/solverforge-fsr-use-case.md" => [
50-
"solverforge-fsr@2.0.7",
51-
"solverforge 0.19.3"
82+
"solverforge-fsr@2.0.8",
83+
"solverforge 0.19.4"
5284
],
5385
"src/_posts/releases/2026-07-17-solverforge-0-19-x.md" => [
5486
"`0.19.4` | 2026-08-11",
5587
"`0.19.3` | 2026-07-29",
56-
"`0.19.2` | 2026-07-19"
88+
"`0.19.2` | 2026-07-19",
89+
"solverforge-hospital@2.0.7"
5790
],
5891
"src/_posts/releases/2026-07-13-solverforge-python-0-6-x.md" => [
5992
"`0.6.6` | 2026-08-11",
@@ -66,7 +99,19 @@
6699
"src/docs/solverforge/index.md" => ["solverforge 0.19.1", "solverforge-cli 2.2.2"],
67100
"src/docs/solverforge-python/index.md" => ["solverforge-py 0.6.3", "solverforge==0.6.3"],
68101
"src/docs/solverforge-cli/command-reference.md" => ["solverforge-cli 2.2.2", "crate target 0.15.2"],
69-
"src/docs/status-and-roadmap.md" => ["solverforge-py 0.6.3", "solverforge 0.19.1", "solverforge-cli 2.2.2` package"]
102+
"src/docs/status-and-roadmap.md" => [
103+
"solverforge-py 0.6.3",
104+
"solverforge 0.19.1",
105+
"solverforge-cli 2.2.2` package",
106+
"solverforge-hospital@2.0.6",
107+
"solverforge-lessons@2.0.6",
108+
"solverforge-deliveries@2.0.6",
109+
"solverforge-fsr@2.0.7"
110+
],
111+
"src/docs/getting-started/solverforge-hospital-use-case.md" => ["solverforge-hospital@2.0.6"],
112+
"src/docs/getting-started/solverforge-lessons-use-case.md" => ["solverforge-lessons@2.0.6"],
113+
"src/docs/getting-started/solverforge-deliveries-use-case.md" => ["solverforge-deliveries@2.0.6"],
114+
"src/docs/getting-started/solverforge-fsr-use-case.md" => ["solverforge-fsr@2.0.7"]
70115
}.freeze
71116

72117
failures = []
@@ -85,7 +130,13 @@
85130
end
86131

87132
FORBIDDEN_TEXT.each do |relative_path, needles|
88-
text = File.read(File.join(ROOT, relative_path))
133+
path = File.join(ROOT, relative_path)
134+
unless File.file?(path)
135+
failures << "missing file: #{relative_path}"
136+
next
137+
end
138+
139+
text = File.read(path)
89140
needles.each do |needle|
90141
failures << "#{relative_path} still contains #{needle.inspect}" if text.include?(needle)
91142
end

‎src/_posts/releases/2026-07-17-solverforge-0-19-x.md‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ Version 0.6.6 embeds the exact SolverForge 0.19.4 crate set, treats each row's
240240
imported scalar candidate set as a hard native domain, and adds
241241
`same_value_conflict_field` for callback-free static assignment conflict graphs.
242242

243-
The worked use cases were republished again on the SolverForge 0.19.3 line:
243+
The worked use cases were first republished on the SolverForge 0.19.3 line:
244244

245245
- `solverforge-hospital@2.0.6`
246246
- `solverforge-lessons@2.0.6`
@@ -252,6 +252,17 @@ Deliveries and FSR also retain `solverforge-maps 2.1.4`. These patches align
252252
dependency and release metadata without changing the application behavior,
253253
datasets, or solver policies.
254254

255+
> **Update, 2026-09-13:** The use-case bundle was republished on the SolverForge
256+
> 0.19.4 line: `solverforge-hospital@2.0.7`, `solverforge-lessons@2.0.7`,
257+
> `solverforge-deliveries@2.0.7`, and `solverforge-fsr@2.0.8`. All four target
258+
> `solverforge 0.19.4` and retain `solverforge-ui 0.6.5`; deliverables and FSR
259+
> retain `solverforge-maps 2.1.4`. Bundle CI and the tag-triggered Space sync
260+
> workflows passed.
261+
>
262+
> **Update, 2026-09-15:** `solverforge-ui 0.8.0` is published; the published
263+
> `solverforge-cli 2.2.3` package still scaffolds the `solverforge-ui 0.7.0`
264+
> line.
265+
255266
## Upgrade Checklist
256267

257268
- Bump SolverForge dependencies to `0.19.4` and regenerate `Cargo.lock` from

‎src/docs/getting-started/solverforge-deliveries-use-case.md‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,13 @@ delivery-routing code.
136136
Start from the CLI's current published scaffold line, then keep the finished
137137
app's recorded release contract explicit. `solverforge-cli 2.2.3` scaffolds
138138
`solverforge 0.19.3` with `solverforge-ui 0.7.0`; the tagged
139-
`solverforge-deliveries@2.0.6` reference app also targets the published
140-
`solverforge 0.19.3` runtime while retaining the
139+
`solverforge-deliveries@2.0.7` reference app targets the published
140+
`solverforge 0.19.4` runtime while retaining the
141141
`solverforge-ui 0.6.5` and `solverforge-maps 2.1.4` companion lines:
142142

143143
```toml
144144
[dependencies]
145-
solverforge = { version = "0.19.3", features = [
145+
solverforge = { version = "0.19.4", features = [
146146
"serde",
147147
"console",
148148
"verbose-logging",
@@ -181,8 +181,8 @@ shell = "web"
181181
cli_version = "2.2.2"
182182

183183
[runtime]
184-
target = "solverforge 0.19.3"
185-
runtime_source = "crates.io: solverforge 0.19.3"
184+
target = "solverforge 0.19.4"
185+
runtime_source = "crates.io: solverforge 0.19.4"
186186
ui_source = "crates.io: solverforge-ui 0.6.5"
187187

188188
[demo]
@@ -410,7 +410,7 @@ pub struct Vehicle {
410410
}
411411
```
412412

413-
The CVRP domain profile is stock SolverForge 0.19.3. It expands to the
413+
The CVRP domain profile is stock SolverForge 0.19.4. It expands to the
414414
`VrpSolution` bound, CVRP distance meters, strict route-local hooks for route
415415
assignment and k-opt, relaxed Clarke-Wright savings hooks, and the stock savings
416416
metric class. The delivery app now keeps city-level routing preparation in the
@@ -590,7 +590,7 @@ Then local search combines list-aware route edits:
590590
The late-acceptance phase uses the
591591
`first_last_step_score_improving` forager. It keeps scanning through accepted
592592
ties and stops when a candidate improves on the score at the start of the
593-
step; that exact policy name is part of the shipped 2.0.6 configuration.
593+
step; that exact policy name is part of the shipped 2.0.7 configuration.
594594

595595
For beginners, this is the difference between writing one greedy dispatcher and
596596
building a search space. The solver starts from a route plan and repeatedly asks
@@ -772,7 +772,7 @@ make test-live-road
772772

773773
| Need | File or directory |
774774
| -------------------------------- | ----------------------------------- |
775-
| Tagged app release | `solverforge-deliveries@2.0.6` |
775+
| Tagged app release | `solverforge-deliveries@2.0.7` |
776776
| App metadata | `solverforge.app.toml` |
777777
| Solver policy | `solver.toml` |
778778
| Planning model manifest | `src/domain/mod.rs` |

‎src/docs/getting-started/solverforge-fsr-use-case.md‎

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ You will:
5151
- install `solverforge-cli` and scaffold a neutral SolverForge app
5252
- know when to switch from the learning scaffold to the complete FSR Space
5353
repository
54-
- keep the checked-in SolverForge 0.19.3 use-case dependency shape
54+
- keep the checked-in SolverForge 0.19.4 use-case dependency shape
5555
- understand why field-service routing uses a list planning variable
5656
- follow the current `Location`, `ServiceVisit`, `TravelLeg`,
5757
`TechnicianRoute`, and `FieldServicePlan` model
@@ -123,17 +123,17 @@ score analysis surface, route tables, Docker build, and tests.
123123

124124
### Keep the Published Dependency Shape
125125

126-
The tagged `solverforge-fsr@2.0.7` use-case source targets the published
127-
SolverForge 0.19.3 line:
126+
The tagged `solverforge-fsr@2.0.8` use-case source targets the published
127+
SolverForge 0.19.4 line:
128128

129129
```toml
130130
[dependencies]
131-
solverforge = { version = "0.19.3", features = [
131+
solverforge = { version = "0.19.4", features = [
132132
"serde",
133133
"console",
134134
"verbose-logging",
135135
] }
136-
solverforge-core = "0.19.3"
136+
solverforge-core = "0.19.4"
137137
solverforge-ui = { version = "0.6.5" }
138138
solverforge-maps = { version = "2.1.4" }
139139

@@ -160,9 +160,9 @@ and route shadow values; most generated applications only need the top-level
160160
`solverforge` facade.
161161

162162
The app contract in `solverforge.app.toml` names the app-owned runtime target.
163-
`solverforge-cli 2.2.3` now scaffolds `solverforge 0.19.3`; the finished FSR app
164-
records the same runtime target while retaining its original `2.2.2` scaffold
165-
provenance:
163+
`solverforge-cli 2.2.3` scaffolds `solverforge 0.19.3`; the finished FSR app
164+
records its app-owned `solverforge 0.19.4` runtime target while retaining its
165+
original `2.2.2` scaffold provenance:
166166

167167
```toml
168168
[app]
@@ -172,8 +172,8 @@ shell = "web"
172172
cli_version = "2.2.2"
173173

174174
[runtime]
175-
target = "solverforge 0.19.3"
176-
runtime_source = "crates.io: solverforge 0.19.3"
175+
target = "solverforge 0.19.4"
176+
runtime_source = "crates.io: solverforge 0.19.4"
177177
ui_source = "crates.io: solverforge-ui 0.6.5"
178178

179179
[demo]
@@ -393,7 +393,7 @@ travel it carries.
393393
### Route Shadows Bridge Lists and Streams
394394

395395
Several business rules need the same expensive route walk. Rather than keeping
396-
that walk inside a custom constraint adapter, the v0.19.3 use-case stores the
396+
that walk inside a custom constraint adapter, the v0.19.4 use-case stores the
397397
derived measurements on `TechnicianRoute` as cascading shadow variables:
398398

399399
- invalid and valid visit counts
@@ -513,7 +513,7 @@ values refreshed by `FieldServicePlan`. For example, `reachable_legs` reads
513513
`route_missing_skill_visits`, `minimize_travel` reads `travel_penalty()`, and
514514
`priority_slack` rewards `route_priority_slack`.
515515

516-
That is the v0.19.3 teaching point: whole-route business measurements can live
516+
That is the v0.19.4 teaching point: whole-route business measurements can live
517517
as domain shadow values, while the scoring rules remain stock SolverForge
518518
constraint streams with normal score-analysis metadata.
519519

@@ -699,7 +699,7 @@ curl http://localhost:7860/demo-data
699699

700700
| Topic | File |
701701
| ----- | ---- |
702-
| Tagged app release | `solverforge-fsr@2.0.7` |
702+
| Tagged app release | `solverforge-fsr@2.0.8` |
703703
| App contract | `solverforge.app.toml` |
704704
| Solver policy | `solver.toml` |
705705
| Solution root | `src/domain/field_service_plan.rs` |

‎src/docs/getting-started/solverforge-hospital-use-case.md‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,13 @@ CLI scaffold plus manual hospital scheduling code.
125125
Start from the CLI's current published scaffold line, then keep the finished
126126
app's recorded release contract explicit. `solverforge-cli 2.2.3` scaffolds
127127
`solverforge 0.19.3` with `solverforge-ui 0.7.0`; the tagged
128-
`solverforge-hospital@2.0.6` reference app also targets the published
129-
`solverforge 0.19.3` runtime while retaining
128+
`solverforge-hospital@2.0.7` reference app targets the published
129+
`solverforge 0.19.4` runtime while retaining
130130
`solverforge-ui 0.6.5` for the shipped web-shell assets:
131131

132132
```toml
133133
[dependencies]
134-
solverforge = { version = "0.19.3", features = [
134+
solverforge = { version = "0.19.4", features = [
135135
"serde",
136136
"console",
137137
"verbose-logging",
@@ -166,8 +166,8 @@ shell = "web"
166166
cli_version = "2.2.2"
167167

168168
[runtime]
169-
target = "solverforge 0.19.3"
170-
runtime_source = "crates.io: solverforge 0.19.3"
169+
target = "solverforge 0.19.4"
170+
runtime_source = "crates.io: solverforge 0.19.4"
171171
ui_source = "crates.io: solverforge-ui 0.6.5"
172172

173173
[demo]
@@ -710,7 +710,7 @@ make test-slow
710710

711711
| Need | File or directory |
712712
| -------------------------------- | ------------------------------------------ |
713-
| Tagged app release | `solverforge-hospital@2.0.6` |
713+
| Tagged app release | `solverforge-hospital@2.0.7` |
714714
| App metadata | `solverforge.app.toml` |
715715
| Solver policy | `solver.toml` |
716716
| Planning model manifest | `src/domain/mod.rs` |

0 commit comments

Comments
 (0)