PowerSolver Docs
Back to Wizard

PowerSolver 2.0 Wizard User Guide

This guide walks you through every screen of the Planning Wizard with detailed explanations, tips, and troubleshooting.

2.0 changes: The 1.x "Time Grain" toggle in Step 1 is now Sequence Mode. Step 3 has a new Sequence Configuration card (host-fact picker + derived-shadow table). Step 7 emits the §5bis JSON shape. 1.x saved sessions cannot be loaded — re-author through the wizard. The full markdown source for this page lives at ../WIZARD_USER_GUIDE.md.


Overview

The Planning Wizard has an optional AI front door (Step 0) plus 7 authoring steps:

┌──────────────────────────────────────────────────────────────────────────────────┐
│  Step 0    Step 1    Step 2    Step 3    Step 4    Step 5    Step 6    Step 7    │
│  AI        Define    List      Define    Define    Pinned    Solver    Review    │
│  Intake    Problem   Entities  Values    Rules     Assign    Settings  & Solve   │
└──────────────────────────────────────────────────────────────────────────────────┘
Step Title Purpose Required?
0AI IntakeDescribe the problem in plain language; PowerAI generates a full §5bis spec that pre-fills Steps 1–7❌ Optional
1Define Your ProblemProblem type + Sequence Mode toggle✅ Yes
2What Needs Scheduling?Enter your entities (tasks, shifts, etc.)✅ Yes
3Who or What Can Do It?Enter your hosts/values + §5bis sequence config✅ Yes
4What Are Your Rules?Define constraints✅ Yes
5Any Pre-Decisions?Lock specific assignments❌ Optional
6How Long Should We Search?Configure solver timeout✅ Yes
7Review & Validate JSONFinal check and solve✅ Yes

Getting Started

Login Screen

Screenshot: Login Screen
Field Description
UsernameYour PowerSolver username
PasswordYour password

After logging in, you'll see the main dashboard.

Main Dashboard

Screenshot: Main Dashboard

The dashboard shows:

Element Description
Open Wizard buttonStart a new problem or continue editing
JSON Preview panelShows your current problem configuration
AI Configuration sidebarSelect AI provider and model
File Operations sidebarSave/load problem files

Sidebar Controls

Screenshot: Sidebar
Control What It Does
File NameName your problem file
AI Provider dropdownSelect DeepSeek, Groq, etc.
AI Model dropdownSelect the AI model
API Key StatusShows if AI is configured
Dark Mode toggleSwitch light/dark theme

Step 0: AI Intake — the cornerstone of the AI integration

Step 0 is the GenAI front door to the entire wizard. Instead of hand-authoring entities, variables, shadows, and constraints across Steps 1–6, you describe your problem in plain business language and PowerAI generates a complete §5bis specification. The wizard loads that spec into Steps 1–7 where you review and refine every field before solving. It is optional — skip it to author manually from Step 1 — but for most users it is the fastest path from "I have a scheduling problem" to "I have a solved schedule".

How it works end-to-end

You answer 5 questions
        │
        ▼
Each answer → PowerAI validates it (HITL) → shows you its interpretation → you confirm
        │
        ▼  (all required answers confirmed)
Click "Generate" → PowerAI runs the generation pipeline
        │              (generation_intent → generation_spec → validate → repair)
        ▼
PowerAI returns a §5bis JSON spec
        │
        ▼
Wizard imports it via importProblem() → Steps 1–7 are pre-filled
        │
        ▼
You review / edit any field, then Solve in Step 7

The 5 intake questions

The intake form asks five qualitative questions. Each builds context for the next — PowerAI sees your earlier confirmed answers when interpreting later ones.

