Understand the Impact of Calendars on Schedule Slack Calculation in Microsoft Project

The most recent build of BPC Logic Filter includes improved calculation of relative floats for tasks whose Resource Calendars are substantially different from the effective Task and Project Calendars.  While reviewing those improvements, I compiled this summary of the three different Calendar types used in Microsoft Project (MSP) schedules – with particular attention to their use in logic-driven scheduling and Slack calculation.  The summary moves from the simplest (Project Calendar only) to the most complex (combined Task and Resource calendars) case.  The conclusions are based on my own (imperfect) testing in MSP Professional 2010 and 2016 environments, and I’d welcome any corrections.

Dale Howard of Sensei Project Solutions has provided an excellent general examination of Calendars in Microsoft Project.  It may prove useful to review his post before proceeding.

A. Project Calendar

  1. The Project Calendar is used to schedule all tasks in a project IN THE ABSENCE OF OTHER CALENDARS.  When present, Task Calendars supersede all of the Project Calendar’s functions, and Resource Calendars supersede some – but not all – of the Project Calendar’s functions.
  2. Without Task or Resource Calendars, each task’s early start date occurs when all logic constraints have been satisfied and the Project Calendar makes work time available.  The task’s early finish occurs when the assigned duration has been fully expended according to the Project calendar.
  3. Relationship lags are computed according to the Project Calendar.
  4. Start Slack, Finish Slack, and Total Slack are computed using the Project Calendar.
  5. The default calendar for ProjDateAdd, ProjDateSub, and ProjDateDiff functions is the Project Calendar.*
  6. Because only a single calendar is involved in all schedule calculations, Total Slack may be a reliable indicator of Critical Path within a single project schedule.
  7. If two projects with different project calendars are joined together with inter-project dependencies, then the interaction of working periods between linked tasks can cause Total Slack to vary along a single driving logic path.

B. Project Calendar PLUS Resource Calendars

  1. Each Resource possesses a unique Resource Calendar, which is comprised of a Base Calendar with specific modifications/exceptions.  For example, the Base Calendar for all resources in a particular country may include standard weekends and holidays for that country.  These are inherited by the Resource Calendar, while exceptions may be applied for specific Resource vacations.  By default, the Base Calendar is the Project Calendar at the time the resource is created.  An alternate Base Calendar can be assigned afterward.  The Resource Calendar has the same name as the Resource.
  2. When one or more resources are assigned to a task, the task is scheduled according to a) predecessor and successor logic, including lags; and b) the available working times in the Resource Calendars.  The task’s early start date occurs when all logic constraints have been satisfied and at least one assigned resource has available work-time.  The task’s early finish date occurs when the last resource assignment is completed.  For tasks that are not of type “Fixed Duration,” the Duration is the sum of all the intervals (from start to finish) during which at least one resource is working.  Thus, a task with multiple resources (each with a unique calendar) may have a Duration and Start/Finish dates that do not directly correspond to ANY single defined Calendar.  For Fixed-Duration tasks, the Duration is the difference between the early start and early finish as computed using the Project Calendar.  Thus, a Fixed-Duration task with 12-hours of work by a night-shift resource can have a Duration of Zero, based on the Project’s Standard calendar.  During the backward pass, Late dates are established similarly, based on (resource) working-time calendars.
  3. Relationship lags are computed using the Project Calendar.
  4. Start Slack, Finish Slack, and Total Slack are computed using the Project Calendar.
  5. The default calendar for ProjDateAdd, ProjDateSub, and ProjDateDiff functions used in custom Task fields remains the Project Calendar.  When used in custom Resource fields, the default calendar for these functions is the Resource’s Base Calendar, which is often the Project Calendar.*
  6. Since a resource calendar may delay a task from starting work during an available work period as defined in the Project Calendar, the task’s driving predecessor may possess slack.  Thus, Total Slack can vary along a single driving logic path.

C. Project Calendar PLUS Task Calendars (No Resource Calendars OR “Ignore Resource Calendars” Selected)

  1. A task calendar may be created and assigned to multiple tasks.  Each Task Calendar is a Base Calendar that may be created by copying and modifying an existing Base Calendar.  (Because it is a base calendar itself, a task calendar does not inherit information from other calendars.)
  2. Task Calendars may be used to refine schedule constraints based on the nature of the tasks being performed.  E.g. seasonal or environmental limitations.  Task Calendars may also be used to represent resource restrictions when no resources have been assigned (e.g. a year-end non-work period for certain tasks in a master/summary schedule.)  When “Ignore Resource Calendars” is checked, then assigned Resources will be compelled to work exactly according to the Task Calendar, possibly violating their own work time availability.
  3. Without effective Resource restrictions, the task’s early start date occurs when all logic constraints have been satisfied and the Task Calendar makes work time available.  The task’s early finish occurs when the assigned duration has been fully expended according to the Task Calendar.
  4. Relationship lags are computed according to the Task Calendar of the successor task, if it has one, or the Project Calendar.
  5. Start Slack, Finish Slack, and Total Slack for each task are computed using the Task Calendar, if it has one, or the Project Calendar.
  6. The default calendar for ProjDateAdd, ProjDateSub, and ProjDateDiff functions used in custom Task fields is the Task Calendar, if one exists, or the Project Calendar.*
  7. The interval between a driving predecessor and a driven successor may possess work time according to the predecessor’s calendar but not the successor’s.  The driving predecessor may possess slack.  Thus, Total Slack can vary along a single driving logic path.

D. Elapsed-Durations

  1. For most practical purposes, specifying a task duration using an “elapsed” unit (edays, for example), is essentially the same as: a) Applying a 24-hour task calendar with “ignore resource calendars” selected; AND b) Assigning a duration value that accounts for the project’s hours-per-day, hours-per-week, and days-per-month settings.  For example, 1 elapsed day is the same as 24 hours or 3 “days” (8-hours each) applied to a 24-hour working calendar.  (Since mixing duration “days” with 24-hour calendars routinely causes confusion, it is good practice to instead specify such durations in hours.)
  2. Any task with an elapsed duration will have the Task Calendar field disabled.  (A stored value may be visible, but it is inactive as long as the duration units are elapsed.)
  3. Since elapsed-duration tasks automatically ignore resource calendars, any assigned Resources will be compelled to work 100% without rest, possibly violating their own work time availability.  Consequently, it’s not a good idea to routinely apply elapsed durations together with resource loading.  Even machines need downtime for maintenance.
  4. Without effective Resource restrictions, the task’s early start date occurs when all logic constraints have been satisfied, period.  The task’s early finish occurs when the elapsed duration has been fully expended.
  5. Non-elapsed relationship lags are computed according to the Task Calendar of the successor task, if it has one, or the Project Calendar.
  6. Start Slack, Finish Slack, and Total Slack for each elapsed-duration task are computed on the basis of elapsed time.
  7. For tasks with elapsed durations, the default calendar for ProjDateAdd, ProjDateSub, and ProjDateDiff functions used in custom Task fields is the 24-Hour Calendar.*
  8. The interval between an elapsed-duration predecessor and its driven (non-elapsed) successor may possess non-working time according to the successor’s effective calendar (task, resource, or project).  The driving predecessor may possess slack.  Thus, Total Slack can vary along a single driving logic path.

E. Project Calendar PLUS Task Calendars PLUS Resource Calendars (NOT “Ignored”)

If the task’s “Ignore Resource Calendars” box is NOT checked, then:

  1. Each task is scheduled only during work time that is available in BOTH the Task Calendar and the applicable Resource Calendar for each assignment.
  2. The task’s early start date occurs when all logic constraints have been satisfied,  the Task Calendar makes work time available, AND at least one assigned resource has available work time.  The task’s early finish occurs when the last assignment is completed within the combined work time restrictions.
  3. Relationship lags are computed according to the Task Calendar of the successor task, if it has one, or the Project Calendar.
  4. Start Slack, Finish Slack, and Total Slack are computed using the Task Calendar, if any, or the Project Calendar.
  5. The default calendar for ProjDateAdd, ProjDateSub, and ProjDateDiff functions used in custom Task fields remains the Task Calendar, if one exists, or the Project Calendar.  When used in custom Resource fields, the default calendar for these functions remains the Resource’s Base Calendar.*
  6. As a result of either resource-delays or task calendar mismatches, Total Slack can vary along a single driving logic path.

