new

improved

fixed

Timefold Platform

Employee Shift Scheduling

Field Service Routing

Pickup & Delivery Routing

Notifications, per-rule contract weights and absence-aware rolling windows (ESS), and more

Today, we're announcing version v1.13 of the Timefold Platform and updates to the Timefold models.
This new version of the Timefold Platform comes with these platform improvements:
  • Introducing Notifications: get notified when a dataset or experiment changes status
    : Notifications replace the previous Webhooks feature as the way to stay informed about dataset and experiment activity. A trigger watches for a dataset or experiment status change and sends a message to one or more channels (a Slack channel, a webhook, or an email address) whenever a matching event occurs. Create a channel once and reuse it across as many triggers as you like. Beyond adding Slack and email as delivery channels alongside webhooks, Notifications also let you trigger on experiment status changes, filter by dataset or experiment name and tags, and review every delivery in a dedicated Logs tab. The Logs tab shows each delivery's status and any error message, and lets you retry a failed delivery. We've automatically migrated your existing webhooks into webhook channels and triggers, so you don't need to set them up again. The Webhooks pages stay available as read-only, so you can still see your original configuration and past logs. See Notifications for more details.
  • More consistent number formatting in comparisons
    : Number formatting in dataset comparisons is more consistent: numbers without a metric type, such as calculation metrics and configuration values, are now formatted and aligned as numbers instead of as plain text. See Comparisons for more details.
  • Solve queue memory limit covers all solving and queued datasets
    : The solve queue's memory limit now works like its thread limit: it covers the combined memory of all solving and queued datasets, not only the dataset you're submitting. See Queue limits for more details.
  • Accept invites to another tenant
    : If you already belong to a tenant, you can now accept an invite to join a different one.
Next to that, this new version of the Timefold Platform comes with updates to these Timefold Models:
  • Customizable weight for each contract rule
    : Timefold already lets you tune how much a violation counts at two levels: a global constraint weight (configured under
    config.model.overrides
    ) scales an entire constraint type across the whole model, and a contract's
    priority
    scales every rule in that contract uniformly, relative to other contracts. Contract rules can now add a third, more granular level underneath both: a
    weight
    on the rule itself, which scales only that one rule's penalty relative to the other rules in the same contract, without changing the contract's priority or the constraint's global weight. This makes it possible to express, for example, that pulling an employee away from a booked vacation is far worse than any other preference violation for that employee. The
    weight
    is supported on several types of rules. See the Employee Shift Scheduling changelog for more details.
  • Absence-aware consecutive days off in a rolling window (preview)
    : Rolling window rules with a
    consecutiveDaysOffLimit
    now support the
    absenceMode
    field. When set to
    ABSENCE_AWARE
    , the effective
    consecutiveDaysOffMin
    is scaled down for each employee based on the fraction of the rolling window for which the employee is available, then rounded up to the nearest whole minute, the same way
    consecutiveMinutesOffMin
    is scaled. Days the employee is fully unavailable are also excluded from counting as days off, so an absence is never itself counted as satisfying the (now-scaled) limit. See Consecutive days off in a rolling window and the Employee Shift Scheduling changelog for more details.
  • Absence-aware consecutive minutes off in a rolling window (preview)
    : Rolling window rules with a
    consecutiveMinutesOffLimit
    now support the
    absenceMode
    field. When set to
    ABSENCE_AWARE
    , the effective
    consecutiveMinutesOffMin
    (including
    consecutiveMinutesOffMinIntervals
    and
    totalConsecutiveMinutesOffMin
    ) is scaled down for each employee based on the fraction of the rolling window for which the employee is available, then rounded up, so employees who are partly unavailable during a rolling window aren't held to the full configured minimum for the hours they weren't scheduled to work anyway. See Consecutive minutes off in a rolling window and the Employee Shift Scheduling changelog for more details.
  • Scope shift sequences to a continuation tag
    :
    sequenceDefinition
    in
    consecutiveShiftsWorkedRules
    now supports an optional
    continuationTag
    . When set, only shifts carrying this tag extend a sequence's reach. A shift without the tag is still included if it already falls within a preceding shift's reach, but it doesn't extend that reach any further. This lets you build sequences that keep chaining through untagged shifts without letting those shifts stretch the sequence indefinitely. See Scope sequence continuation with a tag and the Employee Shift Scheduling changelog for more details.
  • Accurate day-counting for shifts ending exactly at midnight
    : Shifts ending exactly at midnight were sometimes counted as covering an extra day the employee never worked, causing period rules, consecutive-days-worked rules, and days-worked rolling-window rules to disagree on how many days a shift counted toward. See period rules, consecutive-days-worked rules, and days-worked rolling-window rules for more details.
  • Catch visits that can never be assigned due to impossible time windows
    : Input validation now raises a
    VISIT_TIME_WINDOWS_OUTSIDE_ALL_VEHICLE_SHIFTS
    warning when none of a visit's time windows overlaps any vehicle shift. Such a visit can never be assigned, whatever else the input says, so it silently ends up unassigned and adds an unexplained penalty to the score. This most often happens when a visit's time window closed before the planning window opened, or when a visit falls on a day that no vehicle works. The check only asks whether some vehicle shift is open during the visit's time windows. It does not look at skills, tags, areas, or travel time, because the other reasons a visit cannot be assigned have their own warnings. A time window that touches a shift boundary counts as covered. See Input validation for more details.
  • Minor visualization fixes
    : A few minor visualization issues have been fixed, including incorrect handling of special characters in identifiers, which caused the visualization to crash on such datasets.
  • Fixed swapped IDs in the required coverage area justification
    : The justification for the
    No visits outside coverage area
    constraint previously swapped the visit ID and the vehicle shift ID, so its description named the wrong visit and shift. The justification now reports both IDs correctly. See [
    No visits outside coverage area
    ](https://docs.timefold.ai/field-service-routing/latest/vehicle-resource-constraints/coverage-area) for more details.
  • Fixed a crash in visit group recommendations for visits with dependencies
    : Requesting visit group recommendations could throw a
    NullPointerException
    when a candidate placement's neighboring visit had an unresolved schedule, for example when visit dependencies formed a cycle mid-search. Such a placement is now rejected instead of crashing the request. See visit group recommendations for more details.
  • Added missing justification types to the API specification
    : The OpenAPI schema for
    VehicleRouteJustification
    previously omitted several justification types that the model already returned, including the preferred area, preferred time window, mutually exclusive shifts, visit dependency pooling type, and SLA end time justifications. These are now included in the schema, so generated client code and other tooling that reads the API specification can discover and parse them. See API specification for more details.
  • Mandatory and optional job input metrics
    : The input metrics now include
    mandatoryJobs
    and
    optionalJobs
    , breaking down the total number of jobs by whether they are mandatory or optional. This makes it easier to verify that the input dataset contains the expected mix of mandatory and optional jobs. See input metrics for more details.
  • Minor visualization fixes
    : We fixed a few minor issues in the visualization, mainly related to incorrect handling of special characters in identifiers. The visualization no longer crashes on such datasets, nor when running embedded in Timefold Platform. See visualization for more details.
  • Clearer maximum time burden violation messages
    : We updated the justification for the maximum time burden to show a clearer message for a constraint violation, stating the actual time burden and by how much it exceeds the allowed maximum. See maximum time burden for more details.
Please let us know if you have feedback.