# Question What to put here Required?
1Describe your planning or scheduling problemThe business context — the organisation, the people/things involved, what makes it challenging.✅ Yes
2What are the things being scheduled or assigned?Your entities — tasks, orders, lessons, shifts, jobs, customer visits. Include key properties (duration, priority, skill level, location).✅ Yes
3What resources or slots can they be assigned to?Your hosts — employees, machines, vehicles, crews, rooms. Include their properties (start time, capacity, skills).✅ Yes
4What rules and preferences must be respected?The constraints. Spell out HARD rules (must never break) vs SOFT preferences. PowerAI maps your wording directly onto constraint type.✅ Yes
5Any additional requirements?Problem-type hints, solver timeout, pre-assigned items, business-specific logic.❌ Optional

Write naturally. Numbers help ("45 nurses", "50 shifts per week") — PowerAI's validators check that the generated spec contains the counts you stated.

Human-in-the-Loop (HITL) validation

This is the part that makes Step 0 trustworthy. You do not answer all five questions then hope. Instead:

  1. You answer one question and click Validate.
  2. PowerAI reads your answer (plus all previously-confirmed answers as context) and presents its interpretation back to you — a short summary of what it understood.
  3. You either confirm (the answer locks, a green check appears, the next question unlocks) or edit and re-validate.
  4. Repeat until all required questions are confirmed.

Questions you haven't reached yet are locked (greyed out). Confirmed answers collapse into compact green cards with an edit pencil — click it to reopen and re-validate any earlier answer. By the time you click Generate, PowerAI has already shown you — and you've already approved — its understanding of every input. No surprises in the generated spec.

Choosing the AI provider and model

A provider/model picker sits near the top of Step 0:

  • AI Provider dropdown — lists every provider with an API key configured in PowerAI Admin (OpenAI, Anthropic, DeepSeek, Groq).
  • Model dropdown — the models available for the selected provider; the configured default is marked (default).

If no provider is configured, the picker shows a warning linking to PowerAI Admin. The header badge shows the active provider/model pair once loaded. You can change provider/model any time before clicking Generate.

Generate

Once all required questions show green checks, the Generate button enables. Clicking it:

  1. Sends your confirmed intake context + chosen model to PowerAI's /ai/generate endpoint.
  2. PowerAI runs its multi-agent generation pipeline (intent extraction → spec generation → deterministic schema validation → LLM repair if validation fails).
  3. A progress bar tracks the pipeline stages live (streamed via Server-Sent Events).
  4. On success, the resulting §5bis JSON is imported into the wizard store — Steps 1–7 are now populated.
  5. The wizard advances you to Step 1 so you can review.

Long-running generation and recovery

Generation can take 30–90 seconds depending on model and problem complexity. The wizard handles this gracefully:

  • The job id is stored in sessionStorage while generation runs.
  • If you close the tab or refresh mid-generation, Step 0 detects the pending job on reload and resumes tracking it (or recovers a completed result). Pending jobs older than 30 minutes are discarded.
  • If generation fails, Step 0 shows a clear error and you can retry — your confirmed answers are preserved.

What PowerAI generates

PowerAI's 2.0 prompts emit only the §5bis shape: collections with your hosts and entities, a list variable wiring them together, the previous + host built-in shadows, the canonical startTime / endTime derived shadows, and unassigned_count (hard) + minimize_property (soft) constraints.

PowerAI will never emit 1.x constructs (chained, schedulingPattern: TIME_GRAIN, timeGrainConfig, valueRanges). If the LLM slips, PowerAI's generation_repair agent catches it and corrects before the spec reaches the wizard.

After import — you are still in control

The generated spec is a starting point, not a final answer. Every field lands in Steps 1–7 as editable wizard state:

  • Step 1 — the problem type and sequence-mode toggle PowerAI inferred
  • Step 2 — the entities it extracted, with their properties
  • Step 3 — the hosts and the §5bis sequence configuration
  • Step 4 — the constraints it mapped from your rules description
  • Steps 5–6 — pinned assignments and solver config
  • Step 7 — the full JSON ready to review and Solve

Walk through each step. Adjust anything PowerAI got wrong. The HITL validation makes big misunderstandings rare, but the entity counts, property values, and constraint weights are all worth a human eye before solving.

Returning to Step 0

Click the "AI-Assisted Setup" entry in the wizard header to return to Step 0 at any time. Re-running intake replaces the current wizard state — if you've made manual edits in Steps 1–7, export them first (Step 7 → Download) so you don't lose work.