*  Note: The comparable Project VBA functions (Application.) DateAdd, DateSubtract, and DateDifference always default to the Project Calendar of the ActiveProject.

F. Slack and Calendars Re-Cap

In general, the Project Calendar of a fully resource-loaded project schedule plays no direct role in role in the calculation of the Early and Late dates, but it plays a primary role in MSP’s subsequent calculation of Slack based on those dates.  Conversely, although resource calendars can fundamentally alter the logic-driven dates of a typical resource-loaded task, MSP ignores them in the Slack calculation.  As a consequence, both the calculation and interpretation of Total Slack in a resource-loaded schedule become greatly simplified, if sometimes misleading.

Alternately, whenever a task calendar is applied (with or without resource-loading), that same calendar is used to calculate the Dates AND the Slack.  Consequently, the calculation of Total Slack seems to be more correct and can be equally simple to calculate (using a Task- rather than Project-Calendar), but its interpretation can be confusing.

For example, the chart below illustrates two alternate methods for modeling a calendar-restricted Board-approval activity in a project schedule.  The Board meets on the third Wednesday of each month for, among other items, approving key project commitments.  If the project team fails to prepare the necessary documents in sufficient time for the meeting, then the approvals (and follow-on tasks) will be delayed by a month.  (This is exactly how project governance works in some organizations.)  For this example, the board-approval, preparation, and follow-up activities are not on the Critical Path for the project, finishing up about a month before the project’s finish milestone.

In the first case, the restraint on the Board Approval task is modeled by applying a Task Calendar with only the third Wednesday of each month as a working day.  In the second case, the restraint is modeled by loading a “Board Availability” resource whose Base Calendar is exactly the same as the Task Calendar applied above.  Early Dates and Late Dates for all tasks are identical for both cases, and the only difference is the Total Slack of the Board Approval task.  This value is computed as the difference between the task’s Late Finish (17Apr’19) and its Early Finish (20Mar’19).  When the restraint is applied using the Task Calendar, the Total Slack of 1 day reflects the fact that one Board Meeting/availability day exists between the two dates.  With the restraint applied using a resource calendar, the Project Calendar applies, and Total Slack of 20 days reflects the twenty weekdays between the two dates.

In either case, the example also illustrates the difficulty of identifying logic paths using Total Slack alone.

G. A Note on the Resource Availability Grid

The Resource Availability Grid (part of the Resource Information dialog window) is sometimes seen as an alternate/supplemental method for specifying resource working time.  Unlike the Resource Calendar, however, Resource Availability entries do not participate in the working-time definitions that drive the scheduling calculations.  Rather, they serve as a time-phased version of the Max Units property for identifying over-allocation of resources.  Once flagged, MSP can attempt to resolve these over-allocations through automatic resource-leveling.  This is distinct from logic-driven scheduling.

 

Don’t Confuse Critical Tasks with Critical Paths in Project Schedules

The “Critical Path Method” (CPM) – a ~60-year-old algorithm of fairly straightforward arithmetic – lies at the core of most modern project scheduling tools, and most project managers worthy of the name have been exposed to at least the basic CPM concepts.  Unfortunately, the “Critical” activity flags in modern project schedules often do not correctly identify the true Critical Paths.  Blind acceptance of such “Critical” flags to identify the Critical Path inhibits proper understanding, communication, and management of project schedule performance – and gives CPM a bad rap.

Basic CPM Concepts (in General):

Any discussion of the Critical Path must address the underlying conceptual basis:

  1. A CPM project schedule is comprised of all the activities necessary to complete the project’s scope of work.
  2. Activity durations are estimated, and required/planned sequential restraints between activities are identified: e.g. Predecessor task “A” must finish before Successor task “B” can start, and Predecessor task “C” must finish before Successor task “D” can start.  The combination of activities and relationships forms a schedule logic network.  Below is a diagram of a simple schedule logic network, with activities as nodes (blocks) and relationships as arrows.
  3. Logic Relationships.  A logic relationship represents a simple (i.e. one-sided) schedule constraint that is imposed on the successor by the predecessor.  Thus, a finish-to-start (FS) relationship between activities A and B dictates only that the start of activity B may NOT occur before the finish of activity A.  (It does not REQUIRE that B start immediately after A finishes.)  Other relationship types – SS, FF, SF, which were added as part of the Precedence Diagramming Method (PDM) extension of traditional CPM – are similarly interpreted.  E.g. A–>(SS)–>B dictates only that the start of B may not occur before the start of A.  Activities with multiple predecessor relationships must be scheduled to satisfy ALL of them.
  4. Logic Paths. A continuous route through the activities and relationships of the network – connecting an earlier activity to a later one – is called a “logic path.”  Logic paths can be displayed – together or in isolation – to show the sequential plans for executing selected portions of the project.  The simple network shown has only two logic paths between the start and finish milestones: Path 1 = (StartProject) <<A><B>> (FinishProject); and Path 2 = (StartProject) <<C><D>> (FinishProject).  [Experimenting with some shorthand logic notation: “<” = logic connection to activity’s Start; “>” = logic connection to activity’s Finish.]
  5. Schedule Calculations. Schedule dates are calculated using three essential steps:
    • During the Forward Pass, the earliest possible start and finish dates of each activity are computed by considering the aggregated durations of its predecessor paths, beginning from the project start milestone and working forward in time.
    • Assuming an implicit requirement to finish the project as soon as possible, the early finish of the project completion milestone is adopted as its latest allowable finish date. This can be called the Finish Reflection.  (Most CPM summaries ignore this step.  I include it because it is the basis for important concepts and complications to be introduced later.)
    • During the Backward Pass, the latest allowable start and finish dates of each activity are computed by considering the aggregated durations of its successor paths, beginning from the project completion milestone and working backward in time.
  6. Driving and Non-Driving Logic. A logic relationship may be categorized as “Driving” or “Non-Driving” depending on its influence over the Early dates of the successor activity – as calculated during the Forward Pass.  A Driving relationship controls the Early start/finish of the successor; a Non-Driving relationship does not.  In other words, a “Driving” relationship prevents the successor activity from being scheduled any sooner than it is.  A logic path may be categorized as “Driving” (to its terminal activity) when all of its relationships are Driving.  [Such a path is sometimes called a “String.”]
  7. Total Float. In simplified terms, the difference between the early start/finish and late start/finish of each activity is termed the activity’s “Total Float” (or “Total Slack”).  A positive value denotes a finite range of time over which the activity may be allowed to slip without delaying “the project.”  A zero value (i.e. TF=0) indicates that the activity’s early dates and late dates are exactly equal, and any delay from the early dates may delay “the project.”  It is important to remember that Total Float/Slack is nominally computed as a property of each individual activity, not of a particular logic path nor of the project schedule as a whole.  [While computed individually for each activity, the float is not possessed solely by that activity and is in fact shared among all the activities within a driving logic path.  In the absence of certain complicating factors, it is common to refer to a shared float value as a property of that path.]
  8. Critical Path. A project’s Critical Path is the path (i.e. the unique sequence of logically-connected activities and relationships) that determines the earliest possible completion of “the project.”  I prefer to call this the “driving path to project completion.”  Other logic paths through the schedule are considered “Near-Critical Paths” if they are at risk of becoming the Critical Path – possibly extending the project – at some time during project execution.  In our simple project shown below, the Critical Path is Path 1, whose total duration of 4 weeks (20 days on a standard 5dx8h calendar) controls the Early Finish of the completion milestone.

    In unconstrained schedule models incorporating only a single calendar (and without other complicating factors), the Finish Reflection causes the activities on the Critical Path to have Late dates equal to their Early dates; i.e. Total Float = 0.  Consequently, any delay of a Critical-path activity cascades directly to delay of the project completion.  The Near-Critical Paths are then defined as those paths whose activities have Total Float more than zero but less than some threshold.  In traditional “Critical Path Management,” activities that are NOT on or near the Critical Path may be allowed to slip, while management attention and resources are devoted to protecting those activities that are on or near the Critical Path.  More importantly, acceleration of the project completion (or recovery from a prior delay) may only be accomplished by first addressing the activities and relationships on the Critical Path.

