Project Scheduling Engine - Geneva

arun_vydianatha
ServiceNow Employee
ServiceNow Employee

Yay! Geneva is released . We are super excited about the upcoming changes in Project Management and the completely overhauled project scheduling engine in Geneva. This post describes the Project Scheduling Engine behavior in Geneva release.

Before going ahead if you have not read the Project Scheduling Engine Fuji post please do that now. The engine behavior in Eureka/Fuji as outlined in that post still holds good for Geneva. But Geneva comes with tons of new features and tweaks which I will walk through in this post. Plus Geneva   project scheduling engine is going to be a lot more performant than Fuji/Eureka.

The first big change in Geneva is the support for 4 new relation types

  • Finish to Start
  • Start to Start
  • Finish to Finish
  • Start to Finish

Let us go through each of these relations in details

Finish to Start

This was the only relation supported in Fuji. Now we support Finish to Start relation with lag and lead components.Let us see some examples at work

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-10 17:00:003 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-08 08:00:002015-09-08 17:00:001 daysProject

Now let us add an FS relation between Task 1 and Task 2.

ParentChildSub TypeLag
Task 1Task 2Finish to Start0

The result of adding the relation would be

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-11 17:00:004 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-11 08:00:002015-09-11 17:00:001 daysProject

The successor Task 2 is now starting after finish of predecessor Task 1. And finish of Project has been pushed out by one day and project duration is also increased by one day.Now let's see how it behaves with lag/lead. Suppose we add FS relation with lag of 1 day

ParentChildSub TypeLag
Task 1Task 2Finish to Start1 days

The result of adding the relation would be

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-14 17:00:005 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-14 08:00:002015-09-14 17:00:001 daysProject

Task 2 starts after finish of Task 1 with one day lag. Since 2015-09-12 is a Saturday — a holiday in our schedule the task gets pushed to 2015-09-14 (Monday) and ends the same day. The overall project duration is now 5 days.A negative lag means a lead. So if we want to start successor Task 2 with lead of 1 day, this could be done as follows

ParentChildSub TypeLag
Task 1Task 2Finish to Start-1 days

The result of adding the relation would be

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-10 17:00:003 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-10 08:00:002015-09-10 17:00:001 daysProject

The successor Task 2 now starts 1 day before finish of Task 1, hence it starts on the same day as Task 1 is finishing. Overall project end date or duration is not affected.

Start to Start

In a Start to Start relation, successor task can start on or after the predecessor starts. Again let us see some examples with the following project structure

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-10 17:00:003 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start On2015-09-10 08:00:002015-09-10 17:00:001 daysProject

Let us add a SS relation between Task 1 and Task 2.

ParentChildSub TypeLag
Task 1Task 2Start to Start0

The result would be

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-10 17:00:003 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-08 08:00:002015-09-08 17:00:001 daysProject

The start date of Task 2 gets pushed ahead to start with Task 1. Also note the time constraint of Task 2 also gets changed. The effect of adding a Relation on Time constraint is explained below.Now let us add a SS relation between Task 1 and Task 2 with a lead.

ParentChildSub TypeLag
Task 1Task 2Start to Start-1 day

The result would be

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-10 17:00:003 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-09 08:00:002015-09-09 17:00:001 daysProject

Task 2 now starts with a one day delay from start of Task 1.In the above example we will not be able to add Start to Start relation with a 1 day lag. If we add such a relation, start date of Task 2 would be pushed to 2015-09-07 and this date is before the Start date of the project and hence not supported. No task can start before the project start date.

Finish to Finish

In a Finish to Finish relation, successor task can finish only on or after the predecessor finishes. Let us see some examples with the following project structure

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-10 17:00:003 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-08 08:00:002015-09-08 17:00:001 daysProject

Let us add a FF relation between Task 1 and Task 2.

ParentChildSub TypeLag
Task 1Task 2Finish to Finish0

The result would be

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-10 17:00:003 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-10 08:00:002015-09-10 17:00:001 daysProject

The end date of Task 2 gets pushed to 2015-09-10 17:00:00, which is the end date of Task 1. And start date of Task 2 is recalculated accordingly.Let us add a FF relation between Task 1 and Task 2 with a lag of 1 day.

ParentChildSub TypeLag
Task 1Task 2Finish to Finish1 day

The result would be

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-10 17:00:003 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-09 08:00:002015-09-09 17:00:001 daysProject

The end date of Task 2 will be set to one day before the finish of Task 1. And start date of Task 2 will be adjusted accordingly.Let us add a FF relation between Task 1 and Task 2 with a lead of 1 day.

ParentChildSub TypeLag
Task 1Task 2Finish to Finish-1 day

The result would be

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-11 17:00:004 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-11 08:00:002015-09-11 17:00:001 daysProject

The end date of Task 2 will be set to one day after the finish of Task 1. And start date of Task 2 will be adjusted accordingly. The project also gets extended by one day with end date and duration of project getting changed.

Start to Finish

In a Start to Finish relation, predecessor must start on or before successor can finish.

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-10 17:00:003 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-08 08:00:002015-09-08 17:00:001 daysProject

Let us add a SF relation between Task 1 and Task 2.

ParentChildSub TypeLag
Task 1Task 2Start to Finish0

The result would be

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-11 17:00:003 days--
1.1Task 1Start ASAP2015-09-09 08:00:002015-09-11 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-08 08:00:002015-09-08 17:00:001 daysProject