When to skip Step 0

Skip straight to Step 1 and author manually when:

  • You already have a §5bis JSON file — use the header's Open button to import it directly.
  • Your problem is tiny (2–3 entities) — manual entry is faster than describing it.
  • You're iterating on a known problem and only changing a few values.
  • No AI provider is configured in PowerAI Admin.

Step 1: Define Your Problem

Screenshot: Step 1 Modal

Purpose

Tell PowerSolver what kind of problem you're solving. This step configures the wizard for your specific use case.

Fields

Field Required Description Example
Problem Statement✅ Yes1-2 sentences describing your problem"I need to assign 20 development tasks to 5 developers over a 2-week sprint"
Success Criteria✅ YesWhat makes a solution "good""All tasks assigned, skills matched, workload balanced, deadlines met"
Problem Type✅ YesSelect from dropdownTask Assignment

Problem Type Options

Type Icon Best For
Vehicle Routing🚚Delivery routes, field service — Uses LIST variables
Employee Rostering📅Staff scheduling, shift planning — Uses BASIC variables
Task Assignment📋Project tasks, work orders — Uses BASIC variables
Maintenance Scheduling🔧Equipment maintenance — Uses BASIC variables
School Timetabling🎓Class schedules — Uses BASIC variables
Cloud Optimization☁️Server/resource allocation — Uses BASIC variables
Conference Scheduling🎤Event sessions — Uses BASIC variables
Job-Shop Scheduling⚙️Manufacturing jobs — Uses BASIC variables
Generic (Custom)🔧Custom problems — Configure manually

Problem Type Info Card

