Everything I check when I build a schedule, everything I check when I update one, and the judgment that the checks can't replace. Written for the scheduler who wants to be trusted with the whole job — the numbers are real, the sources are named, and none of it is decoration.
DRAWN FROM · DCMA-EA PAM 200.1 · GAO-16-89G · NDIA PASEG / GASP · UFGS 01 32 01 · AACE RPs 23R-02 · 24R-03 · 29R-03 · 37R-06 · 38R-06 · 45R-08 · 49R-06 · 53R-06 · 57R-09 · 64R-11 · 70R-12 · 78R-13 · 84R-13 · 92R-17 · NASA SP-2010-3403 · SCL PROTOCOL · WEAVER · WINTER · HARRIS · HULETT · O'BRIEN & PLOTNICK · MUBARAK
Before any mechanics: what the file on your screen actually is, and the eight tenets that define whether it deserves to exist.
A schedule is a model of how the job will actually be built — a falsifiable claim about crews, sequence, and time. It is simultaneously three other things: a communication instrument (the only document on the project that everyone from the foreman to the CFO reads), a measurement instrument (progress, payment, and earned value all hang off it), and a legal record (in any dispute, the schedule chain is Exhibit A, and tribunals use it to judge not just delay but your credibility). Every rule in this document exists to protect one of those four functions. When you're unsure why a rule exists, ask which function it defends.
Hold on to this number: SmartPM's analysis of more than 50,000 real construction CPM schedules rated 88% of them at medium-to-high risk of being ineffective — with missing logic the leading cause. The industry's base rate is failure. Most schedules are decoration around a date somebody wanted. The whole point of this document is to put you in the other 12%.
The NDIA's Generally Accepted Scheduling Principles (GASP) are the cleanest definition of the target I know. Eight tenets — the first five make a schedule valid, the last three make it effective. The order matters: polishing dashboards on an invalid schedule is the standing anti-pattern of our profession.
| # | Tenet | What it demands | Where it lives in your work |
|---|---|---|---|
| 1 | Complete | All authorized effort, the entire contract — subcontracted and external work integrated yet distinguishable. | What you add when scope changes; the WBS 100% rule. |
| 2 | Traceable | Realistic network logic, integrated horizontally and vertically. | Every relationship you draw. |
| 3 | Transparent | Full disclosure of status and forecast; ground rules, assumptions and methods documented. | The basis document and the narrative — not your head. |
| 4 | Statused | Regular, consistent updates of completed work and achievable remaining durations against a data date. | The monthly cycle (Part 7). |
| 5 | Predictive | Forecasts most-likely completion via valid logic and achievable durations. | The test that you would bet on your own dates. |
| 6 | Usable | Produces meaningful metrics for timely decisions. | Reporting, lookaheads, trend charts. |
| 7 | Resourced | Resources align with the baseline and forecast. | Loading and histogram feasibility. |
| 8 | Controlled | Baselined and maintained through a rigorous, repeatable, documented process. | Change control, versioning, the archive. |
The schedule you submit must be the schedule you build from. The moment the field runs on a whiteboard while the CPM is groomed for the owner, you have lost both the management tool and the legal record — courts benchmark against what was actually used.
The most common fatal flaw in baseline reviews is not bad logic — it is missing scope. Structure comes before sequence.
Build a deliverable-oriented WBS from the contract scope before you write a single activity, and hold it to the 100% rule: every WBS level captures all of the scope of the level above — nothing invented, nothing missing. GAO's first best practice is "capture all activities" because omitted scope is the defect that kills schedules quietly: the file looks complete, the metrics pass, and the critical path is fiction because the work that actually governs isn't in it. [GAO-16-89G BP1 · AACE 23R-02]
Decompose the way the job is actually managed — phase → area/floor → discipline/trade → work package — and mirror the cost-code/CSI structure, so the schedule, the estimate, the daily reports, and the pay application all speak the same language. When those four documents share a coordinate system, every cross-check in this guide becomes mechanical instead of heroic.
And scope means everyone's scope. The scope that gets forgotten is never yours — it's the owner's and the world's: design reviews, environmental permits, AHJ inspections, utility tie-ins, owner-furnished equipment, phased NTPs. Each is an activity with a duration and a responsibility code — never an assumption buried in a lag. For the owner, a scheduled obligation creates accountability. For you, it is the contemporaneous record that establishes entitlement when their review runs long. No activity, no clean delay analysis. [UFGS 3.3.6 · 78R-13]
One nature of work per activity. One responsible party, one trade, one feature of work, one location. "Submit and review shop drawings" must be split — you submit, they review, and responsibility for delay must land on exactly one party. "Install drywall and paint" must be split — different crews, different QC, different production rates. This rule, more than any duration cap, is what makes a schedule usable as a monitoring tool, a payment instrument, and a claims record at once. [UFGS 3.3.7]
Duration must be measurable between updates. The governing principle, stated verbatim in the federal spec: durations must "allow the progress of ongoing activities to be accurately determined between update periods." An activity longer than about two update cycles can't be objectively statused — percent complete becomes a negotiation instead of a measurement. The hard caps: 20 workdays under UFGS for non-procurement work; DCMA flags a schedule when more than 5% of incomplete tasks exceed 44 working days. Procurement and fabrication are the recognized exception — vendor elapsed time, not crew work. The design test is simpler than the caps: if you can't say what 50% done looks like, the activity is too big. [UFGS 3.3.2 · DCMA #8]
Names and IDs carry information. Verb-noun-location names with the defining content in the first 30 characters ("INSTALL CULVERT STA 0+00–1+00", not "Culvert works phase 2 continued"). Structured IDs with an area/discipline prefix and numeric gaps of 4–10 (FOUND-100, FOUND-110) so activities can be inserted without renumbering — because renumbering destroys update-to-update comparability, and that comparability is the audit trail every forensic analysis depends on. A tool-assigned A1000-series ID carries zero information and forces every reviewer to rebuild context. [UFGS 3.12 · Ten Six]
| Code | Meaning | Why it exists |
|---|---|---|
| RESP | Responsible party | Delay lands on exactly one party — the claims axis. |
| AREA | Work area | Defined as a space where a crew can only work one area at a time — makes trade handoffs auditable. |
| FOW | Feature of work | The QC and inspection axis. |
| WRKP | Workers per day | The crew loading behind every duration — feeds the histogram. |
| MODF | Modification number | Every activity added by change order is permanently tagged to its mod — the forensic trail for scope growth. |
| BIDI | Bid item / CLIN | The payment axis — cost loading aggregates to it. |
| PHAS / CATW | Phase / category | Rollup and filtering axes for reporting. |
Two P6 disciplines ride with the coding: keep activity codes and calendars at project level, never global — global data does not survive an XER exchange with the other party — and keep IDs at 10 characters or fewer. [UFGS 3.12]
You do not build five schedules; you build one network and present it at five levels. Detail lives where the work is near; far-future work rides in coarser packages that still carry logic to the contract milestones — that logic is what keeps the critical path and float meaningful through the back of the job. This is rolling wave, and the discipline that keeps it honest is detailing the next wave before the work arrives (the federal spec forces it: no payment for work not fully detailed). [AACE 37R-06 · PASEG]
| Level | Audience | Form | Cadence |
|---|---|---|---|
| L1 | Executives, sponsors | One page of milestones — go/no-go decisions | Monthly |
| L2 | Program management | 3–5 pages, areas and disciplines summarized | Monthly |
| L3 | Project team, owner | The full CPM network — the contractual schedule | Monthly update |
| L4 | Superintendents | Field detail; the 3–6 week lookahead is filtered from here | Weekly |
| L5 | Foremen | Daily crew plans | Daily |
Every level is a filtered view of the same network. The moment a summary is maintained by hand in PowerPoint, it diverges within two update cycles — GAO audits by tracing sampled activities across levels, and found dates off by a day, a week, and a month. If leadership sees a chart, you must be able to reproduce every date on it from the file.
The 10,000-activity vanity schedule: detail beyond what can be statused in one update cycle. The file decays into inaccuracy, the field abandons it for a whiteboard, and the schedule dies of its own weight. Detail is not rigor. Detail you cannot status monthly is a liability, and the DCMA duration check's rolling-wave exemption exists precisely so you never "fix" far-future durations by bloating the file.
Float, the critical path, and every forecast date are outputs of the relationships you draw. Logic is where schedules are won, gamed, and lost.
Finish-to-start is the default for a reason: it produces an unambiguous handoff whose status can't be argued. DCMA expects ≥90% FS; a healthy practitioner profile runs about 80% FS, 10% SS, 10% FF. Start-to-finish is effectively banned everywhere — it inverts normal logic and is almost always either a modeling error or a trick to hold a date. [DCMA #4 · UFGS 3.3.16]
A lag may represent exactly one thing: a genuinely time-consuming non-work condition — concrete cure, settlement. Never work. Work hidden in a lag is invisible: it cannot be statused, resourced, coded, or seen on any report, and the lag portion of a path never shows percent complete. The federal doctrine, verbatim in spirit: lags must be reasonable, must not substitute for realistic durations, must not absorb or create float, must not replace logic. [UFGS 3.3.16]
One activity with no predecessor (NTP), one with no successor (project completion). Everything else carries at least an FS or SS predecessor into its start and an FS or FF successor off its finish. The reason is mechanical: an activity with no successor cannot transmit delay — its slip silently vanishes from the completion forecast, and its float is meaningless. Open ends are the cheapest way to game float, which is why owner specs are stricter than DCMA's 5% tolerance. And do not "fix" open ends by wiring everything to the finish milestone — the statistic goes green while the network still can't propagate delay through the real work; you've hidden the defect from the next reviewer. [UFGS 3.3.11 · DCMA #1]
Hard logic is physics: foundations before columns, rough-in before cover-up. Preferential (soft) logic is your chosen sequence among feasible alternatives: which wing first, which way the crew flows. The interrogation question for every tie is — "what physically prevents the successor from starting earlier?" If the answer is a crew, a preference, or a resource rather than physics, the tie is preferential, and you must know it, because preferential logic is exactly what gets resequenced in a recovery and exactly what gets challenged in a claim as self-inflicted float sequestration. Disclose your major preferential decisions (crew flow direction, area order) in the basis document, so reviewers can tell plan choices from physical necessity. [AACE 24R-03 · 78R-13]
A network with only hard logic shows one drywall crew working every floor simultaneously. Then a delay hits, activities stack on top of each other in the model, and the schedule says the slip is recoverable when no contractor on earth could staff that stacking. Crew logic — soft ties chaining a crew's successive areas (drywall L2 → drywall L3) — is what makes the model tell the truth about a finite workforce. Its absence is the single most damaging omission in construction schedules. The visible signature of a healthy network is the trade train: each trade enters an area only after the predecessor trade releases it.
Every long-lead item (rule of thumb: any submit→approve→fabricate→deliver sequence over 90 calendar days) gets the full explicit chain: prepare/submit shop drawings → review & approval → fabrication → delivery → install, with review durations set to the contractual period — commonly 21–30 calendar days on federal work — not the optimistic 7-day cycle that forces rushed approvals. Work backward from required-on-site dates to derive latest-submittal dates, and code review activities to the owner so their queue time is visibly theirs. Submittal slippage compounds: two weeks late on a custom-equipment submittal routinely becomes six weeks on delivery, because you lost your fabrication slot. [UFGS 3.3.4]
Know the current lead-time reality cold — a scheduler who doesn't is building fiction. As of 2025–26: medium-voltage switchgear 52–80 weeks, pad-mount transformers 40–65, substation-class transformers 75–110, diesel generators 50–78 (large units 90–110), big UPS 30–60, applied chillers ~40, custom AHUs 16–28. The data-center rule generalizes: if you're not ordering electrical gear 12–18 months before mobilization, you're already behind. [Terrapin CG 2026]
Construction proceeds area by area; startup and commissioning proceed system by system — and your logic must pivot where they meet. Mechanical completion of a system spans areas; central plant starts before distribution; power, controls, water, and ductwork all converge before an AHU starts; TAB, functional testing, and integrated systems testing run in sequence, not in one "commissioning" bar. A baseline that carries area logic to the end systematically understates the finish — the last 5% of ten areas is the first 100% of every system, and the schedule must show which incomplete area blocks which system. Tie substantial completion to this systems logic; it is what stops liquidated damages. [UFGS 3.3.5]
Interrogate every link with one question — "what physically prevents this from starting earlier?" — and every missing link with its mirror: "if this slips a month, what should feel it?" If the network doesn't answer both the way the superintendent would, the network is wrong, whatever the metrics say.
A dangling SS: "Pull wire" drives "Terminate" start-to-start, nothing drives Terminate's finish. Pull wire slips three weeks; Terminate's finish doesn't move; the completion forecast holds; everyone relaxes. The slip surfaces at system energization — months later, with zero float left. One missing FF companion link, and the schedule lied for a quarter.
Every duration is a claim about a crew and a production rate. Every calendar is a claim about when work can happen. Margin is time you own on purpose.
The formula is not optional: Duration = Quantity ÷ (crew daily output × number of crews × efficiency) — output from your own history first, subcontractor input second, RSMeans crew tables or DOT production-rate databases third, with an efficiency factor for congestion, weather exposure, and site conditions. The reason is auditability: when the owner challenges a 15-day duration, "take-off shows 12,000 SF at 800 SF/day" ends the argument; "experience" does not. The same quantities feed the cost loading, so time and payment stay coherent — and the build-up exposes infeasible plans before day one, because a milestone that needs a production rate no crew has ever achieved is wrong at submission, not at month nine. [FHWA · RSMeans · UFGS 3.3.15]
Two tells reviewers use on your durations, so use them on yourself. Honest long durations come in even multiples of 5 workdays; odd durations on or near the critical path (a 23 here, a 31 there) are the classic sign someone reverse-engineered the network to land on a date. And concurrent activities of the same trade must sum within the crews the estimate actually carries — the histogram check below. [Winter]
Assign each activity the calendar its work logically belongs to: the 5-day project calendar with holidays for crew work; a 7-day calendar for cure and owner acceptance periods; seasonal calendars for paving and earthwork; weather calendars for weather-sensitive outdoor work. The weather calendar is the contract-preferred method (AACE 84R-13): take the anticipated adverse-weather table — NOAA 30-year normals, stated per month — and block those days as non-work days, so weather-sensitive durations stretch automatically without padding. A practitioner's trick: place the blocked days Tuesday–Thursday so they never collide with Monday holidays. Why it matters beyond neatness: weather scatter in calendars — not durations — is what lets a time-extension analysis cleanly separate unusually severe weather (excusable) from the normal weather you already own. A contractor who never planned normal weather cannot claim it. [UFGS 3.3.9 · AACE 84R-13 · Winter]
And one discipline that will save you a Part-4-sized headache: every calendar carries the same hours per day (8) and the same day start/end times. Mixed day-lengths corrupt float display and date arithmetic at the boundaries.
Load the baseline because an unresourced schedule is a set of unfalsifiable assertions — durations that can't be checked against crews, recovery plans that can't be verified, payment that can't flow from progress. On owner work the schedule is the payment mechanism: activity cost aggregates exactly to the pay items, the earnings report from the update drives the invoice, and front-end loading is prohibited by name. Cost-load closeout deliberately — punch list at ≥1% of contract value, O&M manuals, as-builts — so money remains on the table to keep crews engaged through turnover. [UFGS 3.2, 3.3.20 · GAO BP3]
Then run the one feasibility check no metric replaces: the manpower histogram, per trade. It should build, plateau, and taper — roughly bell-shaped. Sharp isolated spikes mean trade stacking or missing crew logic. A peak far above the trade's average (suspicion starts around 1.5–2×) means the plan needs more crews than the market, the site, or supervision can support — and check the peaks against site capacity: hoisting, laydown, badging. A baseline whose histogram is infeasible will fail in month three no matter how clean its DCMA score is. [78R-13]
On leveling: the auto-leveler answers a real question ("with these resource limits, when does the work finish?") but produces dates no logic trace can explain, unstable across runs — and float from a leveled schedule is fiction. For a contractual baseline, encode resource reality as crew logic instead, and keep the critical path traceable. If you must level, declare it, and stop quoting float. [Weaver]
Three different things get called "float," and confusing them is expensive. Total float is a shared network byproduct — it belongs to the path (and contractually, usually to the project), and whoever needs it first uses it. Contingency/margin is deliberately allocated reserve, sized from risk analysis, owned by the PM, and visible. Padding is margin hidden inside durations or lags — invisible, consumed silently by whoever runs late first, double-counted the moment a risk analysis adds uncertainty on top, and condemned by every owner spec and float-sequestration case. The honest implementations: a named, zero-resource schedule margin activity immediately before the completion milestone (NASA/PASEG practice — consumption shows as its duration shrinking); or the project float between your early finish and the contract date, disclosed. NASA's sizing defaults where no risk analysis exists yet: 1–2 months of margin per year of duration in design and construction, roughly double through integration and testing. [NASA SP-2010-3403 · PASEG · AACE 70R-12]
Margin is visible, named, owned, and tracked — or it is padding. There is no third category. A reviewer who finds one padded duration reprices every duration you've ever submitted.
The difference between a scheduler and a software operator is that the scheduler can explain, by hand, why the engine moved a bar. This part is that hand.
The forward pass walks the network left to right: each activity's early start is the latest condition imposed by all of its predecessor links — not just the last FS one — and early finish = ES + duration, counted on the activity's own calendar. The backward pass mirrors it from the finish: late finish is the earliest condition imposed by all successor links; late start = LF − duration. Total float is the gap between the two: TF = LF − EF = LS − ES.
One hand-calculation trap: in whole-date arithmetic, EF = ES + Dur − 1 — a 1-day activity starts and finishes on the same date — while a time-based engine like P6 computes at instants (start 08:00, finish 17:00) and never shows the −1. If your hand check is off by exactly one day, you mixed the two conventions. [Weaver]
Float is an output. You never type it, never "manage" it directly; you change it only by changing logic, durations, calendars, or constraints. Anyone who asks you to "add float" is asking you to change the model — make them say which input they want changed.
| Float | Definition | What it is for |
|---|---|---|
| Total float (TF) | LF − EF | The path's margin to project completion. Belongs to the path, not the activity — spending it on one activity strips it from everything downstream. Contractually, usually the project's. |
| Free float (FF) | min(succ ES) − EF | How far this activity slips before any successor feels it — the trade-handoff protector. Can never be negative. Weaver's advice: put FF on barcharts, not TF — a 10-activity chain with 10 shared days shows one honest FF bar, not ten misleading TF bars. |
| Interfering float | TF − FF | Slip that doesn't move completion but does hit successors — the portion you spend at your neighbors' expense. |
| Independent float | flex regardless of neighbors | The only float an activity truly "owns"; what sophisticated levelers consume first. |
| Relative / path float | TF vs a chosen reference | How you rank parallel near-critical paths against each other in analysis. |
| Negative TF | backward pass anchored earlier than forward pass can achieve | Exists only because of a constraint. Diagnose it by finding the constraint the backward pass is anchored to — never by hunting activities. |
A constraint is a date wired into the passes. Sort every type by what it clamps, and the safe-versus-dangerous split falls out on its own:
| Constraint | Clamps | Effect | Verdict |
|---|---|---|---|
| Start No Earlier Than (SNET) | Forward pass only | Delays ES; cannot create negative float by itself | The benign one — external data feeds (NTP, permits, deliveries) |
| Finish No Later Than (FNLT) / Start No Later Than | Backward pass only | Cuts late dates — silently destroys float, manufactures negative TF | Only on contract milestones, disclosed |
| Start On / Finish On | Both passes | Pins the date both directions | NTP milestone only, per spec |
| As Late As Possible (ALAP) | Early dates pushed late | Deliberately consumes free float; makes the activity driving | Just-in-time deliveries only — never on work you might need early |
| Mandatory Start / Finish | Overrides logic entirely | Pins both passes AND stops float flowing through the node — upstream negative float is masked | Never. It makes the model capable of contradicting its own logic |
| Expected Finish | Recomputes RD each run | Not a date clamp — silently rewrites remaining duration | Avoid; it fights your statusing |
| Project Must Finish By | Seeds the whole backward pass | One slipped update turns the entire driving chain negative overnight | Know it's there before you explain float to anyone. Prefer constraining the completion milestone instead |
The policy that falls out (and that owner specs codify): two constrained dates — a Start On at NTP, a late-finish constraint on contract completion (so negative float becomes a meaningful early-warning signal) — and everything else earns its constraint case by case, documented. Every float conversation begins with a constraint inventory. [UFGS 3.3.8 · DCMA #5]
Float is stored in hours and expressed in each activity's own calendar, so the same real-world slack reads as different numbers on different calendars — and a driving-path activity can carry phantom float across a calendar boundary. Weaver's canonical case: a 24×7 engineering activity finishing Friday 21:00 feeding a 5×8 commissioning activity that can't start before Monday 08:00 shows 59 hours of float while sitting on the critical path. This is why "filter TF ≤ 0" draws a critical path with holes in a multi-calendar schedule, and why P6's Longest Path option exists: criticality by driving-relationship trace from the latest finish, not by float value. Know its limits too — it traces one chain, ignores paths driving interim milestones, and needs the Multiple Float Path tool to enumerate the parallel drivers. Defenses: common 8-hour days everywhere, as few calendars as possible, critical = longest path, and a TF ≤ 2-day band to sweep in near-parallel work across weekend gaps. [Weaver · Harris · AACE 49R-06]
When work starts before its logic allows — and it will — the scheduling mode decides where the remaining work goes. This single setting changes the forecast more than most logic edits:
| Mode | Remaining work goes… | Consequence | Verdict |
|---|---|---|---|
| Retained Logic | Behind its incomplete predecessors | Conservative forecast; preserved logic; visible "work gap" after the data date that flags OOS | The only defensible default — mandated by owner specs |
| Progress Override | Continues from the data date, violated link ignored | Optimistic forecast; logic quietly broken; and P6 stops detecting circular relationships when a loop member is complete — garbage with no warning | Reject schedules calculated this way |
| Actual Dates | Honors actuals typed in the future | Demonstrably wrong output — unexplainable negative float appears with no cause | Never |
If retained logic's forecast looks wrong because the crew genuinely will continue out of sequence — fix the logic to match the field (that is what the update is for), don't switch the mode. Winter's surveys of real schedules put the scale of OOS beyond argument: roughly 36–40% of started activities start out of sequence, an average of ~70 workdays early. OOS is the normal condition. Part 7 covers the discipline. [Harris 2023 · Winter 2018–19]
| Gotcha | Mechanism | Defense |
|---|---|---|
| The midnight default | A date typed without a time historically lands at 00:00 — which CPM reads as the end of the prior day. Actual finishes record a day early; 1-day activities collapse to zero; constraints fire a day early. | Display times always; audit imports for 00:00 stamps on actuals and constraints. |
| Hours-per-time-period | Dates are stored as Julian decimals to the minute; day displays divide stored hours by a conversion factor. Mismatch it with calendar hours and you get "5d 4h" float mysteries. | Match the factor to the calendars; audit in hours when numbers look wrong. |
| Lag calendars | One global option decides whether a lag counts on the predecessor's, successor's, 24-hour, or default calendar — the same network recalculates to different dates under each. | Record the setting in the basis document; re-verify dates after any exchange or import. |
| Date-field literacy | Start/Finish columns show early dates, then actuals; typing into them on a completed activity overwrites the actual dates without warning. Planned dates freeze and go stale. | Know which field each column shows; never hand-type in Start/Finish; check completed-activity edits in review. |
| LOE and WBS summaries | Their dates are derived from other activities. Logic through them creates false drivers; their displayed "float" is an artifact (EF and LF can come from different, unconnected members). | No driving logic on LOE; no resources on summaries; report float only at activity level. |
| Resource leveling | Moves dates with no logic trace; silently re-levels at every F9 if the option is on. | Crew logic instead, for contract schedules; if leveled, say so and stop quoting float. |
Settings are part of the schedule. Retained logic vs override, lag calendar, critical-path definition, open-ends treatment, float computation — record all of them in the basis document and verify them every cycle, because two parties running the same file under different settings are looking at two different schedules.
The screening frameworks every serious reviewer runs — what each check actually catches, the thresholds, and when a "failure" is legitimate.
First, the right posture: the DCMA 14-point assessment is a minimum integrity floor, not a certification of realism. A schedule can pass all fourteen and still be unbuildable, unresourced, and unowned. Every threshold is a tripwire that obligates investigation — the expert response to a red metric is "why is it like this, and is the reason documented," never "make the number green." Cosmetic fixes are worse than red metrics, because they hide the defect from the next reviewer. [DCMA-EA PAM 200.1]
| # | Check | Threshold | What it actually catches | When failing is legitimate |
|---|---|---|---|---|
| 1 | Missing logic | < 5% | Open ends that can't receive or transmit delay — the #1 real-world defect | Start/finish milestones; external interfaces |
| 2 | Leads (negative lag) | 0 | Successors starting before their driver produced anything | Never — model overlap honestly instead |
| 3 | Lags | ≤ 5% | Invisible time no one can status or resource | Genuine non-work waits (cure, transit) |
| 4 | Relationship types | FS ≥ 90% | Networks compressed by overlapping everything; dangling SS finishes | Fast-track work — with paired SS+FF |
| 5 | Hard constraints | ≤ 5% | Dates that no longer respond to logic; manufactured negative float | A handful of truly external dates, each justified |
| 6 | High float (>44 wd) | ≤ 5% | Usually missing successors — high float as a proxy for incomplete logic | Genuinely non-time-critical work; long programs. Interrogate, don't cap |
| 7 | Negative float | 0 | The network can't meet a constrained date — the model is already late | Temporarily, with a dated recovery plan; else forecast the slip honestly |
| 8 | High duration (>44 wd) | ≤ 5% | Activities too big to status objectively | Procurement; rolling-wave packages (the formula exempts them by baseline start) |
| 9 | Invalid dates | 0 | Forecasts in the past, actuals in the future — a broken update process | Never. The closest thing to an absolute rule here |
| 10 | Resources | 0 missing | Durations with no crew behind them | N/A where the contract doesn't require loading |
| 11 | Missed tasks | ≤ 5% | The baseline isn't being hit — performance or a baseline that was never achievable | Right after a directed change, before re-baseline |
| 12 | Critical path test | pass | Inject ~600d into a critical activity: completion must move day-for-day. The only end-to-end functional test of the network | —; run it on multiple paths, on a copy |
| 13 | CPLI | ≥ 0.95 | Required efficiency on the critical path: (CPL + TF) / CPL | Meaningless without the milestone constraint — see gaming, Part 9 |
| 14 | BEI | ≥ 0.95 | Task throughput vs baseline plan | Read with Hit Task % and by criticality — see gaming, Part 9 |
GAO-16-89G is the owner-side acceptance framework: ten best practices rolling up into four characteristics of a reliable schedule. The assessor's trick worth stealing: the practices are interrelated — a major deficiency in sequencing (BP2) automatically caps the scores for the critical path (BP6), float (BP7), and traceability (BP5). One rotten practice poisons the set.
| Characteristic | Built from | The assessor's question |
|---|---|---|
| Comprehensive | BP1 capture all activities · BP3 resources · BP4 durations | Is all the WBS work present, resourced, measurably sized? |
| Well-constructed | BP2 sequencing · BP6 valid critical path · BP7 reasonable float | Is it a logic-driven network whose CP and float mean something? |
| Credible | BP5 traceability (horizontal + vertical) · BP8 schedule risk analysis | Does it reconcile across levels, and has anyone priced its uncertainty? |
| Controlled | BP9 updates with actuals & logic · BP10 baseline + basis document | Is there a disciplined update cycle and a protected baseline? |
The quantitative screen must be paired with the qualitative review the metrics cannot see (AACE 78R-13): full scope inclusion, constructability of the sequence, timing/phasing sanity (weather windows, seasons), contract compliance, clear activity descriptions, resource balance, appropriate level of detail. And the acceptance process itself is a negotiation with rules of restraint — the owner shouldn't insist beyond the contract, acceptance is not approval-as-liability-transfer, and an accepted baseline legally functions as the reference frame for every future negotiation. Two review-table traps: an early-completion baseline (accepting one can make the owner liable for delay costs even if the job finishes by the contract date — demand full resource loading before entertaining it), and unenforced spec deviations (repeatedly letting a clause slide can waive it; acknowledge deviations in writing, with limits). [Winter · 78R-13]
Finally: a baseline is not reviewable without its basis document (AACE 38R-06) — scope basis, duration and productivity bases, calendars including weather, constraint inventory, float strategy, calculation settings, long-lead assumptions, exclusions, and the risk position. The schedule records what and when; the basis records why. Without it, change management has no reference, your successor inherits a black box, and in a dispute you cannot prove what the plan assumed.
Run the 600-day test yourself before anyone else does. Pick a critical activity, inject a gross slip on a copy, and watch the completion milestone. If it moves less than day-for-day, something — an open end, a constraint, a mandatory date — is eating delay, and your schedule is lying about every forecast it makes.
A CPM date is a single-point calculation with an unstated probability — and the probability is usually terrible. Know the three mechanisms, and never hand a raw CPM date to a decision-maker as a commitment.
In Hulett's worked construction case, the deterministic completion date had about a 4% chance of being achieved, and the P80 sat roughly seven months later. Three mechanisms drive that gap: duration estimates are optimistic and their distributions right-skewed (there are more ways to be late than early, so the mean lands later than the P50); risk events — things that may or may not happen — are absent from the deterministic model entirely; and network structure adds merge bias at every point where parallel paths converge. [Hulett · GAO BP8]
A deterministic date is a coordination tool, not a forecast. The forecast is a distribution — and until a simulation has priced your merge points, the honest answer to "will we make it?" is "the model says yes about 4 times in 100."
Building the schedule is a project; updating it is a discipline. This is where most schedules die — and where yours earns its authority.
Walk the job with the schedule in hand. See the physical state — rebar set versus poured versus stripped — then confirm dates against the daily reports, never against memory. The contractual teeth are real: on federal work, actual dates that contradict the daily QC reports are explicit grounds for schedule disapproval, which blocks the pay application. And in a dispute, every contradiction between your actuals and the dailies impeaches the whole schedule as a record. Status weekly even when you report monthly — problems should surface before the month closes, not in the update meeting. [UFGS 3.3.12 · GAO BP9]
The interview at the workface is six questions per activity (PASEG): started? — when. Not started? — when will it, and what's blocking it. Finished? — when. Not finished? — how many workdays to finish (remaining duration, never percent). What's physically complete? And for loaded work, what hours remain? Ask duration, not percent, because a foreman seven days into a ten-day activity says "70%" even when all the hard work is left — "how many more days" is a question field people can actually answer.
Remaining duration answers "how many workdays of work remain." Physical percent answers "how much of the deliverable exists." They are independent judgments, entered separately, with the software link between them disabled — the spec says it verbatim: independent functions. The engine only ever forecasts from RD; earned value only ever reads physical %. Let the tool derive one from the other and you get the 90% syndrome: the schedule "finishes" arithmetically while the work stalls — teams reporting 90% by impression are routinely 60–70% by effort, because the tail (testing, punch, integration, closeout) is the open-ended part. Structural defenses: earn % from measured quantities; re-estimate RD from the work actually left and the crew actually available; compare duration-% against physical-% every period and chase divergence; and when an activity lingers at high percent, split the remainder into its own activity so the tail has a duration, logic, and an owner. [UFGS 3.3.12/18/19 · PASEG 9.1.2]
For quantity-driven work, remaining duration = remaining quantity ÷ demonstrated rate — the recent 3–4 week actual from the dailies, not the bid rate, not the baseline rate. Planned 20 boards a day but running 12? The RD is computed at 12 until something concrete changes — a named crew, a second shift — and the update meeting is where that something gets named. This single habit, applied to every critical and near-critical activity, is what separates a forecast from a wish, and it moves completion dates months before a percent-driven schedule admits a problem.
Blocked work gets modeled, not dragged: if it waits on an incomplete predecessor, status the predecessor and let logic move it; if the blocker is unmodeled — a permit, an RFI, an owner decision — add the missing predecessor, because "awaiting decision on CO-14" in the network is a contemporaneous causation record, while a silently dragged date is nothing. Suspended work gets split, so the restart is a discrete activity with remobilization time in it.
And when recovery is claimed, believe it on three conditions only: the mechanism is named and resourced (crews, shifts, resequence — visible in the loaded schedule); the implied production rate doesn't materially exceed anything demonstrated; and one or two update cycles actually show the promised rate before downstream commitments believe it. Run PASEG's bow-wave check as the standing counter-test: unstarted tasks pushed one period ahead, every period, compress the final months into a rate spike the project has never achieved.
Expect a third of started activities to be out of sequence — that's the measured base rate, so a report showing zero OOS means nobody looked. The routine: run the OOS report every period, and first verify the predecessors' status — a large share of "OOS" is a statusing error, classically a forgotten procurement activity nobody marked complete. For real OOS, repair the logic to match how the field is actually building, case by case with the superintendent; leave it only when it's a benign early start against soft logic, and even then say so in the narrative — the spec demands either the correction or the justification, never silence. Never "clean up" OOS by flipping to progress override. [Winter · UFGS 3.3.13]
"Chasing green": each month, trim a few remaining durations, add a helpful preferential tie, flip one setting — and the completion date holds. Management sees green until roughly the 80% point, when the accumulated delay surfaces all at once, with no time left to recover and a diff trail that reads as manipulation. The schedule that admits a slip early is the one that saves the job — and the scheduler.
Every update is a page in the project's permanent record. Write it as if a delay analyst and a judge will read it in three years — because on the jobs that matter, they will.
The monthly narrative is analysis, not a table dump — the spec's phrase is your "thorough analysis of the schedule output." The federal standard is the cleanest checklist in the industry: [UFGS 3.5.2]
Element 5 deserves the emphasis: the reviewer will diff your native file and find every change anyway. An undisclosed change discovered by the reviewer reads as manipulation even when innocent — and one such discovery converts every future submission into an adversarial review. Disclose everything; run the diff yourself first.
State facts with dates and activity IDs. Identify delays and causes in the period they occur — a delay first mentioned twelve months later looks invented, and the notice clock (typically 5–28 days, 21 common) may have already killed the entitlement. Record weather against the contract's anticipated table. Log time-extension requests and their status. Never casually assign yourself fault, and never stay silent about a problem the daily reports show — silence next to a documented problem is impeachment material. The monthly exchange of update, narrative, review comments, and responses is the schedule record of the project. [AACE 45R-08]
Between updates: actuals and remaining-duration re-estimates are your normal work. Structural changes are controlled — activities are not added or deleted without approval (an ID or description change counts as a new activity); original durations don't change without justification; approved change-order fragnets, coded to their mod, are the legitimate vehicle for new scope. Never delete from a baselined schedule — zero it, mark it, document it — because deletion breaks logic and destroys comparability.
Re-baselining is legitimate exactly when the contract changes the plan of record: an executed mod with time, a directed and accepted recovery schedule, an agreed resequencing — processed through change control, with the superseded baseline archived, never overwritten. Re-baselining because the variances have grown embarrassing is the cardinal sin: it erases the variance history, converts the schedule into a political instrument, and forfeits the contemporaneous record that any later analysis — yours or theirs — depends on. The tell: if the motivation is to make the variance report look better rather than to reflect an agreed change in obligations, it's the sin.
Each period's approved update is frozen as a uniquely named native file (XER/XML — a PDF is a picture, not a schedule), and next month starts from a copy. The period-by-period native archive is the raw material of every retrospective delay method; a missing or overwritten period is an unfillable hole that analysts treat with suspicion. File the narrative, the reports, and the minutes with the same period so the record set stays coherent. This is cheap discipline with enormous option value: the strongest analysis methods years from now are exactly the ones that need every update in native format. [UFGS 3.5.1 · AACE 29R-03]
The schedule's authority is cumulative. Every honest, disclosed, well-documented update adds to it; one fabricated date, one hidden edit, one quiet re-baseline spends all of it at once — and it does not come back.
The signal is never in a single update. It is in the drift — of milestones, of float, of indices — and in the gap between what the indices say and what they hide.
Every period, plot the current forecast of contract completion and each key interim milestone. A line drifting later at a steady rate is the plainest statement in project controls: the plan is losing time systemically, even while each individual update has a perfectly good explanation. Senior management reads this one chart faster than any table you will ever build.
Compare total float on the critical and near-critical paths to last period, every period. Decreasing float on a near-critical path means it is about to go critical — and a path losing 5 days a month will overtake a static critical path while everyone watches the wrong bars. Watch the population too: a swelling count of activities under ~10 days of float signals a volatile critical path and coming resource strain.
| Index | Formula | Flag | What it hides — read it with |
|---|---|---|---|
| BEI | tasks completed ÷ tasks baselined to finish by now | < 0.95 | Equal weighting: 100 trivial completions mask a slipping critical path. Disaggregate by criticality; pair with Hit Task % (on-time completions among this month's due tasks — can't be inflated by working ahead). BEI > 1.0 from completing easy far-future work is a warning, not good news. New tasks left unbaselined silently drag it down; quiet re-baselining resets it to innocence. |
| CPLI | (CPL + TF) ÷ CPL | < 0.95 | Required efficiency on the critical path. Meaningless without the milestone constraint — relax the constraint and CPLI snaps to 1.00 with zero real improvement. A long path dilutes it: compute per key milestone, not just the end. |
| Missed tasks | finishes later than baseline ÷ due by now | > 5% | Whether the baseline is being hit at all. Chronic failure with a green BEI = many tasks finish, just late. |
| SPI / earned schedule | EV ÷ PV (time-based) | trend | Same equal-weighting caveat; trend it, never read a single month. |
Pre-agree the triggers, then honor them: any critical-path slip, any milestone forecast crossing its contract date, float on the near-critical band eroding two periods running, BEI or CPLI under 0.95 — each obligates a documented corrective-action discussion, in the narrative, that period. A threshold that doesn't trigger anything is decoration.
Everything so far can be audited. What follows can only be practiced — and it is what separates the scheduler people trust from the one who runs the software.
The judgment behind every good network is construction sense: which crew goes where next; whether the tower crane and hoists can actually feed the floors at the pace the bars imply (on high-rise work, vertical transportation is often the true critical resource); that finishes need conditioned air, which needs an AHU started, which needs permanent power, controls, water, and ductwork all converged; that the envelope must close before the weather window does. A sequence review that ignores laydown, hoisting, and seasonality is not a constructability review — it's a topology check.
The consensus of every good planner I know: to plan something, you should know how to build it. Field time first; quantities and estimating second; software third. If your career hasn't allowed enough of the first two yet, borrow relentlessly — which is the next point.
A baseline built alone at a desk fails the constructability review and, worse, fails the field — supervisors treat owner-required CPM as irrelevant unless they helped make it, and a schedule nobody owns fails no matter how technically clean it is. Run the planning session with the PM, procurement, superintendents, and the major subs; get subcontractor sign-off that their portions are achievable (a date imposed on a sub is a wish; a date a sub signed is a commitment); and bridge to the field through the cascade — master schedule → phase pull plan built backward from milestones with the trades in the room → six-week lookahead for constraint removal → weekly commitments → daily plan. The lookahead is filtered from the current update, activity IDs and all; a lookahead that doesn't trace to the master is a parallel universe, and the drift between them is your earliest warning that the field has abandoned the plan.
Before you draw a bar, read the contract for the five clauses that decide money: notice provisions (5–28 day windows; blowing one can waive the claim entirely — you are often the first person positioned to flag a noticeable event); float ownership language (float-sequestration clauses hide deep in scheduling specs); the NTP definition; the definitions of substantial completion / beneficial occupancy (they end liquidated damages — schedule them as milestones exactly as defined); and the schedule spec itself, because an accepted baseline functions as the reference frame for every future negotiation.
Reviewing the other side's work, hunt the float-sequestration kit: preferential logic soaking up float, odd durations landing exactly on the contract date, lags that aren't cure, constraints that stop the network flowing, buffers that vanish whenever delay occurs — and in updates: backdated actuals, decreasing percents, activities riding the data date, unexplained calculation-mode switches. The distinction that survives scrutiny: genuine conservatism is visible, explained, and consistent (weather calendars, named margin, resource-limited sequencing); sandbagging is buried, asymmetric, and only ever helps one party.
And on your own side of the table, the line is bright: the schedule must represent the plan you actually intend to execute. Aggressive-but-real sequencing is advocacy; steering the critical path with shaved durations, backdated actuals, or logic that deviates from the real construction approach is falsification — it destroys credibility precisely where schedules matter most, and modern diff analytics surface it anyway. Claims-aware, never claims-driven: keep the record impeccable so any future analysis is easy, but the moment the claim becomes the schedule's purpose, the field ignores it and the tribunal discounts it. You lose both ways.
| Anti-pattern | What it looks like | What it costs |
|---|---|---|
| The compliance schedule | The submitted CPM is groomed for the owner; the field builds from a whiteboard | Fails as management tool and as evidence — courts benchmark what was actually used |
| The vanity schedule | 10,000 activities nobody can status in a month | Decays into fiction; the field abandons it |
| Chasing green | Durations shaved and soft logic added monthly to hold the date | The delay surfaces all at once at ~80%, unrecoverable |
| Resequencing in the dark | Logic edits during updates, undisclosed | Reviewer trust, permanently; the delay analysis, fatally |
| The claims schedule | Logic that deviates from the real build to posture entitlement | Discounted by the tribunal it was built to impress |
| The office scheduler | Status harvested from emailed percents | Backdated actuals, riding-the-data-date bars — and the field's respect |
| The undeveloped back half | Rolling wave with no rolling — far phases never detailed | The true critical path through the back of the job is unknown exactly when early decisions depend on it |
The working thresholds, caps, and rules of thumb from every part of this document. Print this one.
| Rule | Number | Source |
|---|---|---|
| Non-procurement activity duration cap | ≤ 20 wd / 30 cd | UFGS 3.3.2 |
| High duration / high float screening threshold | 44 wd · ≤5% each | DCMA #6/#8 |
| Relationship mix (healthy profile) | ~80% FS · 10% SS · 10% FF | DCMA #4 ≥90% FS |
| Leads / SF relationships | 0 · 0 | DCMA #2 · UFGS |
| Lags: share of links; max length | ≤5% · ≤ predecessor duration | DCMA #3 · practice |
| Open ends | exactly 2 | UFGS 3.3.11 |
| Constrained dates by default | 2 (NTP + completion) | UFGS 3.3.8 |
| Hard constraints tolerance | ≤ 5%, each justified | DCMA #5 |
| Long-lead procurement chain threshold | > 90 cd → model every step | UFGS 3.3.4 |
| Owner review durations in the chain | 21–30 cd (contractual) | federal practice |
| Activity ID length; insertion gaps | ≤10 chars · gaps of 4–10 | UFGS 3.12 |
| Critical + near-critical population caps | ~30% · ~50% | Winter |
| Manpower histogram spike suspicion | ≥ 1.5–2× trade average | 78R-13 practice |
| Rule | Number | Source |
|---|---|---|
| Status frequency vs reporting | one level more often (monthly→weekly) | GAO BP9 |
| Update meeting; final submission | within 5d of DD · +4 wd after | UFGS 3.6 |
| Invalid dates (actuals after DD, forecasts before) | 0 | DCMA #9 |
| Unstarted activity RD vs OD | RD ≥ OD (no pre-shaving) | UFGS 3.3.19 |
| Remaining duration for quantity work | remaining qty ÷ demonstrated rate (3–4 wk actual) | PASEG 9.1.2 |
| Expected out-of-sequence base rate | ~36–40% of started activities | Winter survey |
| BEI · CPLI · missed tasks | ≥0.95 · ≥0.95 · ≤5% | DCMA #11/13/14 |
| Critical path test injection | +600 wd, day-for-day response | DCMA #12 |
| In-progress activities on the CP after update | ≥ 1 | GAO BP9 |
| Near-critical band | = corrective-action time (~10 wd default) | AACE 92R-17 |
| Narrative elements | 8, every period | UFGS 3.5.2 |
| Archive | 1 immutable native file / period | UFGS 3.5.1 |
| Delay-notice window | 5–28 d (21 common) — hard deadline | contract practice |
| Rule | Number | Source |
|---|---|---|
| Deterministic date probability (typical, unmitigated) | ~4% in the worked case | Hulett |
| Merge bias: two / three 60% paths converging | 36% / 22% | GAO BP8 |
| Contingency percentile | P80 conservative; P50–65 riskier than it sounds | GAO BP8 |
| Risk drivers quantified; iterations | 20–40 · ~3,000 | 57R-09 |
| Schedule margin sizing (pre-SRA defaults) | 1–2 mo/yr; ~2× through I&T | NASA Fig 5-30 |
| Weather: anticipated days source | NOAA 30-yr normals, monthly table | 84R-13 |
| Cold thresholds worth memorizing | concrete ~40°F · shingles >40°F · coatings ~50°F | industry |
| Switchgear · transformers (substation) · generators | 52–80 · 75–110 · 50–78 wk | 2025–26 actuals |
| Chillers · custom AHUs · large UPS | ~40 · 16–28 · 30–60 wk | 2025–26 actuals |
| Order electrical gear before mobilization | 12–18 months | data-center practice |
| Closeout cost-loading floors | punch ≥1% of contract · O&M ≥$20k · as-builts ≥$35k | UFGS 3.3.20 |
| Industry base rate of deficient schedules | 88% of 50,000+ | SmartPM |
The documents this guide stands on — read them in this order — and the path that builds judgment.
| # | Document | What it gives you |
|---|---|---|
| 1 | Mubarak — Construction Project Scheduling and Control | The teaching text; CPM from first principles. |
| 2 | GAO-16-89G Schedule Assessment Guide | The ten practices and four characteristics; the assessor's mind. |
| 3 | DCMA-EA PAM 200.1 | The 14-point metrics as they are actually defined — read the formulas, not the summaries. |
| 4 | NDIA PASEG | GASP; statusing discipline; margin; the working IMS handbook. |
| 5 | UFGS 01 32 01 | The strictest owner spec in common use — a masterclass in enforceable scheduling rules. |
| 6 | AACE RPs — 24R-03, 37R-06, 38R-06, 49R-06, 53R-06, 70R-12, 78R-13, 84R-13, 92R-17 | Logic, levels, basis, critical path, update review, contingency, baseline review, weather, near-critical. |
| 7 | O'Brien & Plotnick — CPM in Construction Management | The industry bible, including CPM in claims and litigation. |
| 8 | Weaver (Mosaic papers) · Winter (papers) · Harris (P6 papers) | The engine-level truth: float, calendars, P6 internals, OOS, update review by the numbers. |
| 9 | AACE 29R-03 + SCL Delay & Disruption Protocol | Forensic methods and the record they require — read them before you need them. |
| 10 | Hulett — Schedule Risk Analysis Simplified · AACE 57R-09/64R-11 | Merge bias, risk drivers, and honest completion probabilities. |
Field time → quantities and estimating → CPM mechanics and P6 mastery → delay analysis and contracts → risk and probabilistic methods. Certifications when the experience supports them: PSP (AACE — the construction-career credential, ~4–8 years) and PMI-SP (~2–3.5 years) — certified schedulers earn about 10% more, but the credential follows the competence, not the reverse. Measure your impact in outcomes ("resolved an 8-week delay on the energization path"), never in activity counts.
And the differentiating skill at every stage is communication. The planner is a catalyst on the project team — the one who can express the build plan in plain language to a foreman, a CFO, and a lawyer in the same week. A scheduler who cannot get a superintendent to engage produces schedules nobody follows; a scheduler who can is running the job's nervous system.