When we add a Start to Finish between Task 1 and Task 2, Task 1 start date gets pushed to end date of Task 2. Since as per the schedule working hours end at 17:00:00, Task 1 starts at 2015-09-09 08:00:00 (the next working day). The project also gets extended by one day.Let us add a SF relation between Task 1 and Task 2 with a lag of 1 day.

ParentChildSub TypeLag
Task 1Task 2Start to Finish1 day

The result would be

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-14 17:00:003 days--
1.1Task 1Start ASAP2015-09-10 08:00:002015-09-14 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-08 08:00:002015-09-08 17:00:001 daysProject

When we add a Start to Finish between Task 1 and Task 2 with a lag of 1 day, Task 1 start date gets pushed to end date of Task 2 + 1 day. So Task 1 now starts on 2015-09-10 08:00:00 and ends on 2015-09-14 17:00:00. The project end date also extends.

Effect of Relation on Time Constraint

Any "Start on" task gets converted to "Start ASAP" task if the task is at the successor end of the relation (except in SF relation where predecessor get converted to "Start ASAP").

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-10 17:00:003 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ON2015-09-10 08:00:002015-09-10 17:00:001 daysProject

Adding a FS relation between Task 1 and Task 2 would result in conversion of Time constraint of Task 2 to Start ASAP.

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-11 17:00:004 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ASAP2015-09-11 08:00:002015-09-11 17:00:001 daysProject

Also the date of successor task would also be modified as per the relation constraints.

Retaining Start On tasks with their Start Dates

The scheduling engine gives flexibility to retain the constraint and lock-in the date/time of successor tasks while adding relation. For this you have to set the property "Retain start on constraint on tasks after adding relations" in Project > Preferences.Once the property is checked adding a relation would not modify the time constraint or start date of the successor task.In the above example adding the relation between Task 1 and Task 2 would result in no change on Task 2.

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-10 17:00:003 days--
1.1Task 1Start ASAP2015-09-08 08:00:002015-09-10 17:00:003 daysProject
1.2Task 2Start ON2015-09-10 08:00:002015-09-10 17:00:001 daysProject

Rollup of Project Start Date

By default the scheduling engine rollups the start date of project from project tasks. So Project Start date would always be the earliest task start date. But if you want the Project Scheduling engine to retain the Project Start date — after every recalculate — the property "Rollup project start date from tasks" should be unchecked under Project > Preferences.

Case "Rollup project start date from tasks" is true

Given a project

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project--2015-09-08 08:00:002015-09-08 17:00:001 days--

Add a task

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Task 1Start On2015-09-10 08:00:002015-09-10 17:00:001 daysProject

The project would be modified as

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-10 08:00:002015-09-10 17:00:001 days--

The project start date got rolled up from the task start date.

Case "Rollup project start date from tasks" is false

Given a project

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Project2015-09-08 08:00:002015-09-08 17:00:001 days--

Add a task

#TaskTime ConstraintPlanned StartPlanned EndPlanned DurationParent
1Task 1Start On2015-09-10 08:00:002015-09-10 17:00:001 daysProject

The project start date would not be modified in this case.

Automatic vs. Manual Projects

The calculation type field on project record decides if a Project is Manual or Automatic. For Automatic projects all the Project Scheduling rules mentioned here are applicable.For manual projects — only date rollups work. Adding relation to manual projects doesn't have any impact.Note: There is a change in behavior for Manual projects in Geneva compared to Fuji. In Fuji the scheduling engine is never invoked for manual projects and dates are not rolled up nor relations work. In Geneva we have enabled date rollups for manual projects.

Changing project start date

At any point of time the project start date can be changed and this would result in the following

  • All asap tasks starting on the Project start date will be move to the project start date
  • All start on tasks starting after the new project start date will be untouched
  • All start on tasks starting before the new project start date will be converted to asap tasks and their dates would be set to the new project start date.

Debugging the EngineHow do I know if the Project Scheduling Engine is running when I save my records?

Check the logs — we always print these messages in the log

ProjectLoader: Load project...139260e537230200af1326877e41f1d9

ProjectLoader: Load Project 139260e537230200af1326877e41f1d9 Complete! in - 00:00:00 : 17

ProjectAction: Applying actions and recalculating the Project...24c9442537230200af1326877e41f149

ProjectAction: Recalculation Complete!

ProjectDoSaveWithoutBRs: Saving the project...24c9442537230200af1326877e41f149

ProjectDoSaveWithoutBRs: Save project without BR Complete! 24c9442537230200af1326877e41f149 in   - 00:00:00 : 3

As the log indicates Engine works in a 3-step process

  1. Load the project
  2. Recalculate the project
  3. Save the project

If these 3 messages are not appearing in the log it indicates that engine is not working.

Project Scheduling Engine is not working for my projects?

  • Check the calculation type of the project — for manual projects engine doesn't do full recalculate and ignore the relations
  • The top task should be populated for the project and all the project tasks. Project engine will not work if the top task is not populated in all the records. Top task should be set to the project.

How do I derive detailed logs?

  • Create a property "com.snc.pm.debug.enable" and set it to true
  • Detailed method level logs will be logged by the project engine
  • After debugging set the property to false
5 REPLIES 5

marcelo_moreli
Mega Guru

Yay! Geneva is released -> Where?


It's not open to the general public yet. But ServiceNow developers who are a part of the developer program and using a dev instance can now upgrade their dev instances to Geneva.


kellykaufmann
Mega Guru

Very helpful!



I'm super excited about the different task relationships, and also being able to better control auto-rollup of the project start date.




"Original approved projected start date"