PowerSolver 2.0 — Quick Start
Start with tutorial 0: a real plan from an Excel workbook, in five minutes. Tutorials 1 to 4 then build sequence plans by hand in the wizard, to show how the model works.
| # | Problem | Variable | Time |
|---|---|---|---|
| 0 | A week of machining (235 operations, 19 machines) from one workbook | basic (machine, time slot) | 5 min |
| 1 | Schedule 4 tasks on 2 machines back-to-back | list (sequence) | 5 min |
| 2 | Roster 3 employees across 5 shifts | list (sequence) | 7 min |
| 3 | Route 2 trucks through 6 customer visits | list (sequence) | 7 min |
| 4 | Schedule 5 maintenance jobs on 2 crews | list (sequence) | 5 min |
Tutorials 1 to 4 use the §5bis sequence shape. They all share the same canonical pair of derived shadows (startTime / endTime) and the same constraint vocabulary — once you understand tutorial 1, the others are variations.
Tutorial 0 — A plan from an Excel workbook
- Open the wizard and sign in.
- Step 1 → Load a plan from Excel → choose
powersolver-demos/18-job-shop-machining-week/input/problem.week.xlsx. (No file? Download workbook template gives a small worked example; ⓘ explains every sheet.) - The dialog lists what the workbook holds: 235 operations (step 2), 19 machines and 40 slots (step 3), 8 rules (step 4). Click Fill all steps now.
- Step 7 opens. Can this work? checks the data before planning: green "No problem found".
- Click Plan it. In about two minutes the Results page shows the plan: every operation on a machine and a slot, every must-follow rule at 0, the calendar per machine, Check before you use it.
To see each step instead, choose Go through the steps one by one and press Import on each step's banner. What each sheet holds and how to fill one for your own data: Wizard User Guide (step 1) and Customer Handover.
Tutorial 1 — Back-to-back Task Assignment
Business question: "I have 4 tasks (Cut, Bevel, Tack, Weld) and 2 machines starting work at 08:00. Schedule them back-to-back, high-priority work first."
Step 1 — Open the wizard
Go to https://wizard.planningpowertools.com/.
Step 2 — Pick problem type
Click Task Assignment. Below the cards, toggle Sequence Mode to "Consecutive on a host".
Step 3 — Define entities (the tasks)
Step 2 of the wizard. Click Add Entity four times, fill in:
| id | name | priority | duration |
|---|---|---|---|
| T1 | Cut | 1 | PT30M |
| T2 | Bevel | 2 | PT45M |
| T3 | Tack | 3 | PT20M |
| T4 | Weld | 1 | PT90M |
priority 1 = highest. duration is ISO-8601 (PT30M = 30 minutes).
Step 4 — Define hosts (the machines)
Step 3 of the wizard. Set variable count to 1. Variable config: label "Resources", assignment type list. Then in the value grid:
| id | name | startTime |
|---|---|---|
| M1 | Mill-1 | 2026-06-01T08:00 |
| M2 | Mill-2 | 2026-06-01T08:00 |
Step 5 — Apply the sequence template
In Step 3's Sequence Configuration card, click Apply default template. The derived-shadow table now shows the canonical startTime and endTime rows.
Step 6 — Add constraints
Step 4 of the wizard. Add:
- All tasks scheduled — type: hard, rule:
unassigned_count, params:{"inverse_field": "host"}, weight: 100 - Prefer high priority first — type: soft, rule:
minimize_property, params:{"property": "priority"}, weight: 1
Step 7 — Solve
Step 7 of the wizard. Can this work? runs first (green: nothing makes the plan impossible). Click Plan it. Expected output:
Score: 0hard / -6soft (feasible)
Mill-1: [T1 Cut (08:00–08:30), T4 Weld (08:30–10:00)]
Mill-2: [T2 Bevel (08:00–08:45), T3 Tack (08:45–09:05)]
(Exact distribution may vary; the solver finds equivalent-scoring solutions.)
What you just did
You built a list variable on the resources collection, pointed at the entities collection. You declared the canonical previous + host shadows and the startTime + endTime derived shadows. The solver placed every task into some machine's list (hard constraint satisfied) and minimised the sum of priority across all tasks (soft constraint).
Tutorial 2 — Employee Rostering
Business question: "I have 5 shifts (morning reception, morning triage, afternoon reception, afternoon triage, evening on-call) and 3 employees (Alice and Bob start at 06:00, Carol at 14:00). Cover all shifts."
Setup
In the wizard: Problem type Employee Rostering, Sequence Mode on.
Entities (shifts):
| id | name | skill | duration |
|---|---|---|---|
| S1 | Morning-Reception | 1 | PT4H |
| S2 | Morning-Triage | 2 | PT4H |
| S3 | Afternoon-Reception | 1 | PT4H |
| S4 | Afternoon-Triage | 2 | PT4H |
| S5 | Evening-On-Call | 3 | PT4H |
Hosts (employees):
| id | name | startTime |
|---|---|---|
| E1 | Alice | 2026-06-01T06:00 |
| E2 | Bob | 2026-06-01T06:00 |
| E3 | Carol | 2026-06-01T14:00 |
Sequence config: Apply default template.
Constraints:
- All shifts staffed — hard,
unassigned_count,{"inverse_field": "host"}, weight 100 - Lower-skill first — soft,
minimize_property,{"property": "skill"}, weight 1
Expected output
Score: 0hard / -10soft
Alice: [S1 Reception (06:00–10:00), S3 Reception (10:00–14:00)]
Bob: [S2 Triage (06:00–10:00), S4 Triage (10:00–14:00)]
Carol: [S5 On-Call (14:00–18:00)]
Why it works
Carol starts at 14:00, so any shift placed on her list begins at 14:00 by the canonical derived shadow. The other employees have 06:00 startTimes and absorb the earlier shifts. The minimize_property rule pushes low-skill shifts to be scheduled first (lower priority sum overall).
Tutorial 3 — Vehicle Routing
Business question: "Two trucks visit six customers. Higher-priority customers earlier in the route."
Setup
Problem type Vehicle Routing, Sequence Mode on.
Entities (customers):
| id | name | priority | duration |
|---|---|---|---|
| C1 | Customer-North | 1 | PT20M |
| C2 | Customer-East | 2 | PT15M |
| C3 | Customer-South | 3 | PT25M |
| C4 | Customer-West | 2 | PT20M |
| C5 | Customer-Downtown | 1 | PT30M |
| C6 | Customer-Uptown | 4 | PT15M |
Hosts (vehicles):
| id | name | startTime |
|---|---|---|
| V1 | Truck-1 | 2026-06-01T08:00 |
| V2 | Truck-2 | 2026-06-01T08:00 |
Sequence config: Apply default template.
Constraints:
- Every customer visited — hard,
unassigned_count, weight 100 - High-priority first — soft,
minimize_propertyonpriority, weight 1
Expected output
Score: 0hard / -13soft
Truck-1: [C1 (08:00–08:20), C2 (08:20–08:35), C3 (08:35–09:00)]
Truck-2: [C5 (08:00–08:30), C4 (08:30–08:50), C6 (08:50–09:05)]
The exact partition between trucks may vary but priority-1 customers always come first on their route (the minimize_property rule rewards early scheduling of low-priority-number entities).
What's NOT modelled
This tutorial doesn't model:
- Geographic distance between customers — the solver ignores
locationhere - Vehicle capacity — there's no cap on how many customers per truck
- Time windows on customers — every customer is reachable at any time
To add distance, capacity, or time windows you'd extend the derived shadows (e.g. cumulativeDistance, cumulativeLoad) and add assertions in the test harness. The native solver constraint vocabulary for those checks is still on the roadmap.
Tutorial 4 — Maintenance Scheduling
Business question: "Two maintenance crews handle five jobs. Higher-priority jobs first."
Setup
Problem type Maintenance Scheduling, Sequence Mode on.
Entities (jobs):
| id | name | priority | duration |
|---|---|---|---|
| J1 | Pump-A-Overhaul | 1 | PT2H |
| J2 | Valve-B-Service | 2 | PT1H |
| J3 | Pipe-Inspection | 3 | PT45M |
| J4 | Filter-Change | 4 | PT30M |
| J5 | Pressure-Test | 2 | PT90M |
Hosts (crews):
| id | name | startTime |
|---|---|---|
| CREW1 | Crew-Alpha | 2026-06-01T07:00 |
| CREW2 | Crew-Bravo | 2026-06-01T07:00 |
Sequence config: Apply default template.
Constraints:
- Every job scheduled — hard,
unassigned_count, weight 100 - High-priority first — soft,
minimize_propertyonpriority, weight 1
Expected output
Score: 0hard / -12soft
Crew-Alpha: [J1 Pump (07:00–09:00), J5 Pressure (09:00–10:30)]
Crew-Bravo: [J2 Valve (07:00–08:00), J3 Pipe (08:00–08:45), J4 Filter (08:45–09:15)]
What to try next
- Add your own data. The wizard's Step 2 / Step 3 imports accept CSV-like paste or a §5bis JSON file. Replace the toy entities and hosts with real ones.
- Tighten the schedule. Add an
endTimeupper bound to host properties and inspect whether all jobs fit (use the assertion harness viascripts/run_corpus_against_env.py). - Save as a template. Click Download in Step 7 — the JSON is ready to commit to your project's repo.
- Read the Wizard User Guide. Each tutorial above touches every step but doesn't explain every option. See WIZARD_USER_GUIDE.md for the field-by-field reference.
Where the templates come from
The four tutorials above mirror the starter templates under D:\PowerProjects\PowerSolver\timefold-templates\sequence\. Each starter.json is a working §5bis spec you can POST directly to /api/solve. Use them as starting points for your own problems.