[Note: The definition of “Critical Path” has evolved with the introduction of new concepts and scheduling methods over the years.  The earliest definitions – based on robust schedule networks containing only finish-to-start relationships, with no constraints, no lags, and no calendars – were characterized by the following common notions:

  • It contained those activities whose durations determined the overall duration of the project (i.e. the “driving path to project completion.”)
  • It contained those activities that, if allowed to slip, would extend the duration of the project (hence the word “Critical”.)
  • Its activities comprised the “longest path” through the schedule network. That is, the arithmetic sum of their durations was greater than the corresponding sum for any other path in the network.
  • After completion of the forward and backward passes, its activities could be readily identified by a shared Total Float value of zero.  Thus TF=0 became the primary criterion for identifying the Critical Path.

With the incorporation of non-FS relationships, early and late constraints, lags, and calendars in modern project scheduling software, these observations are no longer consistent with each other nor sometimes with a single logic path.  Some of these inconsistencies are addressed later in this article.  Only the first (“driving path to project completion”) has been generally retained in recent scheduling standards and guidance publications, though implied equivalence of the others continues to persist among some professionals.]

Software – the Critical Activities / Critical Tasks:

The basic element of modern project schedules is the activity or task.  In most scheduling tools, logic paths are not explicitly defined.  Nevertheless, the obvious importance of the Critical Path dictates that software packages attempt to identify it – indirectly– by marking activities that meet certain criteria with the “Critical” flag.  Activities with the “Critical” flag are called “Critical Activities” (or “Critical Tasks”) and are typically highlighted red in network and bar-chart graphics.

Applying Critical Flags using Default Total Float Criteria

The simplest criterion for flagging a task as “Critical” is TF=0.  This is the primary method that most new schedulers seem familiar with, and it is the default criterion for some software packages.  As noted earlier, this criterion is applicable to schedules with no constraints and only a single calendar.  In Microsoft Project (MSP) and Oracle Primavera P6 (P6), the default “Critical” flag criterion is TF<=0, and the threshold value of “0” can be adjusted.  The differences between these criteria and the simpler TF=0 criterion are justified by four primary concerns:

  1. Risk Management. Due to the inherent uncertainty of activity duration estimates, the Critical Path of a real-world project schedule – as ultimately executed – often includes an unpredictable mix of activities from the as-scheduled Critical Path and Near-Critical Paths.  In the absence of quantitative schedule risk assessment, it is reasonable to consider all such (potentially-critical-path) activities equally when evaluating project schedule risks.  This purpose is easily served by applying the “Critical” flag to all activities whose Total Float value is less than or equal to some near-critical threshold.
  2. Late Constraints. Overall project completion priorities (and contractual requirements) often lead to the imposition of Deadlines (in MSP), Late Finish Constraints (in MSP and P6), or Project Constraints (in P6).  Such constraints can override the Finish Reflection and cause the Late dates of some activities to be earlier or later than they would be in the absence of the constraints.  As a result, Total Float can vary among the activities on the driving path to project completion.   In a project with multiple constrained milestones, the driving path to only one of them (the most “urgent”) can be expected to have a constant total float value (i.e. the Lowest Total Float.)  Due to intersecting logic paths, Total Float can vary along the driving paths to other constrained milestones.   Applying the “Critical” flag to activities with Total Float less than or equal to the project’s Lowest Total Float marks those activities that are on the driving path to the most urgent constrained milestone in the project.  If a Project Constraint (in P6 only) is applied, the Lowest Total Float value may be greater than zero; without a more urgent constraint, the marked activities then denote the driving path to the final activity in the project.
  3. Negative Float. Late constraints can cause Late dates to precede Early dates for certain activities.  This results in negative values for Total Float/Slack (i.e. TF<0).    In practically all cases, negative Total Float indicates that the activity cannot be scheduled in time to satisfy one or more of the Deadlines or Constraints (though which constraint is violated may not be clear); and some corrective action is necessary.  [*The concept of negative float – and the constraints that create it – were not included in the foundations of CPM and PDM.  Negative float is not universally accepted among scheduling professionals today, and not all scheduling software supports its calculation.]

    Applying the “Critical” flag to all activities with Total Float less than or equal to zero then marks all activities that:

      • Are on the driving path to an unconstrained project completion (i.e. TF=0, controlled by the project’s Finish Reflection); OR
      • Are on the driving path to a constrained project completion or intermediate milestone that is just barely met (i.e. TF=0, controlled by Deadline/Constraint); OR
      • Are on the driving path to project completion where an explicit project completion milestone is violated (i.e. TF<0, controlled by project Deadline/Constraint); OR
      • Are on the driving path to some intermediate activity whose constraint is violated (i.e. TF<0, controlled by intermediate Deadline/Constraint); OR
      • Are on any number of non/near-driving paths to one or more constrained project completion or intermediate milestones, (i.e. TF<0). Though non-driving, these paths must still be shortened (in addition to shortening the driving and nearer-driving paths) to meet the milestones.

     

  4. Working-Time Calendar Effects. When activities with different Calendars are logically connected in a schedule network, the interval between the finish of a predecessor task and the start of its successor may sometimes contain working time for the predecessor but not for the successor.  If this occurs, then a driving logic relationship exists, but the predecessor still has room to slip without delaying any other tasks or the project (i.e. it possesses float.)  Thus, Total Float may vary along a single driving logic path, including the Critical Path.  The amount of this variation depends on the size of potential offsets between calendars: from a few hours (for shift calendar offsets) to a few days (for 5-day and 7-day weekly calendars offsets) to a few months (for seasonal-shutdown calendar offsets).

    Applying the “Critical” flag to all activities with Total Float less than or equal to the largest Calendar-related offset will mark all activities that:

    • Are on the driving path to project completion with TF<=0;
    • Are on the driving path to project completion but with TF>0 (and less than the specified offset);
    • Are NOT on the driving path to project completion but have TF less than the specified offset. These are False Positives.  For these activities, Total Float could be controlled either by the Finish Reflection (TF>=0) or by some other constraint.

Critical Flags and Critical Paths

Unfortunately, applying the “Critical” flag as noted for most of these considerations has one consistent result:  the continuous sequence of activities and relationships constituting a “Critical Path” often remains obscured.  It is disappointing that the majority of project schedulers – using MSP or P6 – continue to issue filtered lists of “Critical” activities as “The Critical Path.”  Much of the time – especially in MSP – they are not.  Even among expert schedulers, there is a persistent habit of declaring Total Float as the sole attribute that defines the Critical Path rather than as a conditional indicator of an activity’s presence on that path.

When an activity is automatically marked “Critical” based on Total Float/Slack, the primary conclusion to be drawn is simply, “this activity has Total Float/Slack that is at or below the threshold value.  That is, there is insufficient working time available between the Early- and Late- Start/Finish dates.”  If Total Float/Slack is less than zero, then one might also conclude, “this activity is scheduled too late to meet one or more of the project’s deadlines/constraints.”  [If automatic resource leveling has been applied, then even these simple conclusions are probably incorrect.]  These are important facts, but a useful management response still requires knowledge of the driving logic path(s) to the specific activities/milestones whose deadlines/constraints are violated – knowledge that Total Float/Slack and its associated “Critical” flag do not always provide.

Workarounds for Total Float Criteria

