FPM is being rebuilt from the ground up. Read about what's coming.
Back to Blog
CPM TheoryMarch 13, 2026·8 min read

Critical Path vs Longest Path

Why your schedule has both, and why it matters for forensic analysis

Ask a scheduler what the critical path is and you'll get a confident answer. Ask how it differs from the longest path and you'll get a pause. Most tools treat them as identical. They're not. The difference comes down to which calendar measures the float along each relationship, and it has real consequences for forensic analysis.

Two Float Measures, Two Calendars

In classical CPM, "critical path" and "longest path" are the same thing: the longest continuous chain of dependent activities through the network, with zero total float. That equivalence holds when every activity shares a calendar. Once calendars differ across relationships, the single float number splits into two, and the terms need to be separated.

Along each relationship, there can be a gap between when the predecessor finishes and when the successor needs to start. The question is: whose calendar do you measure that gap on? We use the terms pRFF and sRFF (our terminology, not industry-standard) to make this distinction precise.

pRFF
Predecessor Relationship Free Float
Float measured on the predecessor's calendar. A chain with 0 pRFF on every link is what we call the Critical path.
sRFF
Successor Relationship Free Float
Float measured on the successor's calendar. A chain with 0 sRFF on every link is what we call the Longest path.

Critical path (0 pRFF) answers a forward-looking question: can this predecessor slip without pushing the successor? If the answer is no along every link in the chain, delay anything on it and the milestone moves.

Longest path (0 sRFF) answers a backward-looking question: is the successor truly constrained by this predecessor, measured on the successor's own working time? If yes along every link, the chain is incompressible. It's what pins the milestone date.

Key point: When every activity shares a calendar, pRFF and sRFF are identical and these paths collapse back to the classical CPM critical path. The distinction only matters when calendars differ, constraints exist, or the schedule is progressed past the data date. In practice, that's most real schedules.

Three Scenarios

The relationship between critical and longest paths falls into three cases. In each diagram below, Task A is a predecessor feeding Task B, which finishes at the milestone.

Longest and Critical

0 pRFF0 sRFF
AB
Non-work dayWork dayMilestone
The gap days (dashed outline) are non-work days on both calendars. Measured on either calendar, float is zero. The path is simultaneously longest and critical.

Longest but not Critical

2 pRFF0 sRFF
AB
Non-work dayWork dayFloat (pRFF)Milestone
The gap days are work days on A's calendar (green) but non-work days on B's calendar (amber). A has 2 days of float on its own calendar (2 pRFF, not critical), but B can't start any earlier on its calendar (0 sRFF, longest). This is common in progressed schedules.

Critical but not Longest

0 pRFF2 sRFF
AB
Non-work dayWork dayFloat (sRFF)Milestone
The gap days are non-work on A's calendar (amber) but work days on B's calendar (green). A can't extend (0 pRFF, critical), but B could start 2 days earlier on its own calendar (2 sRFF, not longest). Another path is actually driving the milestone.

The As-Built Complication

Traditional float calculations use early dates and treat everything behind the data date as having no float. That's fine for forward-looking scheduling, but for forensic analysis we need to know what actually drove the milestone through the as-built portion of the schedule.

Our engine calculates "Actual Float" (as-built float) for both predecessor and successor calendars. Two situations require special handling: data date push and constraints.

Data Date Push

When the data date pushes a successor's start beyond where its predecessors would place it, the gap between each predecessor and the successor overstates the available float. Some of those days aren't consumable slack at all: the predecessor already finished, the successor hasn't started yet, and the schedule is just waiting for the clock to reach the data date.

We call it Wait (our terminology, like pRFF and sRFF above).

Wait
Data Date Idle Time
The days between a predecessor's logical finish and the data date boundary. The predecessor is done, the successor can't start yet. These days look like float but aren't available to consume. Subtracting Wait from apparent float gives actual float.

Data date driven: 3 predecessors, 1 successor

ABCDData Date2 Wait2 Wait + 2 Float2 Wait + 1 Float
Non-workWorkFloatWait Data Date Milestone
A → D
2 Wait / 0 float
On longest path
B → D
2 Wait / 2 float
C → D
2 Wait / 1 float

Traditional float would compute 2, 4, and 3 days respectively. Subtracting the 2-day Wait reveals A → D has zero actual float and belongs on the longest path.

Constraints

Constraints on successor activities create the same problem as data date push. A "Start No Earlier Than" constraint can hold a successor back, creating apparent float in the predecessor relationships that isn't actually available. We calculate "constraint-aware float" that subtracts the constraint push from the apparent gap.

Constrained as-built

ABCDStart Constraint2 Cstr2 Cstr + 2 Float2 Cstr + 1 Float
Non-workWorkFloatConstraintMilestone
A → D
2 Cstr / 0 float
On longest path
B → D
2 Cstr / 2 float
C → D
2 Cstr / 1 float

Why It Matters

These two float measures answer fundamentally different questions from opposite directions:

01

From the data date, what can be delayed without impacting the milestone?

Answered by pRFF. Forward-looking. Identifies activities on the critical path (0 pRFF = cannot be delayed).

02

From the milestone, what is causing the current finish date?

Answered by sRFF. Backward-looking. Essential for retrospective as-built analysis (0 sRFF = driving the milestone).

Predecessor float is about future risk: what can still slip. Successor float is about what's actually pinning the outcome. For forensic work, you can't delay something that already happened. The predecessor finished, the successor started. Predecessor float in the as-built section is just "observed gap," not consumable slack. Successor float stays meaningful: was this link tight, or could the successor have been pulled earlier?

Question #1 is well understood. The successor calendar is essential to answering question #2 in a retrospective analysis of the as-built, and that's where most forensic schedule disputes live.

What This Means for FPM

We compute both float measures for every relationship in the schedule. Our engine calculates predecessor-calendar float and successor-calendar float side by side, identifies critical paths, longest paths, and paths that are both. It also handles data date push ("Wait") and constraint-aware float so the as-built analysis correctly identifies what actually drove each milestone.

When you ask FPM "what's driving this milestone?", you get the full picture. The critical path tells you where future risk lives. The longest path tells you what's pinning the date. When those two answers differ, that's usually where the most interesting forensic questions are.

For the formal definitions, proofs, and additional worked examples, see our full whitepaper.