When you select a problem type, an info card appears showing:

  • Description of the problem type
  • Examples of typical use cases
  • Entity label (what you'll call your entities)
  • Value label (what you'll call your values)

Buttons

Button Action
CancelClose wizard without saving
SaveSave current step and stay
NextSave and proceed to Step 2

Tips

  • Be specific in your problem statement — the AI advisor uses this to give better suggestions
  • If unsure which problem type to choose, start with "Generic (Custom)"
  • Your problem statement and success criteria are saved but don't affect the solver directly

Common Issues

Issue Cause Solution
"Please fill in all required fields" warningMissing fieldFill in all three fields
Wrong problem type selectedMisunderstandingReview problem type descriptions

Understanding "Consecutive on a host"

This is the setting that turns the wizard from a basic assignment tool ("Task A goes to Alice") into a real scheduler ("Task A goes to Alice from 09:00 to 09:30, then Task B from 09:30 to 10:15"). This subsection walks through what actually happens once you flip it on, using a small example you can paste into the wizard.

What you provide, and what PowerSolver fills in

When you turn on "Consecutive on a host", you describe a small handful of facts:

  • The people, vehicles, or crews doing the work. For each one, you give the time their day begins (e.g. Alice starts at 09:00).
  • The things being done. For each one, you give how long it takes (e.g. Login API takes 30 minutes).

That's it. You never type a start time for any task — only for the people. So how does the schedule know when each task starts?

PowerSolver fills it in. The moment it decides "Login API goes first on Alice's queue", it can compute:

  • Login API's start time = Alice's start-of-day = 09:00.
  • Login API's end time = its start + its duration = 09:00 + 30 min = 09:30.

And the moment it decides "Mobile shell goes after Login API on Alice's queue", it can compute:

  • Mobile shell's start time = whatever the previous task on Alice's queue ended at = 09:30.
  • Mobile shell's end time = 09:30 + 45 min = 10:15.

These auto-computed answers — the task's start time, its end time, the person it landed on, the task right before it in the queue — are called shadow variables. You see them on the Solution and Insights pages. You never enter them; they fall out of the placement PowerSolver chose.

The name "shadow" is meant literally: these values follow the schedule around. The instant PowerSolver moves a task from Alice to Bob, every shadow value attached to that task updates by itself — its host changes, its start time changes, the task before it changes — without you having to do anything.

Two kinds you'll see in Step 3

  • The bookkeeping ones — which person is this task on?, which task is right before me? — are called built-in shadows. PowerSolver provides them for free as soon as you turn on "Consecutive on a host". You never write them.
  • The two with a formula — startTime and endTime — are called derived shadows. They use the formulas you saw above: previous task's end time (or the person's start-of-day if I'm first), and my start + my duration. Click Apply default template in Step 3 once and both are set. For most scheduling problems you never touch them again.
If your problem needs something exotic — cumulative load along a delivery route, a custom time-window penalty — see Shadow Variables in the Concepts Guide. The wizard's UI for editing custom formulas is intentionally minimal in this release.

Worked example — 3 tasks, 2 developers

The inputs below match the shape of powersolver-template/task-assignment/1-variable.problem.json — you can import that file in the wizard to follow along live.

Tasks:

TaskPriorityDuration
Login API1 (critical)30 m
DB Schema21 h
Mobile shell345 m

Developers (both start their working day at 09:00 on 1 June 2026):

DeveloperstartTime
Alice2026-06-01T09:00
Bob2026-06-01T09:00

One feasible placement the solver might pick:

  • Alice's queue: Login API → Mobile shell
  • Bob's queue: DB Schema

The shadow values that come out of that placement:

EntityhostpreviousstartTime (computed)endTime (computed)
Login APIAlicehost.startTime = 09:0009:00 + 30m = 09:30
Mobile shellAliceLogin APIprevious.endTime = 09:3009:30 + 45m = 10:15
DB SchemaBobhost.startTime = 09:0009:00 + 1h = 10:00

Or as a tiny timeline:

              09:00     09:30           10:15
   Alice      │ Login API │ Mobile shell    │
              09:00              10:00
   Bob        │ DB Schema             │

Every value in the last two columns was computed by the derived shadows — you didn't write a scheduler, you wrote two one-line expressions.

Why order matters

If the solver instead picked Alice's queue: Mobile shell → Login API, the shadows would say:

EntitystartTimeendTime
Mobile shell09:0009:45
Login API09:4510:15

Same makespan on Alice's queue, but Login API (priority 1 = critical) now starts at 09:45 instead of 09:00. That's why PowerSolver's default soft constraint targets a derived shadow called priorityCost (= position × (C − priority)): order is a real degree of freedom and the constraint guides the solver to put the highest-priority work at position 1 on each queue.

When not to use sequence mode

If your entities have no inherent order or duration — e.g. "assign this lesson to a room", with no back-to-back relationship between lessons — leave Sequence Mode off and use a basic variable instead. Sequence mode is for problems where what comes before me matters.


Step 2: What Needs Scheduling? (Entities)

Screenshot: Step 2 Modal

Purpose

Enter the items that need to be assigned or scheduled. These are your planning entities.

Understanding Entities

Problem Type Entities Are... Examples
Task AssignmentTasks to complete"Design homepage", "Fix bug #123"
Employee RosteringNurses/employees to schedule"Sarah Mitchell", "James Chen"
School TimetablingLessons to schedule"Math 101", "Physics Lab"
Maintenance SchedulingJobs to perform"Motor inspection", "Oil change"
Vehicle RoutingVehicles to route"Truck 1", "Van 2"

The Entity Cards Interface

Screenshot: Entity Cards

Each entity appears as a card with:

  • ID (required) — Unique identifier
  • Name (required) — Human-readable description
  • Properties — Additional fields based on problem type

Adding Entities

Method 1: Add One at a Time

  1. Click "Add Item" button
  2. Fill in the card fields
  3. Click ✓ to save or ✗ to cancel

Method 2: Import from File

  1. Click "Import from File" button
  2. Select Excel (.xlsx), CSV, or JSON file
  3. Map your columns to PowerSolver fields
  4. Review preview and click "Import Items"

Entity Properties

Property Used By Description Format
IDAllUnique identifierText (e.g., "TASK-001")
NameAllHuman-readable nameText
Durationcost, timeHow long it takesNumber (hours)
SkillsskillRequired skillsComma-separated (e.g., "java, react")
PriorityDisplayImportance levelhigh, medium, low
DeadlinetimeMust complete byDateTime
Start TimetimeEarliest startDateTime
End TimetimeLatest endDateTime

Custom Properties

In addition to standard properties, PowerSolver supports custom properties for domain-specific data.

Automatic Detection: When you load a JSON file, the wizard automatically detects custom properties and creates input fields for them.

How Custom Properties Work

  1. Detection: Custom properties in your JSON are auto-detected
  2. Display: New fields are created for each custom property
  3. Editing: Edit custom property values just like standard fields
  4. Preservation: Custom properties are saved and exported correctly

Examples by Domain

Domain Custom Entity Properties Used For
Cloud ComputingrequiredResourceType, cpuRequired, memoryRequiredResource matching
ManufacturingmachineType, toolingRequired, batchSizeMachine assignment
HealthcarepatientType, certificationRequiredStaff matching
LogisticspackageType, temperatureControlVehicle assignment
Important: Custom properties only affect the solver if you create constraints that reference them in Step 4.

Card Actions

Icon Action
✏️Edit card
🗑️Delete card
↕️Drag to reorder
🔒Toggle pinned status

Pinned Assignments (Preview)

Check the 🔒 Pinned checkbox and select a value in "Pre-Assign To" to lock an assignment. The solver will not change pinned assignments.

Common Issues

Issue Cause Solution
"Please add at least one item"No entitiesAdd at least one entity
Duplicate ID warningSame ID used twiceUse unique IDs
Import failsWrong file formatUse .xlsx, .csv, or .json
Missing required columnColumn mapping wrongRe-map columns in import dialog

Step 3: Who or What Can Do It? (Values)

Screenshot: Step 3 Modal

Purpose

Enter the resources that entities can be assigned to. These are your planning values.

Understanding Values and Variables

PowerSolver supports 1-4 value ranges (planning variables):

Variables Example Value Ranges
1 variableDevelopers
2 variablesDevelopers + Time Slots
3 variablesDevelopers + Time Slots + Rooms
4 variablesDevelopers + Time Slots + Rooms + Equipment

Each value range appears as a separate tab or section.

Value Properties

Property Used By Description Format
IDAllUnique identifierText
NameAllHuman-readable nameText
SkillsskillWhat this resource can doComma-separated
CapacitycapacityMaximum workloadNumber
AvailabilitytimeWhen availableDateTime range
Hourly RatecostCost per hourNumber
Start TimetimeAvailable fromDateTime
End TimetimeAvailable untilDateTime

Custom Properties on Values

Values also support custom properties that define their capabilities:

Domain Custom Value Properties Purpose
Cloud ComputingresourceTypes, cpuCores, memoryGB, gpuCountServer capabilities
ManufacturingmachineCapabilities, toolsAvailableMachine specs
Healthcarecertifications, specializationsStaff qualifications
LogisticsvehicleCapacity, hasRefrigerationVehicle capabilities

Matching Entity and Value Properties

Custom properties create a matching relationship:

Entity (Workload):                    Value (Server):
├── requiredResourceType: "gpu"  ←→  resourceTypes: ["gpu", "cpu"]
├── cpuRequired: 16              ←→  cpuCores: 32
└── memoryRequired: 64           ←→  memoryGB: 128
Important: Property names must exactly match what you configure in Step 4 constraints.

Tips

  • Ensure value skills cover all entity requirements
  • Set realistic capacity values
  • For time slots, ensure you have enough to cover all entities

Common Issues

Issue Cause Solution
"Please add at least one resource"No valuesAdd values to each variable
Skill mismatch laterValues lack required skillsAdd skills that entities need
Not enough valuesToo few optionsAdd more values

Step 4: What Are Your Rules? (Constraints)

Screenshot: Step 4 Modal

Purpose

Define the rules your solution must follow. These are your constraints.

Constraint Levels

Tab Level Color Meaning
Hard ConstraintsHard🔴 RedMust be satisfied — violations make solution invalid
Medium ConstraintsMedium🟡 YellowShould be satisfied — significant penalty
Soft ConstraintsSoft🟢 GreenNice to have — minor penalty

Adding Constraints

  1. Click the appropriate tab (Hard/Medium/Soft)
  2. Click "Add Constraint"
  3. Fill in the constraint form:
Field Description
NameDescriptive name (e.g., "Skill Match")
RuleSelect constraint rule type
Target VariableWhich variable this applies to
WeightHow important (higher = more important)
DescriptionOptional explanation

Available Constraint Rules

Rule What It Does Required Properties
unassignedPenalize unassigned entitiesNone
skillMatch required skillsEntity: skills, Value: skills
capacityDon't exceed capacityValue: capacity
costMinimize total costEntity: duration, Value: hourlyRate
balanceDistribute workload evenlyNone
timeRespect time windowsEntity: deadline, Value: availability
no_conflictPrevent overlapping assignmentsUses timeslot variable
availabilityRespect availabilityValue: availability
preferenceHonor preferencesEntity: preferred[Variable]

Configuring Constraints with Custom Properties

When using custom properties (defined in Steps 2 and 3), you need to tell the constraint which property names to use:

Skill Constraint with Custom Properties

For the skill rule, expand the constraint card to see additional fields:

Field Description Example
Entity Skills PropertyProperty name on entity containing required skillsrequiredResourceType
Value Skills PropertyProperty name on value containing available skillsresourceTypes

Example Configuration

Name: Resource Type Match
Rule: skill
Target Variable: server
Entity Skills Property: requiredResourceType
Value Skills Property: resourceTypes
Weight: 10

This constraint ensures entities with requiredResourceType: "gpu" are only assigned to values where resourceTypes contains "gpu".

Constraint Property Reference

Constraint Entity Property Field Value Property Field
skillentitySkillsPropertyvalueSkillsProperty
capacitydemandPropertycapacityProperty
costdurationPropertyrateProperty
distanceentityLocationPropertyvalueLocationProperty
preferenceentityPreferencePropertyvaluePreferenceProperty
Important: Property names are case-sensitive and must exactly match your data.

Weight Guidelines

Weight When to Use
1-10Low priority within level
10-100Normal priority
100-1000High priority
1000+Critical (consider making hard)

Tips

  • Start with hard constraints (must-haves)
  • Add unassigned constraint to ensure all entities get assigned
  • Use weights to prioritize within the same level
  • Test with fewer constraints first, then add more

Common Issues

Issue Cause Solution
"Please add at least one rule"No constraintsAdd at least one constraint
Missing targetVariableId errorConstraint not configuredSelect target variable
Solution always infeasibleToo many hard constraintsConvert some to medium/soft

Step 5: Any Pre-Decisions? (Pinned Assignments)

Screenshot: Step 5 Modal

Purpose

Review and manage pinned assignments — entities that are already assigned and should not be changed by the solver.

When to Use Pinning

Scenario Example
Confirmed assignments"Sarah is already confirmed for Monday shift"
Partial re-optimization"Keep existing assignments, just fill gaps"
Specific requirements"Task X must go to Alice"
Testing"Lock this assignment and see what happens"

How Pinning Works

  1. In Step 2: Check the 🔒 Pinned checkbox on an entity card
  2. In Step 2: Select the pre-assigned value
  3. In Step 5: Review all pinned assignments

The solver will never change a pinned assignment.

Tips

  • Only pin what's truly fixed
  • Too many pins limit solver flexibility
  • Check that pins don't conflict with hard constraints

Common Issues

Issue Cause Solution
Pinned assignment causes infeasibilityPin conflicts with constraintUnpin or adjust constraints
Can't find entity to pinNot marked in Step 2Go back to Step 2 and mark as pinned

Step 6: How Long Should We Search? (Solver Settings)

Screenshot: Step 6 Modal

Purpose

Configure how long the solver should run and other optimization settings.

Time Presets

Preset Icon Timeout Best For
Quick30 secTesting, small problems
Standard⏱️120 secMost problems
Thorough🔍300 secComplex problems, best results
Custom⚙️You chooseSpecific requirements

Problem Size Summary

The wizard shows a summary of your problem:

Entities: 20 tasks
Values: 6 developers × 10 timeslots
Constraints: 5 hard, 3 soft
Recommended timeout: 120 seconds

Custom Time Setting

If you select Custom:

  1. Use the slider to set timeout (10-600 seconds)
  2. Or type a specific value in the input box
  3. Maximum: 3600 seconds (1 hour)

Timeout Guidelines

Problem Size Entities Recommended
Small< 2030 seconds
Medium20-10060-120 seconds
Large100-500180-300 seconds
Very Large500+300-600 seconds

Tips

  • Longer timeouts generally produce better solutions
  • Diminishing returns after a certain point
  • Start with Standard, adjust based on results
  • For testing, use Quick to verify setup

Common Issues

Issue Cause Solution
"Please set a valid timeout"Invalid valueSet timeout between 10-3600
Solver times out with poor solutionTimeout too shortIncrease timeout
Solver runs too longTimeout too longReduce timeout

Step 7: Review & Validate JSON

Screenshot: Step 7 Modal

Purpose

Final review of your problem configuration. Validate, optionally improve with AI, and solve.

The JSON Editor

The large text area shows your complete problem as JSON. You can:

  • Review the configuration
  • Make manual edits if needed
  • Copy the JSON for external use

Validation

Click "Validate JSON" to check for errors:

Result Indicator Meaning
✅ ValidGreen "Success" alertReady to solve
❌ InvalidRed "Error" alertFix errors before solving

Common Validation Errors

Error Cause Fix
"collection X is empty"No items in a collectionAdd entries in Step 2 / Step 3
"variable X: on Y is not a known collection"Variable references missing collectionAdd the collection in Step 3
"variables array is required"Problem type issueCheck Step 1
"Invalid JSON syntax"Manual edit errorFix JSON syntax
"spec uses 1.x valueRanges/entities/chained"Imported a v1 fileRe-author through wizard — no auto-conversion in 2.0
"derivedShadow X: expression references Y with no known root prefix"Missing this./previous./host. prefixAdd the prefix in Step 3's Sequence config
"LIST variable has no hard unassigned_count constraint"Solver would return empty solutionAdd constraint in Step 4

AI Improvement Feature

Click "Improve with AI" to get AI-powered suggestions:

  1. AI analyzes your problem
  2. Shows loading indicator while processing
  3. Displays improvement suggestions
  4. Shows improved JSON for comparison
Button Action
Apply ImprovementsUse AI suggestions
DiscardKeep original
Save AI ImprovementDownload AI version
Reset to OriginalUndo AI changes

Solving from Step 7

After validation succeeds, you can:

  1. Click "Done" to close the wizard
  2. On the main dashboard, click "Solve" button
  3. Or use the API to submit the problem

Solution View

Screenshot: Solution View

After solving, view your results:

Solution Summary

Field Description
Job IDUnique identifier for this solve
StatusSOLVING, COMPLETED, FAILED
ScoreSolution quality (e.g., "0hard / -50soft")
DurationHow long solving took

Score Interpretation

Score: 0hard / -2medium / -450soft
       │        │          │
       │        │          └── Soft penalties (lower is better)
       │        └── Medium violations
       └── Hard violations (must be 0!)
Score Component Meaning
0hard✅ Solution is valid (feasible)
-Xhard❌ Solution is invalid — X hard violations
-YmediumY medium constraint penalties
-ZsoftZ soft constraint penalties

Export Options

Format Button Use For
JSON"Copy JSON"Integration with other systems
Excel"Export to Excel"Sharing with stakeholders

§5bis Sequence Configuration

When you flipped Sequence Mode on in Step 1, Step 3 shows a Sequence Configuration card with the host-fact picker, the derived-shadow table, and the Apply default template action. This card replaces the 1.x "Time Grain" configuration and Domain Attributes Registry panels.

Host-fact picker

The dropdown lists every variable in Step 3 with assignment type = list. Whichever you pick becomes the host collection — the items that OWN the ordered sequences. Most problems have exactly one list variable (auto-selected).

Apply default template

One click seeds the canonical §5bis derived-shadow pair on the entity collection:

{"name": "startTime",
 "sources": ["previous.endTime", "host.startTime"],
 "expression": "previous?.endTime ?? host.startTime"}

{"name": "endTime",
 "sources": ["startTime", "this.duration"],
 "expression": "startTime + this.duration"}

That pair computes back-to-back start and end times for every entity. The host needs a startTime property (e.g. 2026-06-01T08:00:00); each entity needs a duration property (ISO-8601 string like PT30M). Apply it once after enabling Sequence Mode — for most scheduling problems no further configuration is needed. What this actually does in practice → see Understanding "Consecutive on a host" in Step 1 for the worked example.

The derived-shadow table

Lists the currently registered derived shadows on the entity collection — name, expression, sources. Editing individual derived shadows in the UI is intentionally minimal in this release; for custom expressions (cumulative load, distance, custom time windows) edit the JSON in Step 7 or POST a §5bis spec directly to /api/solve.

What happened to Time Grain and Domain Attributes?

1.x had a TimeGrainConfig block (grain size, planning window) and a Domain Attributes Registry for typed properties. Both are removed in 2.0:

  • Time Grain is replaced by derived shadows. startTime and endTime are real LocalDateTime values computed per entity from the host's start time + the entity's duration. No fixed time-slot grid; no grain-size configuration.
  • Domain Attributes Registry was a 1.x typing layer. The 2.0 model uses each derived shadow's sources array as the structured contract — the solver knows which properties matter because the expressions declare them. Custom properties still work (any key in an entity's properties bag) but there is no separate registry UI.

Progress Indicator

The step indicator at the top of each modal shows your progress:

[Step 1] ─ [Step 2] ─ [Step 3] ─ [Step 4] ─ [Step 5] ─ [Step 6] ─ [Step 7]
   ●          ●          ○          ○          ○          ○          ○
completed  active    upcoming
State Appearance
CompletedFilled circle, checkmark
ActiveHighlighted, current step
UpcomingEmpty circle

Saving Your Work

Your work is saved when you:

  • Click "Save" on any step
  • Click "Next" to proceed
  • The wizard auto-saves periodically

Going Back

You can always go back to previous steps:

  • Click "Previous" button
  • Click on a completed step in the progress indicator

Keyboard Shortcuts

Shortcut Action
EnterConfirm / Next
EscapeCancel / Close
Ctrl+SSave

Troubleshooting

Wizard Won't Open

Cause Solution
Not logged inLog in first
Browser issueRefresh page
JavaScript disabledEnable JavaScript

Lost My Work

Cause Solution
Didn't saveUse browser back, may recover
Browser crashedCheck auto-save in local storage
Session expiredLog in again, reload saved file

AI Features Not Working

Cause Solution
No API keyConfigure API key in Admin
Wrong providerSelect correct AI provider
Network errorCheck internet connection

Validation Keeps Failing

Cause Solution
Missing required dataComplete all required steps
Invalid JSON syntaxCheck for typos in manual edits
Constraint errorsReview constraints in Step 4

Quick Reference

Step Summary

Step Required Input Minimum
1Problem statement, criteria, typeAll 3 fields
2EntitiesAt least 1 entity
3ValuesAt least 1 value per variable
4ConstraintsAt least 1 constraint
5Pinned assignmentsNone (optional)
6TimeoutValid number (10-3600)
7ValidationMust pass validation

Button Reference

Button Where Action
CancelStep 1Close without saving
PreviousSteps 2-7Go back one step
SaveAll stepsSave current step
NextSteps 1-6Save and proceed
DoneStep 7Close wizard
Validate JSONStep 7Check for errors
Improve with AIStep 7Get AI suggestions

Next Steps


Support