P6 provides several features, not available out-of-the-box in MSP, for correctly identifying the Critical Path when Total Float Criteria do not.  Specifically:

  1. For Risk Management. P6’s Multiple-Float Path analysis (MFP) allows the identification of successive driving and near-driving paths to specified project completion milestones.  Monitoring progress on these paths is worthwhile for risk management.  I’ve previously written about MFP analysis HERE.  P6 does not support using Float Paths (the output of MFP analysis) as an explicit criterion for the “Critical” activity flag.
  2. For Late Constraints and Negative Float. P6 allows a negative Critical float threshold.  It is possible to set this threshold low enough so that only the “path of lowest total float” is marked as critical.  In the absence of working time calendar effects, this criterion can be effective in identifying the (most) Critical Path.  Thus it is possible to correctly identify the project’s Critical Path when: a) there is only a single constraint on the project; AND b) that constraint coincides with the sole project completion milestone; AND c) that constraint is violated (creating negative float).
    • MSP does not allow a negative Critical float threshold, so correct identification of the Critical Path in a negative float scenario is not possible. All tasks with negative Total Slack are automatically and unavoidably flagged as “Critical.”
    • If the P6 schedule has a Project “Must Finish by” constraint, then the activities on the Critical Path may have positive Total Float. In that case, the lowest-float criterion may be applied (using a positive threshold) to correctly identify the Critical Path.
  3. For Working-Time Calendar Effects. Unlike other project scheduling software, P6 allows the “Critical” activity flag to be assigned on the basis of some criterion other than Total Float – called Longest Path.  The name is misleading, as the method is based on driving logic rather than activity durations.  Any activity that is found on the driving logic path to project completion is flagged as “Critical.”  (The algorithm tracks driving logic backward from the task(s) with the latest early finish in the project.)  The Longest Path criterion ignores the Total Float impacts of multiple calendars and constraints.  While it is effective in identifying the project’s Critical (logic) Path, Longest Path alone is not useful for identifying near-critical paths.  MFP analysis (noted above) is useful for this purpose.  “Longest Path Value ™,” a relative-float metric available in Schedule Analyzer Software (a P6 add-in) also helps to identify near-critical paths in these circumstances.  For a more detailed review, see What is the Longest Path in a Project Schedule?

MSP provides no out-of-the-box solutions to address these weaknesses in Critical Path identification.  Total Float/Slack remains the sole basis for applying the “Critical” flag, yet the impacts of constraints, deadlines, and calendars remain unaddressed.  In MSP 2013 and later versions, the Task Path function does provide a basis for graphically identifying the driving path to a selected completion activity, and this is helpful.  Nevertheless, a logic tracing add-in (like the BPC Logic Filter program that I helped to develop) is necessary to correctly identify the controlling schedule logic – including the true Critical Path – in a complex MSP schedule.

Definitions and Recommended Practices

Defense Contract Management Agency (DCMA – 2009)

DCMA’s in-house training course, Integrated Master Plan/Integrated Master Schedule Basic Analysis (Rev 21Nov09) is the source of the “14-Point Assessment” that – because its explicit “trigger” values are easily converted to Pass/Fail thresholds and red/yellow/green dashboards – is seen as a de-facto industry standard for schedule health assessment.  The course materials contain the following definitions:

(Slide 28) “Critical Path ~ Sequence of discrete work packages that has the longest total duration through an end point.
~ has the least amount of total float
~ cannot be delayed without delaying the completion date of the contract (assuming zero float).”
(Slide 98) “Critical Path – Definition: a sequence of discrete tasks/activities in the network that has the longest total duration through the contract with the least amount of float.
~ A contract’s critical path is made up of those tasks in which a delay of one day on any task along the critical path will cause the project end date to be delayed one day (assuming zero float).
(Slide 99) “The critical path is ‘broken’ whenever there is not a sequence of connected critical path tasks that goes from the first task of the schedule until the last task.  A broken Critical Path is indicative of a defective schedule.” 

These definitions are mostly (though not entirely) consistent with each other.  They do share a common emphasis on the … “Longest”… “Sequence” … with “lowest total float” AND day-for-day cascading of delay from any critical-path task directly to the project’s completion.  Obviously, the reliance on Total Float makes them incompatible with any project schedule that incorporates multiple calendars, late constraints, or resource leveling.

(Slide 97) “Critical Task:  Some tasks possess no float…they are known as critical tasks.
~Any delay to a critical task on the critical path will cause a delay to the project’s end date.”

Unlike most of the later definitions, DCMA’s appears to contemplate the existence of Critical Tasks that are NOT on the Critical Path.  Obviously, the expectation that such Critical Tasks possess “no float” is not compatible with negative-float regimes.

AACE International (2010 & 2018)

AACE International (formerly the Association for the Advancement of Cost Engineering) maintains and regularly updates its Recommended Practice No. 10S-90: Cost Engineering Terminology.  The most recent issue of RP 10S-90 (June 2018) includes the following definitions:

“CRITICAL PATH – The longest continuous chain of activities (may be more than one path) which establishes the minimum overall project duration. A slippage or delay in completion of any activity by one time period will extend final completion  correspondingly. The critical path by definition has no “float.” See also: LONGEST PATH (LP). (June 2007)”

CRITICAL ACTIVITY – An activity on the project’s critical path. A delay to a critical activity causes a corresponding delay in the completion of the project. Although some activities are “critical,” in the dictionary sense, without being on the critical path, this meaning is seldom used in the project context. (June 2007)”

Unfortunately, these definitions fall apart in the presence of multiple calendars, multiple late constraints, or negative total float – when the second and third clauses in both definitions no longer agree with the first.  They appear distinctly out of sync with modern project scheduling practices, and (according to AACE International’s Planning and Scheduling Subcommittee Chair) an update is pending.

AACE International’s RP No. 49R-06, Identifying the Critical Path (last revised in March 2010) instead defines the Critical Path as

the longest logical path through the CPM network and consists of those activities that determine the shortest time for project completion.  Activities within this [group (sic)] or list form a series (or sequence) of logically connected activities that is called the critical path.” 

Aside from the apparently inadvertent omission of a word, I don’t have any problem with this definition.  It is certainly better, in my opinion, than the first.

RP 49R-06 notes the existence of “several accepted methods for determining the critical path” and goes on to describe the four “most frequently used” methods:

  1. Lowest Total Float. This is as I described under Workarounds for Total Float Criteria, above.  Although this method is listed first, the RP spends four pages detailing the issues that make Total Float unreliable as a CP indicator.  As long as the CP is to be defined only with respect to the most urgent constraint in the schedule (including the Finish Reflection) – and there are no Calendar issues –  then this method provides a useful result.
  2. Negative Total Float.  In apparent acquiescence to the limitations of MSP, the RP describes this method by first abandoning the fundamental definition of the Critical Path as a specific logic path.  It then allows the “Critical” classification for any activity that must be accelerated in order to meet an applied deadline or constraint.  Ultimately, the RP attempts to justify this method based solely on certain legal/contractual considerations of concurrent delay.  It is NOT useful for those whose primary interest is timely completion of the project, or a particular part of the project, using Critical Path Management principles.
  3. Longest Path.  This “driving path to project completion” algorithm, as I described above in Workarounds for Total Float Criteria, has been implemented in versions of (Oracle) Primavera software since P3 (2.0b).  It is the preferred method for P6 schedules with constraints and/or multiple activity calendars.  A similar algorithm is included in BPC Logic Filter, our Add-In for Microsoft Project.  While the method is nominally aimed at finding the driving path(s) to the last activity(ies) in the schedule, it can be combined with other techniques (namely a super-long trailing dummy activity) to derive the driving path to any specific activity, e.g. a specific “substantial completion” or “sectional-completion” milestone.
  4. “Longest Path Value.”  This is an expanded method for identifying the driving and near-driving paths to project completion.  The method works by adding up relationship floats leading to a specific substantial completion milestone.  If the aggregate value of these floats along a specific logic path (i.e. “Longest Path Value”) is zero, then that path is identified as the Critical Path.  While the RP suggests that this method can be performed manually (presumably by “click-tracing” through the network of a P6 schedule), manual implementation in complex schedules is tedious and error prone.  As implemented in Schedule Analyzer Software, this method is essentially an improved version of  P6’s Longest Path method (except that the Add-in cannot change the “Critical” flag for activities.)  It is a preferred method in P6 for those possessing the Schedule Analyzer Software.  BPC Logic Filter performs similar analyses – using “Path Relative Float” instead of “Longest Path Value” – for MSP schedules.

While not listed among the “most frequently used” methods, P6’s MFP analysis option is briefly addressed by the RP in the context of identifying near-critical paths.  BPC Logic Filter performs similar analyses for MSP schedules.

None of the four methods described are useful for identifying the Resource Critical Path (or Resource-Constrained Critical Path) of a leveled schedule.

Project Management Institute (PMI-2011)

PMI’s Practice Standard for Scheduling (Second Edition, 2011) explicitly defines the Critical Path as

“Generally, but not always, the sequence of schedule activities determining the duration of the project.  Generally, it is the longest path through the project.  However, a critical path can end, as an example, on a schedule milestone that is in the middle of the schedule model and that has a finish-no-later-than imposed date schedule constraint.” 

