Float: the most misunderstood number in project controls
Everyone on a project says "float" several times a day. Rather fewer could tell you how it is calculated, why total and free float differ, what a negative value actually asserts, or who is entitled to spend it. Since float decides who pays for delay, that gap is expensive.
The word everyone uses and few can define
Sit in any progress meeting and count how often float gets invoked: "we've got float on that", "the float will absorb it", "don't worry, it's not critical". Now ask the room to write down the formula. In our experience perhaps one person in five gets it right, and the proportion does not improve much among people whose signature appears on extension of time submissions.
That matters because float is not a vibe. It is the arithmetic output of a specific calculation, and every claim made about it — including the claim that consuming it is free — can be checked against the network. This article is the check.
Where float comes from: the two passes
A CPM engine schedules a network in two sweeps. The forward pass starts at the project start and works left to right: each activity's earliest start (ES) is the latest early finish of its predecessors, and its earliest finish (EF) is ES plus duration. The forward pass answers one question — how soon could each activity happen?
The backward pass then starts at the project completion date and works right to left: each activity's latest finish (LF) is the earliest late start of its successors, and its latest start (LS) is LF minus duration. It answers the mirror question — how late could each activity happen without moving completion?
Float is simply the daylight between the two answers:
- Total float (TF) = LF − EF (equivalently LS − ES): how far an activity can slip before the project completion date moves.
- Free float (FF) = earliest ES of its successors − EF: how far it can slip before it disturbs any other activity at all.
On the critical path the two passes give the same dates, so float is zero. Everywhere else, the gap is the schedule's measure of slack — and the two kinds of slack behave very differently.
Total vs free float: why the distinction earns its keep
The practical difference is ownership of consequences. Free float is genuinely private: spend it and nobody else notices. Total float is shared along the whole path. In Fig 1, procurement (C) and installation (E) both show 3 days of total float, but there are not 6 days available — there are 3, and whoever slips first takes them.
This is the tragedy of the commons rendered in CPM form. Every activity owner on the path looks at their own TF column, sees a comfortable number, and treats it as theirs. The first to slip grazes the common; everyone downstream discovers their "spare time" has already been eaten. By the third or fourth update the path is critical and the meeting is asking how a path with "three days of float everywhere" became the problem.
Hence a habit worth stealing: when someone says an activity "has float", ask which kind, and if the answer is total float, ask who else is on the path. The TF column is a statement about a path; only the FF column is a statement about an activity.
| Float type | Formula | What it tells you | Typical misuse |
|---|---|---|---|
| Total float | LF − EF (or LS − ES) | Slip available before project completion moves — shared along the path | Treated as private slack by every activity owner on the path simultaneously |
| Free float | min(ES of successors) − EF | Slip available before any successor is disturbed — genuinely local | Ignored entirely; most reports never show it |
| Negative float | TF < 0 | The logic cannot meet a committed date — quantified shortfall | Suppressed with constraint changes instead of reported and explained |
| Project (terminal) float | Contract date − planned finish | Buffer between planned completion and the contractual deadline | Claimed as belonging exclusively to one party — see ownership, below |
Negative float: a delay notice in numeric form
Float can only go negative when something other than pure logic enters the calculation — a date that has been promised. The backward pass normally starts from the logic-driven completion date, which guarantees TF ≥ 0 somewhere. Anchor the backward pass to an earlier committed date instead, and activities whose late dates now fall before their early dates report negative float. The arithmetic is asserting something precise: as the logic stands, this commitment cannot be met, and the number tells you by how much.
In practice negative float arrives by three routes:
- Constraints. A Must-Finish-On or Finish-On-or-Before date pinned earlier than the logic can deliver. The constraint wins the argument about the late dates; the float column records the casualty.
- Contractual deadline activities. Sectional completions, access dates and interface milestones carried in the programme with late constraint dates. Each is a small anchored backward pass of its own, and each can drive its feeding path negative independently of project completion.
- Statusing slippage. The most common route: the programme was fine at baseline, but progress updates have pushed the forecast past a Must-Finish that never moved. Nobody added anything — the project simply slipped into the constraint.
Contractually, a programme submitted with negative float on a contractual path is a delay notice in numeric form, whatever the covering email says. Treating it as a modelling nuisance — or worse, quietly relaxing the constraint so the column turns black again — converts a clear early warning into a later argument about concealment. This is exactly why the DCMA 14-point assessment gives negative float a tolerance of zero: not because committed dates are never missed, but because every day of it must be visible, explained and actioned.
Who owns the float?
The classic dispute. The contractor finishes designing a path 20 days early, banks the float — then an employer variation lands on that path and consumes it. Has the employer delayed the contractor? The dates haven't moved. Or the reverse: the employer's free-issue equipment is late but arrives within float, and the contractor objects that its contingency has been spent by someone else.
Unless the contract says otherwise, the mainstream answer — reflected in the SCL Delay & Disruption Protocol (2nd edition, February 2017) — is that float is generally a project resource rather than the property of either party. The practical consequence is first come, first served: an employer delay that lands within available total float and does not push completion past the contractual date generally generates no entitlement to an extension of time, because the completion date is not — yet — being delayed. Entitlement crystallises when the float runs out.
The Protocol's position is guidance, not law, and it remains genuinely debated — contractors argue with some force that float is created by their means and methods and priced into their risk allowance, and a contract can expressly allocate it either way. But if your contract is silent, "the project owns it" is the position a tribunal is most likely to start from, and your programme narrative should assume so.
Float ownership is also where pacing lives: a contractor that deliberately slows its own work to match an employer delay is spending float in a way that later looks indistinguishable from contractor culpability — unless it was declared at the time. Pacing claimed retrospectively, with no contemporaneous record, is one of the hardest sells in concurrent delay disputes.
Float abuse: the two ways the column lies
Float is an output, so corrupting the inputs corrupts it — in either direction.
High-float pockets are usually missing logic. An activity showing 120 days of total float is rarely a relaxed activity; it is usually a disconnected one. With no successor tying it to the delivery strategy, the backward pass gives it late dates near project completion and the float balloons. This is precisely what DCMA check 6 exists to catch: no more than 5% of incomplete activities with total float above 44 working days. Pockets of enormous float are where scope drifts, because nothing in the dates creates urgency — and they are the first place we look when a network's logic density seems too thin.
Float suppression runs the same trick in reverse. Scatter enough hard constraints through a network and the backward pass is anchored everywhere: float collapses toward zero, half the programme reports as "critical", and the genuinely critical path is camouflaged among the artificially urgent. A schedule where 40% of activities show zero float is not a tight programme — it is an unreadable one. Both abuses are reasons to look at the distribution of float, not just its extremes.
Reading float like an analyst
Three habits, in increasing order of rarity. First, always establish against what a float value is calculated — project completion, a sectional milestone, or a constraint — because the same activity can carry a different TF against each, and P6's multiple float paths confuse this further. Second, read total float as a property of paths and free float as a property of activities, and refuse to let anyone average the two. Third, treat any sudden change in the float profile between updates as a logic change until proven otherwise: float does not move on its own, and the question "what did you change to make this number go green?" has rescued more than one of our forensic reviews. When the answer matters in anger — when float consumption becomes an entitlement question — you are into forensic delay analysis territory, and the quality of your float arithmetic becomes evidence.
Key takeaways
- Float is arithmetic, not opinion: TF = LF − EF; FF = earliest successor ES − EF. If a claim about float can't be traced to those formulas, it's a hope.
- Total float is shared along the path — a commons, consumed first come, first served. Only free float is private.
- Negative float means a committed date is already lost as the logic stands. Report it; never constraint it away.
- Absent contrary contract terms, the SCL Protocol's position is that float belongs to the project — plan and notify accordingly, and declare pacing when it happens.
- High-float pockets usually mean missing logic; mass zero-float usually means constraint abuse. The distribution tells you which.
See your programme's float honestly
Drop a P6 XER or MS Project file in your browser and get the full float distribution, negative float register and constraint audit in seconds. Nothing is uploaded.