The critical path method, with a worked example
How to calculate the critical path by hand: the forward pass, the backward pass, and total float, worked through a six-task network.
The critical path is the longest chain of dependent work through a project. It sets the earliest possible finish date, and any task on it that slips moves that date. Here is how it is actually calculated, worked through end to end on a small network you can follow with a pen.
The network
Six tasks, with durations in working days and the tasks each one waits for. This is a small enough network to calculate by hand and large enough to have a non-obvious answer.
| Task | Duration | Depends on |
|---|---|---|
| A. Requirements | 5 days | – |
| B. Design | 8 days | A |
| C. Data mapping | 6 days | A |
| D. Build | 10 days | B |
| E. Migration scripts | 4 days | C |
| F. Testing | 5 days | D and E |
Two chains run in parallel after Requirements, and they converge on Testing. The question is which chain controls the end date.
The forward pass: earliest start and earliest finish
Work left to right. Each task starts as early as everything feeding it allows, which means the day after its latest predecessor finishes. Earliest finish is earliest start plus duration, minus one, because a task that starts on day 1 and runs five days finishes at the end of day 5, not day 6.
Where a task has several predecessors, it waits for the last of them. Testing cannot start until both Build and Migration scripts are done.
| Task | Duration | Earliest start | Earliest finish |
|---|---|---|---|
| A | 5 | Day 1 | Day 5 |
| B | 8 | Day 6 | Day 13 |
| C | 6 | Day 6 | Day 11 |
| D | 10 | Day 14 | Day 23 |
| E | 4 | Day 12 | Day 15 |
| F | 5 | Day 24 | Day 28 |
The project finishes on day 28. Note that Testing waits until day 24 even though Migration scripts finished on day 15: it is held up by Build, not by the migration chain.
The backward pass: latest start and latest finish
Now work right to left from that day 28, asking the opposite question: what is the latest each task could finish without pushing the end date?
Testing must finish on day 28, so it must start on day 24. Everything feeding Testing must therefore finish by day 23. Where a task feeds several successors, it is constrained by the earliest of them.
| Task | Duration | Latest start | Latest finish |
|---|---|---|---|
| A | 5 | Day 1 | Day 5 |
| B | 8 | Day 6 | Day 13 |
| C | 6 | Day 14 | Day 19 |
| D | 10 | Day 14 | Day 23 |
| E | 4 | Day 20 | Day 23 |
| F | 5 | Day 24 | Day 28 |
Total float, and the answer
Total float is latest start minus earliest start: how many days a task can slip before it costs you the end date. Anything with zero float is on the critical path.
| Task | Earliest start | Latest start | Total float | Critical? |
|---|---|---|---|---|
| A | Day 1 | Day 1 | 0 days | Yes |
| B | Day 6 | Day 6 | 0 days | Yes |
| C | Day 6 | Day 14 | 8 days | No |
| D | Day 14 | Day 14 | 0 days | Yes |
| E | Day 12 | Day 20 | 8 days | No |
| F | Day 24 | Day 24 | 0 days | Yes |
The critical path is A → B → D → F. Adding those durations gives 5 + 8 + 10 + 5 = 28 days, which matches the forward pass, and that agreement is the check that the arithmetic is right.
The migration chain, A → C → E → F, takes 20 days. The eight-day difference is exactly the float carried by C and E.
What to do with the answer
The immediate use is triage. Protect the four critical tasks, and understand that the migration chain has eight days of room before it becomes anyone's problem.
The more important use is repetition. The critical path is not a fact about your project, it is a fact about your project *as currently scheduled*. Complete a task early, let one slip, add scope, and the path can move to a completely different chain. In this network, an eight-day slip anywhere on the migration chain makes it critical too, and a nine-day slip makes it the critical path instead.
That is why calculating it once at planning time and filing it is close to useless. It has to be recalculated whenever anything changes.
How this works in Depentra
Depentra runs both passes automatically over your dependency network, on the current schedule including any delays applied, and shows total float per task as a property you can add to the table, filter to zero, sort, and export.