Unlike the RP (49R-06) from AACE International, PMI’s Practice Standard provides no meaningful method for quantitatively identifying the activities of the Critical Path (or any logic paths) in a particular schedule model.  In fact, in its description of the Precedence Diagram Method (PDM – the modern version of CPM used by most modern scheduling software) the Practice Standard acknowledges the complicating factors of constraints and multiple calendars but notes that “today’s computerized scheduling applications complete the additional calculations without problems.”  Then it concludes, “In most projects the critical path is no longer a zero float path, as it was in early CPM.”  The Practice Standard goes on to scrupulously avoid any explicit link between Total Float and the Critical Path.  The impact of all this is to just take the software’s word for what’s “Critical” and what isn’t.  That’s not particularly helpful.

Finally, educating senior stakeholders on the subtle difference between “schedule critical” and “critical” is always one of the first issues faced when implementing systematic project management in non-project focused organizations.  The Practice Standard’s several conflicting definitions of Critical Activities tend to confuse rather than clarify this distinction.

U.S. Government Accountability Office (GAO-2015)

The GAO’s Schedule Assessment Guide: Best Practices for Project Schedules (GAO-16-89G, 2015) has been taken to supersede the earlier DCMA internal guidance in many formal uses.  (Nevertheless, the GAO’s decision to discard any formal trigger/threshold values – a good decision in my view – means that the DCMA-based assessments and dashboards remain popular.)  The GAO document contains the following formal definitions:

“Critical path: The longest continuous sequence of activities in a schedule. Defines the program’s earliest completion date or minimum duration.” [With some minor reservations related to meaning of “longest,” I believe this is a good definition.]

“Critical activity: An activity on the critical path. When the network is free of date constraints, critical activities have zero float, and therefore any delay in the critical activity causes the same day-for-day amount of delay in the program forecast finish date.”   [Unfortunately, the caveats after the first clause are insufficient, ignoring the complicating effects of multiple calendars.]

For the most part – and despite the float-independent formal definition above – the Schedule Assessment Guide’s “Best Practices” tend to perpetuate continued reliance on Total Float as the sole indicator of the Critical Path.  In fact, “Best Practice 6: Confirming That the Critical Path Is Valid” does a good job of illustrating the complicating factors of late constraints and multiple calendars, but this review leads essentially to the differentiation of “Critical Path” (based on total float alone) from “longest path” (based on driving logic).  This is a direct contradiction of the formal definition above.  In general, the text appears to be written by a committee comprised of P6 users (with robust driving/Longest Path analysis tools) and MSP users (without such tools.)  Thus, for every “longest path is preferred,” there seems to be an equal and opposite, “the threshold for total float criticality may have to be raised.”  This is silly.

National Defense Industrial Association (NDIA-2016)

The NDIA’s Integrated Program Management Division has maintained a Planning & Scheduling Excellence Guide (PASEG), with Version 3.0 published in 2016.  The PASEG 3.0 includes the following key definitions:

“Critical Path: The longest sequence of tasks from Timenow until the program end. If a task on the critical path slips, the forecasted program end date should slip.” 

“Driving Path(s): The longest sequence of tasks from Timenow to an interim program milestone.  If a task on a Driving Path slips, the forecasted interim program milestone date should slip.”

The second clause of each definition – which presumes a single calendar – is included in the Schedule Analysis chapter but is excluded from the formal definition in Appendix A.  Timenow is effectively the Data Date / Status Date.  The PASEG does not define or mention critical task/activity as distinct from a “task on the critical path.”

The PASEG notes, “Some of the major schedule software tools have the ability to identify and display critical and driving paths. Additionally, there are many options available for add-in/bolt-on tools that work with the schedule software to assist in this analysis.”  [I suppose BPC Logic Filter would be one of the mentioned add-in tools for Microsoft Project.]

The PASEG also mentions some manual methods for identifying critical and driving paths, e.g.:

a. Imposing a temporary, super-aggressive late constraint and grouping/sorting the output (presumably by Total Float and early start.  Though not explicitly mentioned in the method description, Total Float is the key output affected by the imposed constraint.)  Obviously, this method isn’t reliable when more than one calendar is used.

b. Building a custom filter by manually “click-tracing” through driving logic and marking the activities.  This method is most reliable in P6, with some caveats.  It is reliable in MSP only under some fairly restrictive conditions.

In general, these methods are non-prescriptive, though the emphasis on driving logic paths (rather than Total Float) seems clear.

Guild of Project Controls (GPC, “The Guild” – 2018)

The Guild is a relatively young (~2013) international community of project controls practitioners – initially associated with the PlanningPlanet.com web site – whose founding members have assembled a Project Controls Compendium and Reference (GPCCaR).  The GPCCar takes the form (more or less) of an introductory training course on Project Controls, including Planning and Scheduling.  The GPCCaR includes no formal Glossary, Terminology, or Definitions section, so “Critical Path” and “Critical Path Activities” accumulate several slightly varying definitions in the applicable Modules (07-01, 07-7, and 07-8).  In general, “Zero Total Float” and “Critical Path” are used interchangeably, and the complications of multiple calendars and multiple constraints in P6 and MSP are ignored.  This is not a suitable reference for complex projects that are scheduled using these tools.

Recap

  1. A full understanding of driving and non-driving schedule logic paths for major schedule activities is useful for managing and communicating a project execution plan.
  2. The most important logic path in the project schedule is the “Critical Path,” i.e. the driving path to project completion.  Overall acceleration (or recovery) of a project is ONLY made possible by first shortening the Critical Path.  Acceleration of activities that are NOT on the Critical Path yields no corresponding project benefit to project completion.  Multiple Critical Paths may exist.
  3. Some traditional notions of Critical Path path behavior – e.g. Critical Path activities possess no float; slippage or acceleration of Critical Path activities always translates directly to project completion – are not reliable in modern project schedules.
  4. Total Float remains a valuable indicator of an activity’s scheduling flexibility with respect to completion constraints of the project.  An activity with TF=0 may not be allowed to slip if all project completion constraints are to be met.  Activities with TF<0 MUST be accelerated if all the constraints are to be met.
  5. Project scheduling software typically defines individual activities as “Critical” without fully accounting for common complicating factors like multiple constraints and calendars.  As a result, the collection of “Critical” tasks/activities in a complex project schedule often fails to identify a true Critical Path.
  6. A Critical task/activity is best defined (in my opinion) as EITHER:
    1. An activity that resides on the Critical Path; OR
    2. An activity whose delay will lead to unacceptable delay of the Project Completion; OR
    3. An activity whose delay will lead to unacceptable delay of some other constrained activity or milestone.
    4. In general, these conditions are mutually exclusive, and different activities within a single project schedule may satisfy one or more of them.
  7. Professional project managers and schedulers should be careful not to automatically characterize “Critical” tasks (i.e. those with low Total Float) as indicators of a project’s Critical Path when complicating factors are present.

 

Video – Find the Driving Path for Key Milestones in Microsoft Project using BPC Logic Filter

In the presence of Deadlines, Constraints, variable Calendars, and resource leveling, Total Slack becomes unreliable as an indicator of the Critical Path (or of nearness to the Critical Path).  In addition, many projects include Key Completion Milestones that occur long before the final scheduled activity of the project, so a Longest-Path approach doesn’t apply.  For these projects, I use the Task Logic Tracer to find the Driving Path and Near-Driving Paths of each Key Completion Milestone.

Video – Using BPC Logic Filter to Analyze Resource-Leveled Critical Path

Here’s another video of BPC Logic Filter in action – this time revisiting the themes of  previous blog entry:  The Resource Critical Path

 

A Logic Tracing Example in Microsoft Project

This article uses BPC Logic Filter to present the progression of a single logic tracing example from a simple approach to a more focused analysis.

[If you came here looking for a simple logic tracing macro and are comfortable using Visual Basic for Applications (VBA), have a look at these two other entries: Macro for tracing filtering and sorting task paths in Microsoft Project and Simple Macro for Listing Driving Predecessor(s) in MS Project.  They may give you what you want as long as your project has simple logic.]

BPC Logic Filter is an excellent tool for defining and visualizing the Critical Path and Near-Critical Paths of a project when Total Slack proves inadequate – namely in the presence of constraints, variable calendars, and resource leveling.  As I’ve written elsewhere, however, the first version of BPC Logic Filter was prompted by a very different, though straightforward stakeholder request: “My people can’t see why they need to finish these tasks so soon. Isn’t there a report or something to show what other tasks (in other departments) are depending on them?”  In other words, couldn’t I group, filter, and sort tasks simply according to logical relationships – in addition to Work Breakdown Structure, responsible department, and other codes.  At its core, the resulting solution was a simple logic tracing routine for exploring, marking, and displaying logical relationships in an existing project schedule.

This article presents the progression of a single logic tracing example from a simple approach to a more focused analysis.

Consider the example of the small installation project presented below.  There is a deadline on the “Substantial Completion” milestone, and the project is 10-days behind schedule.  For unrelated reasons, the project manager has identified a need to trace the predecessors driving one task – “A3 Install Line D.”  The selected task is marked with the arrow in the figure.

lt-00

We can first examine the task’s predecessors using MSP’s Task Detail Form and the Task Inspector feature.  The form shows that the task has two finish-to-start predecessors but provides no other schedule information for them.  Task Inspector identifies the second one — ID 22 – A3 Install Line C — as the driving predecessor.  That is the predecessor whose logic is controlling the start date for our task.

The Logic Inspector in BPC Logic Filter presents a single consolidated view of the task’s driving and non-driving predecessors, including other relevant information like dates, task calendars, and resources.  Driving relationships are highlighted and listed at the top, while links to inactive predecessors are de-emphasized and listed at the bottom.  For logical significance, the RelFlt column indicates how far the predecessor relationship is from being a driving relationship, in days.  (Logic Inspector also provides a similar view of successor relationships.)

Using a simple “Trace” macro (like the the one linked above or one of the freeware settings in BPC Logic Filter), it is possible to identify the chain of predecessors and apply a filter to hide the tasks that are not related to the selected task.  As seen in the result shown below, however, the actual driving logic for the selected task is not apparent.  (And no, Total Slack does not define driving logic for this task.)

lt-01

With advanced logic analysis features, the relative float of all the predecessor task paths can be defined and displayed.  The following chart shows the entire project, with the predecessor paths of the selected task highlighted according to their path relative float in days.  (Path relative float indicates how much a particular task or path may be delayed before affecting the selected task; i.e. “days away from driving”.)  Path relative float is indicated numerically at the right side of each related bar.  Unrelated bars are de-emphasized and colored green.

lt-02

BPC Logic Filter allows one variation – bounded network analysis – to only show connections to a particular target task.  The figure below highlights the connections between the selected task, A3 Install Line D, and the target task, A2 Civil.

lt-03

The previous two figures displayed the related task paths in-line and within the context of the overall project view.  A more focused view of the driving and near-driving paths is provided by applying a filter to hide all unrelated tasks, as shown here.

lt-04

It is often useful to group and sort tasks to clearly display the chain of driving logic and associated near-driving paths.  The first group in the figure below – “BPC Relative Float (d): 0” – indicates the driving logical path for the selected activity.  The next two groups depict branching logical paths (one task each) that are 10- and 20-days away from driving the selected task.

lt-05

Finally, when attempting to accelerate a task by shortening its driving logical path, Drag quantifies the maximum acceleration that may be gained by shortening a particular task along that path.  Drag is limited by the existence of parallel paths, as clearly evidenced by Tasks 6 and 11 in the figure below.  For focused acceleration of complex projects, the Drag metric can assist in prioritizing actions.

lt-06

The examples shown here represent successively more powerful analyses of driving logic for an arbitrary task in a project schedule.  If that task were the final task or a key completion milestone for the project, then the resulting special case of the driving path would be the “Critical Path” for the project.

See a related video entry:

Video – Logic Tracing Example in Microsoft Project

 

Leveling Changes from MSP 2010 to MSP 2013

[I’ve slightly edited this old article – mostly figures.  After “upgrading” to Microsoft Project 2016, I can confirm that MSP 2016’s resource leveler appears similar to MSP 2013’s leveler in the simple case examined; both are substantially different from MSP 2010’s.]

Over the last few years, some tests of resource leveling algorithms in various software packages have been reported informally over at Planning Planet.

When using “default” conditions (i.e. without implementing any user-defined priority schemes), the general picture was that leveled schedules from MSP 2010 were significantly longer than those from MSP 2007.  There have also been reports that MSP 2013 (and MSP 2016, which seems to use the same leveling rules) produces even longer leveled schedules than MSP 2010.  Other software (Spider Project in particular) tend to produce shorter schedules under resource constraints.  I haven’t paid too much attention to these reports because a) I don’t use resource leveling often, and b) when I do use leveling, I always define some specific leveling priorities, so the “default” results are not so relevant.

Last week, a French planner (“Alexandre”) on PP noted some significant changes in default leveling results when migrating a simple schedule from MSP 2010 to MSP 2013, wondering what might be the reason for the changes.  I’m still on 2010, so I haven’t noticed the change in 2013.  While it’s clear that Microsoft has modified the leveling rules from version to version, they don’t publish the details, so addressing the “reason for the change” is just speculation.  My own speculation is that minor changes to the leveling algorithm were made to limit apparent changes to the pre-leveling “Critical Path,” even at the expense of extending the schedule.  For Alexandre’s specific example:

  • The project has a total duration of 7.5 days, and the pre-leveling (i.e. CPM) critical path runs through task 5.  Task 5 has 0 days of total slack, while task 8 has 2 days of slack.
Leveling Fig0
Figure 0. Pre-Leveling (CPM) Schedule – 2010
  • In resolving the resource conflict between task 5 and task 8, MSP 2010’s default rule gives greater scheduling priority to task 5 because:
    • The CPM schedule has it starting earlier;
    • It has lower total slack in the CPM schedule;
    • It has a longer duration;
    • It comes first on the task list;
    • It is marked as “Critical” (?);
    • Some other factors…(?).

(I have no idea what the relative contributions of these factors are in the scoring.  Some might be zero.)

    • As a consequence of leveling, task 5 (the “critical” one) is scheduled first, while task 8 is delayed, and the project is extended 1 day for a total duration of 8.5 days. Total slack is re-computed after incorporating the leveling delays, and a new “Critical Path” is displayed.
      • Perversely, Task 5 – which was clearly “critical” before leveling and is also clearly a resource driver for the project completion – now has 1 day of Total Slack.

        Leveling Fig1
        Figure 1. Leveled Schedule – 2010
      • Task 7 is now shown as “Critical,” even though there is neither a logical nor a resource-driving reason justifying it.
      • So in short, the MSP 2010 leveling algorithm can substantially change the “Critical Path,” and the resulting slack values can be completely misleading. (I wrote about this here: Logic Analysis of Resource-Leveled Schedules (MS Project).)
      • The next figures (from BPC Logic Filter) illustrate the actual resource-constrained Longest Path (Fig. 2) and Multiple Float Paths (2a) through the 2010 schedule.
Leveling Fig2
Figure 2. Resource-Constrained Longest Path of Leveled Schedule – 2010
Resource-Constrained Multiple-Float Paths of Leveled Schedule - 2010
Figure 2a. Resource-Constrained Multiple-Float Paths of Leveled Schedule – 2010
  • In contrast, MSP 2013 task gives greater scheduling priority to task 8, delaying task 5. I suspect this is driven by some complex tuning of the leveling rules around Total Slack.
    • Alexandre provided the MSP 2013 leveled schedule here (which also includes a minor date shift).

      Leveled Schedule - 2013
      Figure 3. Leveled Schedule – 2013
    • I’ve repeated it below in my [MSP 2016 model using Standard leveling order.]  The resulting “Critical Path” appears essentially the same as the pre-leveling version, but with an added 3-day leveling delay before task 5. This may give project managers confidence that the leveling exercise has not “screwed up” their critical path.
      Figure 4. Leveled Schedule – 2016

      Unfortunately, the project finish has been extended by an additional 2 days compared to the MSP 2010 leveler.  It is now 10.5 days.

    • The project manager’s confidence in the critical path is still misplaced. Task 7 and task 8 are now shown as far from critical, with 5 days of total slack.  As shown in the next two figures from BPC Logic Filter, however, they are obviously on the resource-constrained longest path through the schedule.
Figure 5. Resource-Constrained Longest Path of Leveled Schedule – 2016
Figure 5a. Resource-Constrained Multiple-Float Paths of Leveled Schedule – 2016

Comparing the 0-Float Paths of the two schedules (Figures 2a and 5a), we see that unlike MSP 2010, MSP 2013 and MSP 2016’s leveling engine has preserved the logic drivers from the pre-leveling CPM schedule while implicitly inserting task 7 and task 8 into the driving path to project completion.   Although the project is extended as a result, the appearance of a stable critical path is preserved.  Fortunately, BPC Logic Filter depicts the resulting resource-constrained critical path clearly in both cases.

My speculation on the reason for the changed algorithm is based on the Project development team’s demonstrated preference for the appearance of stability (for mid-level users) over behavior that might be more technically correct from an advanced user’s point of view.  (See the handling of inactive tasks in MSP 2013 for another example.)

For an update on this topic, see Resource Leveling Changes from MSP 2010 to MSP 2016 – Revisited

 

The Resource Critical Path – Logic Analysis of Resource-Leveled Schedules (MS Project), Part 2

BPC Logic Filter for Microsoft Project provides an automated method for extracting and presenting the Resource Critical Path (a.k.a Resource-Constrained Critical Path or Critical Chain) from a leveled schedule.

In a previous entry (Logic Analysis of Resource-Leveled Schedules), I investigated the impact of resource leveling on the logical analysis of Microsoft Project schedules.  Conclusions were not encouraging, i.e.:

  • Project’s Total Slack calculation – and as a consequence, the “Critical” flag – fails to adequately account for resource constraints in the schedule. Neither the “Resource Critical Path” nor any other resource-leveled logical path can be deduced from the schedule by analyzing the logical relationships and slack (nor even the “Leveling Delay” artifacts).  Even worse, tasks that are clearly schedule critical when considering resource constraints can have unexpectedly high values for Total Slack and may therefore be neglected during crashing exercises or disruption analysis.
  • BPC Logic Filter – our preferred tool for logical analysis of Microsoft Project schedules – could not completely overcome the weaknesses of MSP when it came to resource leveling.
  • To be amenable for logical analysis, it seemed that schedules needed to be constructed with “soft” logic links to mimic the impacts of the resource leveling algorithm.

As the developer and primary user of BPC Logic Filter, I was not satisfied with these latter conclusions.  After all, I had developed the tool specifically to overcome MSP’s shortcomings in the context of multiple deadlines/constraints and variable calendars.  Why should it stop there?

While I have intended to address resource constraints in BPC Logic Filter since the beginning, I didn’t have much need for it until recently.  Now the latest code revision incorporates full analysis and comparison of resource assignments in parallel with the existing logic analysis algorithm.  I’m pleased with the results and feel confident that BPC Logic Filter can now depict the Resource Critical Path (or any resource-constrained driving path) in a Microsoft Project Schedule.

Figure 8 of the earlier article showed the resource-leveled schedule of a simple construction project, while Figure 9 showed BPC Logic Filter’s multiple-float-path analysis of the schedule.  The latter figure demonstrated how resource leveling introduced gaps into the logical arrangement of the schedule, but it did not track the resource constraints behind those gaps.  Figure 11 of the earlier article demonstrated the analysis after replacing the resource-leveling delays with soft (“preferential”) logic links to create exactly the same (early) schedule dates.  I’ve included these figures below.

Figure 8: Resource-Leveled Schedule
Figure 8: Resource-Leveled Schedule
Figure 9: Logic Analysis of Leveled Schedule
Figure 9: Logic Analysis of Leveled Schedule
Figure 11: Logic Analysis of Schedule with Preferential Logic Instead of Leveling
Figure 11: Logic Analysis of Schedule with Preferential Logic Instead of Leveling

Now I’ve added a figure (let’s call it Figure 12) showing the “new and improved” analysis from BPC Logic Filter.  The top band of the figure illustrates the Resource Constrained Critical Path for the project as originally scheduled and leveled (i.e. without preferential logic).  The dates remain unchanged.  The relative float values for all tasks are identical to those of the revised (preferential-logic) schedule, but the total slack, critical flag, and bar colors are as originally scheduled and leveled.  The next figure (13) shows a revised version of the bar chart with custom bar colors applied to clarify the logic- and resource-driven paths.  This is comparable to MSP’s “Task Path” graphical display (though of course that tool is limited to logical paths, does not differentiate among relative float paths, and has no filter.)

Resource Constrained Critical Path from BPC Logic Filter
Figure 12: New Logic Analysis of Leveled Schedule – i.e. Resource Constrained Critical Path

Figure 13 - BPC Logic Filter Bar Colors

Figure 13 – BPC Logic Filter Bar Colors

To summarize, BPC Logic Filter now includes full analysis of driving resource constraints for leveled schedules.

I’ve tested the upgraded functionality against some of the more sophisticated leveling scenarios, like split-assignments, split-tasks, and in-progress tasks with splits.  I’ve also stress-tested the algorithms against some public-domain resource-constrained schedule datasets – namely PSPLIB files j1201_7 and j12060_10, both leveled by MSP with default parameters. For the latter project, BPC Logic Filter required nearly two minutes to chug through the numerous parallel resource-driving paths.  (The project includes large pools of homogeneous resources distributed among many small tasks, which I hope is not typical.)

For now, the resource-analysis features do not work across multiple projects (i.e. linked master/sub-project structures.)

Finally, the banner/featured image at the top of this article is an updated version of the project schedule, with a couple arrows added to depict the inherent logic of the resource leveling delays.  It would be great for the program to insert these arrows automatically, but I’m afraid the necessary effort isn’t justified at this time.  Maybe I’ll revisit in the future.

[See a related video entry here: Video-Using BPC Logic Filter to Analyze Resource Leveled Critical Path]

Resource Leveling Breaks the “Critical Path” – Logic Analysis of Resource-Leveled Schedules (MS Project)

[31Mar’16: The latest (pending) release of BPC Logic Filter now includes resource leveling constraints in the logical path analysis.  I’ve written another article to summarize and amend this one:  The Resource Critical Path – Logic Analysis of Resource-Leveled Schedules (MS Project), Part 2 .]

Effective management of resources – i.e. planning, procuring, mobilizing, and deploying – is a core competency for successful companies in project-focused industries like construction.  Most scheduling tools based on the Critical Path Method (CPM) – like Microsoft Project – can generate project schedules without resources, but they also include methods for assigning, analyzing, and “leveling” project resources.  In this context, “leveling” means selectively delaying some work (compared to the CPM-based schedule) pending the completion of other, more urgent works that demand the same resources.

This simple description might imply that a certain logical/sequential relationship is imposed between two competing tasks (i.e. the “less urgent” work can only start after the “more urgent” work is finished with the resources) – sometimes called “soft logic”.  Unfortunately, the leveling engine in Project 2010 does not appear to use, much less preserve, any such soft logic.  Consequently, logical analysis of the leveled schedule – including interpretation of Total Slack to determine critical path or driving logical path – appears invalid.

Figure 1: Simple Construction Project with Resource Loading
Figure 1: Simple Construction Project with Resource Loading

Figure 1 is a simplified CPM model of a construction project involving multiple trades working in multiple areas.  The model includes realistic resource loading, but the logical links have been limited to “hard logic” only (i.e. physical constraints).  In other words, there is no preferential logic to guide the resource deployments.  The default 5dx8h weekly calendar is universally applied, and a deadline of 25Feb’04 has been imposed.  The unleveled CPM schedule includes a forecast completion that is nearly 3 months ahead of the deadline, but resources are severely over-allocated – the schedule appears unrealistic and needs to be leveled.

Specifically:

  1. Three civil works tasks are running concurrently, but there is only sufficient manpower to run them sequentially. (Figure 2.)
  2. Three structural tasks are also running concurrently, and these require both manpower (Figure 3) and a crane (Figure 4), which is the limiting resource. They must be done sequentially.
  3. There is room to install the five separate processing lines concurrently in Area 3, but there is only enough skilled manpower to install them one at a time. (Figure 5).
  4. An electrical change order has been approved in Area 2, but this requires the same specialized crew that is already working there. The Change-order work must be delayed (Figure 6).
Figure 2: Over-Allocation of Civil Works Manpower
Figure 2: Over-Allocation of Civil Works Manpower
Figure 3: Over-Allocation of Structural Erection Manpower
Figure 3: Over-Allocation of Structural Erection Manpower
Figure 4: Over-Allocation of Crane
Figure 4: Over-Allocation of Crane for Structural Erection
Figure 5: Over-Allocation of Mechanical Installation Manpower
Figure 5: Over-Allocation of Area 3 Specialized Mechanical Installation Manpower
Figure 6: Over-Allocation of Specialized Electrical Manpower
Figure 6: Over-Allocation of Area 2 Specialized Electrical Manpower

It is a simple matter to remove the over-allocations by manually executing Project’s leveling engine using near-default conditions (Figure 7).

Figure 7: Resource Leveling Options
Figure 7: Resource Leveling Options

The leveling engine resolves the over-allocations by selectively delaying those tasks (and task resource assignments, if specified) which are judged to be lower-priority according to Project’s proprietary rules.  Figure 8 illustrates the results of the leveling exercise:

Figure 8: Resource-Leveled Schedule
Figure 8: Resource-Leveled Schedule
  1. The primary artifact of the leveling process is the “leveling delay” task property, which is in units of elapsed-duration (i.e. “edays”). The leveling delay is incorporated into the forward-pass schedule calculation, pushing the early start dates of the affected tasks.  (Separate leveling delays can also be applied to resource assignments, which can extend task durations.  This has not been done here and is generally not recommended when assigned resources are expected to work concurrently – e.g. Crane and structural erection crew.)  Leveling delay is also incorporated into the backward pass, removing “phantom slack” from logically-connected tasks.
  2. Through the task leveling delay, the civil, structural, mechanical, and electrical tasks have been re-scheduled sequentially.
  3. Substantial Completion has been delayed until two weeks after the deadline, resulting in 10 days of negative slack on the milestone and its logical driving predecessors.
  4. There is not an obvious (-10d) total-slack path from beginning to end of the project.

Figure 9 illustrates the use of BPC Logic Filter to determine the driving path logic of the Substantial Completion task after leveling.  The driving path is comprised of four tasks and two milestones separated by gaps, and the intervals of the gaps are determined by the “leveling delay.”  Unfortunately, this does not describe a “resource constrained critical path.”  In fact, the obviously critical tasks without leveling delay – including the first (i.e. “A1”) Civil and Structural works and the A2 Electrical works – now have high values of total slack and are shown far from the critical path.  Consequently, it is clear that logical path analysis – including any evaluation of Total Slack – is not consistent with the rule-based resource leveling algorithm used by Microsoft Project.

Figure 9: Logic Analysis of Leveled Schedule

Figure 10 illustrates the un-leveled schedule, revised to include obvious preferential logic for avoiding resource conflicts.  The resulting task sequences and schedule dates are identical to those of the leveled schedule seen earlier, but the associated total slack values and “critical” flags are substantially different.  As shown in Figure 11, however, the logic paths are clear and consistent with the real resource constraints of the project.  The “BPC Relative Float (d): 0” group appears to represent the true resource constrained critical path for the project.

Figure 10: Preferential (Soft) Logic in Unleveled Schedule
Figure 10: Preferential (Soft) Logic in Unleveled Schedule
Figure 11: Logic Analysis of Unleveled Schedule with Preferential Logic

To recap, Microsoft Project’s proprietary resource leveling engine offers a convenient tool for resolving resource conflicts in project schedules, and this functionality seems heavily used and highly valued in some industries.  It does not appear appropriate, however, for use in complex projects where formal logical sequencing of tasks – including identification of Critical Path or Critical Chain – is required. In particular, Project’s “Critical” flag will fail to accurately mark the critical path in a resource-leveled schedule.   Consequently, a project specification that requires both a logic-driven schedule basis and heuristic resource leveling appears contradictory.

[Click here to proceed to the follow-up article:  The Resource-Constrained Critical Path – Logic Analysis of Resource-Leveled Schedules (MS Project), Part 2 .]

Monitoring Near Critical Tasks in Microsoft Project

Here I address the fundamental inability of MSP users – even supposed experts – to correctly analyze a logic-driven schedule.

While rooting around Planning Planet this morning, I stumbled across this link to an 8-month old blog entry from Ten Six Consulting: Monitoring Near Critical Tasks in Microsoft Project 2013 | Ten Six Consulting.  In light of my work on BPC Logic Filter, this was a subject of interest to me.  I started to reply on PP, but as my response grew I decided to transform it into an entry over here….

Overall I believe the article presents a perfect example of the fundamental inability of MSP users – even supposed experts – to correctly analyze a logic-driven schedule.  The primary reason for this is the user community’s reliance on Total Slack as the sole indicator of a given task’s “criticality” or its inclusion on a particular logical path – all while continuing to use constraints, deadlines, and variable calendars.

As usual, the article is a well written and nicely presented illustration of a fairly elementary concept, i.e. generating and applying a “Near Critical Filter” to show only tasks with Total Slack values between 0.1 and 10 days.  Ten Six then applied this filter to “clearly see all the tasks that are non-critical but in danger of becoming critical if they are delayed in any way.”  Here is the resulting chart (taken from their article) with the four “Near Critical” tasks highlighted.  The chart implicitly tells us that a Finish-No-Later-Than (2/22/15) constraint has been applied to the “Install Fence” task, reducing its Total Slack to 4 days.  Now the Fence and its only predecessor (Grade Site) are highlighted as Near-Critical.  (The TS=2 on the “Above Grade” summary task, also highlighted, seems to be a fluke of MSP’s screwy roll-up rule for TS; it reflects no logical relationship. [See Total Slack Calculation for Summary Tasks in Microsoft Project.])

Near-Critical-Tasks-in-Microsoft-ProjectFig-7

So, if the fence is delayed by 5 days, is the project’s completion delayed?  Clearly No; not according to this schedule.  The fence is not Near Critical for the project.  It merely has a constraint that may be violated (generating negative slack) if it slips too much.  Since it is a common practice to represent such commitments with late constraints or deadlines, this example is fairly typical of a situation that occurs routinely in complex schedules with multiple contract milestones.  It demonstrates why total slack is an unreliable indicator of the critical/near-critical path – i.e. the driving/near-driving path for project completion (or for anything else) –for all but the simplest projects.

There are some traditionalists in the scheduling profession who aim to preserve the sanctity of Total Slack (and Total Float in other tools) by prohibiting the use of any deadlines or late constraints in the schedule at all, regardless of contract commitments.  The same group should also prohibit the use of variable task calendars and any kind of resource leveling, since these can also invalidate their interpretation of total slack.  I understand and empathize with this point of view – after all, without meaningful Total Slack (especially in MSP), the typical planner or analyst is reduced to hand-waving explanations when it comes to answering the tough questions.  I’ve been there.  Nevertheless, I also think alarm bells should ring and the schedule should bleed red whenever there is a forecast failure to meet a commitment.  I advocate for methods other than setting aside 30 years of software development.

I spent a few minutes duplicating Ten Six’s schedule in MSP 2010 – thankful that they seem to be using the same (standard) example for the two articles published eight months apart.  I think I got it close enough for illustrative purposes – with the main factors being a 4-day project work-week (M-Th), a 24-hour calendar on the first two milestones, and the aforementioned late constraint on the fence.  Then I used BPC Logic Filter to trace the logic for the “Project Complete” task.

Here’s the resulting chart.  It shows the driving path for project completion (i.e. the “Critical Path”) – at Relative Float of 0.  The CP includes all the tasks with TS=0 plus the two project milestones which, because of their different calendars, have a different Total Slack value.  The first “Near-Critical Path” is actually 12-days (not 4 days) away from driving the project completion, and it includes the “Grade Site” task with the (synthetically reduced) TS=4.  The “Install Fence” task, also with TS=4, is 24 days away from driving the project completion.

TMB Copy TenSixExample 20150130-20150821

I didn’t write BPC Logic Filter to overcome all the shortcomings of MSP; rather I wrote it to extract and present the logic-related information that is already there but which MSP does not show.  In this case – as in most – it tells a more complete story than Total Slack alone.