Skip to main content
One method, one schedule pair, every step shown

A windows analysis you can re-run yourself.

Four schedule snapshots, one named method, and every register published whole. The conventions are stated before the first number. The input files are on this page. Run them through the same skill and you should get the same 17 working days.

Generated 17 August 2026. Method: AACE International Recommended Practice 29R-03, MIP 3.3 (Observational / Dynamic / Contemporaneous As-Is). Synthetic data throughout. This page shows what the method computes and, in the closing section, what it does not.

Synthetic data

The Cedarline Pump Station Retrofit does not exist. The project, the activity names, the calendar, the progress and the delay events were all written into a generator script that is published on this page. No client, no owner, no contractor and no real schedule appears anywhere in these files. That is the point: a worked example has to be inspectable, and a real matter cannot be.

What this page is. Most published delay analysis shows you the answer. This one shows the run. A synthetic four-snapshot P6 schedule goes in, one named forensic method processes it, and the output is reproduced here whole, including the registers that are usually cut down to a summary and the findings that are usually left out.

What it found. Substantial Completion moved from 2025-09-12 to 2025-10-07, which is 17 working days (25 calendar days) on the project calendar. The three windows contributed +8, +7 and +2 working days, and they sum to 17, which is the same figure the baseline-to-final comparison produces independently. Six activities changed duration across the run. Four of those changes reached the completion date and two did not, because the two that did not sat on paths that still carried float. Nothing else moved: no logic was edited, no activity was added or removed, and no out-of-sequence progress was recorded in any window.

What it did not find. Who was responsible. All 17 working days land in the Unattributed bucket, because a schedule file records that an activity took longer, not whose fault that was. The responsible-party column in the register below is empty in all 64 rows. Filling it in requires change orders, site records and correspondence, none of which a synthetic example can honestly supply. That gap is the most useful thing on this page.

The headline figures

Result in five numbers.

+17
Working days
completion slip
3
Analysis
windows
6
Duration changes
found
64
Slip register rows
published in full
17
Working days
unattributed

The single visible exhibit for this page is the per-window table below. Everything else on the page is in a drawer, open it if you want it, and nothing has been shortened to fit.

Per-window result
WindowPeriodWindow length (wd)Completion shift (wd)Same shift (cd)Cumulative vs baseline (wd)Completion date, prior → later
W1
Baseline to Update 1
2025-02-03 to 2025-03-3139+8+12+82025-09-12 → 2025-09-24
W2
Update 1 to Update 2
2025-03-31 to 2025-06-3063+7+9+152025-09-24 → 2025-10-03
W3
Update 2 to Update 3
2025-06-30 to 2025-09-3063+2+4+172025-10-03 → 2025-10-07
Sum of window shifts2025-09-12 to 2025-10-07n/a+17+25+17n/a

3 windows, plus a summary row. Working-day figures are counted on the project calendar; the calendar-day column is shown beside them so the two are never confused.

Two things in that table are worth pausing on. First, the sum of the three window shifts (17 working days) equals the direct baseline-to-final comparison (17 working days). The windows method does not have to close like that, and when it does not close, the gap is a finding rather than a rounding note. Second, window three is a net figure: it carries a real slip and a real recovery in the same period, and the recovery is credited rather than dropped.

Page one, before any number

Conventions.

A delay figure is meaningless without the conventions that produced it. Eight working days and eight calendar days are different claims. A variance of minus four means opposite things depending on the subtraction order. These are the conventions this analysis ran under, taken from the skill manifest the run wrote and from the basis blocks in the result.

Stated conventions for this analysis
ConventionThis analysisNote
Day unitWorking days on the project calendarEvery day count in this deliverable is in working days. No calendar-day figure is displayed. Where a contract clause is quoted verbatim in calendar days, the computed equivalent is given in working days alongside.
Calendar basisOne calendar, SYN-5D8H - Standard 5 Day x 8 Hour (clndr_id 4901), 8 h/day, Monday, Tuesday, Wednesday, Thursday, Friday, 15 holiday exceptionsDeltas are counted on the activity's own P6 calendar via work_day_delta. Where no project calendar is available the documented fallback is Monday to Friday with no holidays, and that fallback is disclosed on the affected figure.
Sign conventionA negative number means the contractor lost timeThe subtraction order is deliberately opposite between start and finish, so that a negative value means lost time in both columns. Reversing either order to make them look consistent would invert the sign of every finish variance in this report.
Float basisTotal float, read from the P6 total_float_hr_cnt field as exported, converted to days at the activity calendar hours per day. Completed activities are treated as not critical because a completed activity carries no float.The skill manifest field float_basis came back null on this run. The statement here is the behaviour observed in the run, not a value read from the manifest.
Date fields readP6 Start and Finish columns onlyThe completion-shift basis block for every window in this run reports date_field_used: target_end_date. In these files the planned (target) dates track the current Start and Finish, so the engine is reading the Finish column.
Completion measureLatest activity finish. In all three windows the driving finish activity is COM-DEMOBThe basis block also reports diverges_from_scd_end: false in all three windows, so the measured completion agrees with the project scheduled finish.
Entitlement milestoneMS-SC (Substantial Completion)Recorded in the outputs. It is not used as the completion measure; see the row above.

Holiday exceptions on the project calendar, all 15 of them: 2025-01-01, 2025-02-17, 2025-04-18, 2025-05-19, 2025-07-01, 2025-08-04, 2025-09-01, 2025-10-13, 2025-12-25, 2025-12-26, 2026-01-01, 2026-02-16, 2026-04-03, 2026-05-18, 2026-07-01

How it was run

Five steps, in this order.

The order matters. Calendar sanity comes before any day arithmetic, because if the calendar changed between snapshots then working days from one snapshot are not the same unit as working days from the next. The integrity gate comes before the forensic math, because the forensic math assumes the files are sane and it is not the forensic skill's job to check that.

Step 1

Decode every calendar and diff them across the chain.

One calendar, SYN-5D8H - Standard 5 Day x 8 Hour, identical in all four snapshots: same name, same hours per day, same work week, same 15 holiday exceptions. If any of those had drifted, the run stops rather than reporting a day count that silently changed unit mid-analysis.

Step 2

Parse each snapshot with the canonical parser and hash it.

Each file is read by the same XER parser every other CPP tool uses, not by a bespoke reader written for this page, and each is hashed so a reader can confirm they got the same bytes.

Step 3

Run the schedule integrity gate on all four snapshots.

This is where the example stops being flattering. The baseline draws one RED and two AMBER checks, and each update draws one AMBER. All six findings are published below with the validator's own wording, rather than trimmed.

Step 4

Run the forensic delay analysis, MIP 3.3 windows.

One call to build_forensic_analysis() across the four snapshots in chronological order, baseline first, with MS-SC recorded as the entitlement milestone. The skill wrote 6 deliverables and its own audit manifest. None of the numbers on this page were typed; they are read out of that run.

Step 5

Write the manifest, then generate this page from it.

The run dumps to mip33_run.json. This HTML is generated from that JSON by build_worked_example_page.py, so the page cannot drift from the run. To change a figure you change the input or the skill and regenerate.

The integrity gate result, all 9 checks on all 4 snapshots 36 cells

Green, amber and red are the validator's own ratings. The five summary rows below the grid are the roll-ups it reports alongside them.

critical-path-validator result per snapshot
Check Baseline Update 1 Update 2 Update 3
cp_identification
Critical Path Identification
AMBER AMBER AMBER AMBER
constraint_driven
Constraint-Driven Criticality
AMBER GREEN GREEN GREEN
open_ends_cp
Open Ends (CP Focus)
RED GREEN GREEN GREEN
relationship_quality
Relationship Quality
GREEN GREEN GREEN GREEN
lag_issues
Lag Analysis
GREEN GREEN GREEN GREEN
out_of_sequence
Out-of-Sequence Progress
GREEN GREEN GREEN GREEN
near_critical
Near-Critical Path
GREEN GREEN GREEN GREEN
logic_continuity
Logic Continuity to Completion
GREEN GREEN GREEN GREEN
constraint_saturation
Constraint Saturation
GREEN GREEN GREEN GREEN
Logic rating (score) AMBER (76.2) GREEN (95.3) GREEN (96.3) GREEN (96.3)
DCMA-14 checks passed 13 of 14 (worst WARN) 13 of 14 (worst WARN) 13 of 14 (worst WARN) 14 of 14 (worst INFO)
Critical / near-critical activities 21 / 2 17 / 2 11 / 0 3 / 0
Open ends (no pred / no succ non-terminal) 1 / 0 0 / 0 0 / 0 0 / 0
Logic cycle detected no no no no

9 checks × 4 snapshots, no cells omitted.

Every non-green check, with the validator's note verbatim 6 findings

Two of the three baseline findings are the project start milestone. MS-NTP has no predecessor, which is what a start milestone is, and the validator correctly reports it as an open end on the critical path. It also reports that MS-NTP sits at zero total float without being on the longest path, which is what a zero-duration start milestone looks like to a longest-path calculation. The third baseline finding, and the single AMBER carried by each of the three updates, is the criticality percentage: a compact 35-activity network with one dominant chain reads as excessively critical against a threshold tuned for larger schedules. None of that was corrected before running the analysis, because a worked example that quietly cleans its own inputs teaches the wrong lesson.

Every non-green integrity check, with the validator note verbatim
SnapshotCheckRatingScoreValidator note, verbatim
Baselinecp_identificationAMBER5521 critical activities (60.0% of 35 incomplete). Excessive criticality: too many activities at zero float, possibly due to constraints or logic issues.
Baselineconstraint_drivenAMBER70No hard constraints on critical path activities. CP is logic-driven. However, 1 activity on the P6 critical path (TFM, TF=0) diverges from the longest path (LPM) per AACE 49R-06. Math-grounded false-CP candidate possibly driven by a stripped lag/SS-FF-SF offset, retained logic, or out-of-sequence progress (no constraint is present on these activities). See the Constraint-Driven CP recommendation(s) and lpm_confirmed_false_cp.
Baselineopen_ends_cpRED301 open end(s) ON the critical path (1 missing pred, 0 missing succ). CP logic is BROKEN.
Update 1cp_identificationAMBER5517 critical activities (63.0% of 27 incomplete). Excessive criticality: too many activities at zero float, possibly due to constraints or logic issues.
Update 2cp_identificationAMBER5511 critical activities (68.8% of 16 incomplete). Excessive criticality: too many activities at zero float, possibly due to constraints or logic issues.
Update 3cp_identificationAMBER553 critical activities (100.0% of 3 incomplete). Excessive criticality: too many activities at zero float, possibly due to constraints or logic issues.

6 non-green findings across all four snapshots. Every one is listed.

The note column is the validator's own text, reproduced without edit. Where that text references a recommended practice, the reference is the validator's, not a citation made by this page. This page cites one standard, and it is named in the closing section.

The baseline stability gate 4 findings, worst severity PASS

The forensic skill runs its own baseline stability gate and returns a halt flag. On this run the flag is has_block = no, so the analysis was allowed to proceed.

Baseline stability gate findings
SeverityFinding
PASSNo hard date constraints on critical path activities.
PASSCPLI (proxy) = 1.000 >= 0.95.
PASSNo activities with negative total float.
PASSNo open-ended activities on the critical path.

Summary as returned: {"block": 0, "warn": 0, "info": 0, "pass": 4, "total": 4, "worst_severity": "PASS"}

The registers

Everything the method found, nothing removed.

A forensic register with rows missing is not a register. Every table in this section carries its full row count and every row is present. Long tables scroll inside their own frame with the header pinned; they are not cut to a top ten.

Duration changes, every window 6 rows

Six duration changes across three windows. The last two columns are the interesting pair. Critical in later snapshot is the engine's total-float test, which treats a completed activity as not critical because a completed activity has no float. So an activity that both grew and finished inside the same window shows as a duration change that never appears in duration_growth_cp, even where it drove the window's slip. That is exactly what happens in windows two and three here. Reading only duration_growth_cp would report zero drivers for both of those windows while the completion date moved +7 and +2 working days. That is why this table reports duration_growth_all and shows both columns side by side.

Every duration change the engine found, all windows
WindowActivityNamePrior (wd)Later (wd)Change (wd)Critical in later snapshotIn duration_growth_cp
W1ELE-PROCMCC and VFD Fabrication and Delivery3547+12nono
W1CIV-BASEForm Reinforce and Pour Base Slab1220+8yesyes
W2CIV-WALLForm Reinforce and Pour Wet Well Walls1421+7nono
W3MEC-PIPEInternal Process Piping Install1824+6nono
W3ELE-CONDConduit and Cable Tray Rough-In1420+6nono
W3COM-FUNCFunctional Testing All Modes106-4nono

6 duration changes, all windows, none omitted. Noise floor: changes under 0.1 working days are dropped by the engine as rounding jitter.

Complete slip register, every activity that moved in every window 64 rows

This is the register the method actually produces. The Responsible party and Cause notes columns are empty in every row, and they are empty on purpose. The engine does not guess. Note also the Driver type column: the method distinguishes an activity whose own duration grew from an activity that merely inherited a push from upstream, which is the distinction that stops a cascade being counted as 64 separate delays.

Complete slip register, every window, no rows removed
WindowActivityNamePrior finishLater finishSlip (wd)TF beforeTF afterDuration ΔCriticalDriver typeResponsible partyCause notes
W1ELE-PROCMCC and VFD Fabrication and Delivery2025-03-252025-04-10+129085+12noDuration Growth(empty)(empty)
W1CIV-BASEForm Reinforce and Pour Base Slab2025-04-092025-04-22+800+8yesDuration Growth (CP)(empty)(empty)
W1CIV-WALLForm Reinforce and Pour Wet Well Walls2025-04-302025-05-12+800+0yesCritical Slip(empty)(empty)
W1CIV-CUREWall Cure and Strip Formwork2025-05-092025-05-22+800+0yesCritical Slip(empty)(empty)
W1MS-CONCConcrete Structure Complete2025-05-092025-05-22+800+0yesCritical Slip(empty)(empty)
W1CIV-BKFBackfill and Compact Around Structure2025-05-202025-05-30+824+0noNear-Critical Slip(empty)(empty)
W1CIV-SLABGrade Slab and Equipment Pads2025-05-302025-06-11+842+0noNear-Critical Slip(empty)(empty)
W1MEC-SETSet Pump Skids and Grout Baseplates2025-05-222025-06-03+82624+0noActivity Slip(empty)(empty)
W1MEC-PIPEInternal Process Piping Install2025-06-172025-06-27+82727+0noActivity Slip(empty)(empty)
W1MEC-VALVEValve and Actuator Install2025-06-252025-07-08+82724+0noActivity Slip(empty)(empty)
W1MEC-TESTHydrostatic Test Process Piping2025-07-032025-07-15+82627+0noActivity Slip(empty)(empty)
W1ELE-CONDConduit and Cable Tray Rough-In2025-06-232025-07-04+800+0yesCritical Slip(empty)(empty)
W1ELE-MCCSet MCC and VFD Line-Up2025-06-302025-07-11+800+0yesCritical Slip(empty)(empty)
W1ELE-CABLEPower and Control Cable Pull2025-07-172025-07-29+800+0yesCritical Slip(empty)(empty)
W1ELE-TERMTerminate and Point-to-Point Check2025-07-292025-08-11+800+0yesCritical Slip(empty)(empty)
W1MS-ENERGPermanent Power Energized2025-07-292025-08-11+800+0yesCritical Slip(empty)(empty)
W1BLD-ERECTErect Pre-Engineered Building Frame2025-05-262025-06-05+800+0yesCritical Slip(empty)(empty)
W1BLD-ROOFRoof Deck and Membrane2025-06-032025-06-13+800+0yesCritical Slip(empty)(empty)
W1BLD-CLADWall Cladding and Flashing2025-06-132025-06-25+88785+0noActivity Slip(empty)(empty)
W1BLD-DOOROverhead Doors and Louvres2025-06-192025-07-02+88584+0noActivity Slip(empty)(empty)
W1COM-FLUSHSystem Flush and Chlorination2025-08-062025-08-18+800+0yesCritical Slip(empty)(empty)
W1COM-LOOPInstrument Loop Checks2025-08-182025-08-28+800+0yesCritical Slip(empty)(empty)
W1COM-FUNCFunctional Testing All Modes2025-09-022025-09-12+800+0yesCritical Slip(empty)(empty)
W1COM-PERFPerformance and Capacity Demonstration2025-09-092025-09-19+800+0yesCritical Slip(empty)(empty)
W1COM-DEMOBDemobilize and Turnover Documentation2025-09-122025-09-24+800+0yesCritical Slip(empty)(empty)
W1MS-SCSubstantial Completion2025-09-122025-09-24+800+0yesCritical Slip(empty)(empty)
W2CIV-WALLForm Reinforce and Pour Wet Well Walls2025-05-122025-05-22+700+7noDuration Growth(empty)(empty)
W2CIV-CUREWall Cure and Strip Formwork2025-05-222025-06-02+700+0noNear-Critical Slip(empty)(empty)
W2MS-CONCConcrete Structure Complete2025-05-222025-06-02+700+0noNear-Critical Slip(empty)(empty)
W2CIV-BKFBackfill and Compact Around Structure2025-05-302025-06-10+740+0noNear-Critical Slip(empty)(empty)
W2CIV-SLABGrade Slab and Equipment Pads2025-06-112025-06-20+720+0noNear-Critical Slip(empty)(empty)
W2MEC-SETSet Pump Skids and Grout Baseplates2025-06-032025-06-12+7240+0noNear-Critical Slip(empty)(empty)
W2MEC-PIPEInternal Process Piping Install2025-06-272025-07-09+72727+0noActivity Slip(empty)(empty)
W2MEC-VALVEValve and Actuator Install2025-07-082025-07-17+72427+0noActivity Slip(empty)(empty)
W2MEC-TESTHydrostatic Test Process Piping2025-07-152025-07-24+72727+0noActivity Slip(empty)(empty)
W2ELE-CONDConduit and Cable Tray Rough-In2025-07-042025-07-15+700+0yesCritical Slip(empty)(empty)
W2ELE-MCCSet MCC and VFD Line-Up2025-07-112025-07-22+700+0yesCritical Slip(empty)(empty)
W2ELE-CABLEPower and Control Cable Pull2025-07-292025-08-08+700+0yesCritical Slip(empty)(empty)
W2ELE-TERMTerminate and Point-to-Point Check2025-08-112025-08-20+700+0yesCritical Slip(empty)(empty)
W2MS-ENERGPermanent Power Energized2025-08-112025-08-20+700+0yesCritical Slip(empty)(empty)
W2BLD-ERECTErect Pre-Engineered Building Frame2025-06-052025-06-16+700+0noNear-Critical Slip(empty)(empty)
W2BLD-ROOFRoof Deck and Membrane2025-06-132025-06-24+700+0noNear-Critical Slip(empty)(empty)
W2BLD-CLADWall Cladding and Flashing2025-06-252025-07-07+78584+0noActivity Slip(empty)(empty)
W2BLD-DOOROverhead Doors and Louvres2025-07-022025-07-11+78484+0noActivity Slip(empty)(empty)
W2COM-FLUSHSystem Flush and Chlorination2025-08-182025-08-27+700+0yesCritical Slip(empty)(empty)
W2COM-LOOPInstrument Loop Checks2025-08-282025-09-09+700+0yesCritical Slip(empty)(empty)
W2COM-FUNCFunctional Testing All Modes2025-09-122025-09-23+700+0yesCritical Slip(empty)(empty)
W2COM-PERFPerformance and Capacity Demonstration2025-09-192025-09-30+700+0yesCritical Slip(empty)(empty)
W2COM-DEMOBDemobilize and Turnover Documentation2025-09-242025-10-03+700+0yesCritical Slip(empty)(empty)
W2MS-SCSubstantial Completion2025-09-242025-10-03+700+0yesCritical Slip(empty)(empty)
W3MEC-PIPEInternal Process Piping Install2025-07-092025-07-17+6270+6noDuration Growth(empty)(empty)
W3MEC-VALVEValve and Actuator Install2025-07-172025-07-25+6270+0noNear-Critical Slip(empty)(empty)
W3MEC-TESTHydrostatic Test Process Piping2025-07-242025-08-01+6270+0noNear-Critical Slip(empty)(empty)
W3ELE-CONDConduit and Cable Tray Rough-In2025-07-152025-07-23+600+6noDuration Growth(empty)(empty)
W3ELE-MCCSet MCC and VFD Line-Up2025-07-222025-07-30+600+0noNear-Critical Slip(empty)(empty)
W3ELE-CABLEPower and Control Cable Pull2025-08-082025-08-18+600+0noNear-Critical Slip(empty)(empty)
W3ELE-TERMTerminate and Point-to-Point Check2025-08-202025-08-28+600+0noNear-Critical Slip(empty)(empty)
W3MS-ENERGPermanent Power Energized2025-08-202025-08-28+600+0noNear-Critical Slip(empty)(empty)
W3COM-FLUSHSystem Flush and Chlorination2025-08-272025-09-05+600+0noNear-Critical Slip(empty)(empty)
W3COM-LOOPInstrument Loop Checks2025-09-092025-09-17+600+0noNear-Critical Slip(empty)(empty)
W3COM-FUNCFunctional Testing All Modes2025-09-232025-09-25+200-4noNear-Critical Slip(empty)(empty)
W3COM-PERFPerformance and Capacity Demonstration2025-09-302025-10-02+200+0yesCritical Slip(empty)(empty)
W3COM-DEMOBDemobilize and Turnover Documentation2025-10-032025-10-07+200+0yesCritical Slip(empty)(empty)
W3MS-SCSubstantial Completion2025-10-032025-10-07+200+0yesCritical Slip(empty)(empty)

64 rows total (W1: 26, W2: 24, W3: 14). Scroll inside the frame; the header stays put. No row is hidden.

Milestone movement, every window 8 rows

Working-day and calendar-day slip are shown side by side for every milestone, because the same movement reads as a different number in each unit and a claim quotes one of them.

Every milestone movement, all windows
WindowMilestoneNamePriorLaterSlip (wd)Slip (cd)
W1MS-CONCConcrete Structure Complete2025-05-092025-05-22+8+13
W1MS-ENERGPermanent Power Energized2025-07-292025-08-11+8+13
W1MS-SCSubstantial Completion2025-09-122025-09-24+8+12
W2MS-CONCConcrete Structure Complete2025-05-222025-06-02+7+11
W2MS-ENERGPermanent Power Energized2025-08-112025-08-20+7+9
W2MS-SCSubstantial Completion2025-09-242025-10-03+7+9
W3MS-ENERGPermanent Power Energized2025-08-202025-08-28+6+8
W3MS-SCSubstantial Completion2025-10-032025-10-07+2+4

8 milestone movements across all windows.

Cumulative per-activity slip 26 rows

Signed slip per activity summed across all three windows. Reading this as a per-party total would double count: a single upstream growth appears here once for itself and once for every downstream activity it pushed. The attribution section below deals with that.

Cumulative per-activity slip register
ActivityNameTotal slip across windows (wd)Windows it moved inCritical at final snapshot
MEC-PIPEInternal Process Piping Install+213no
MEC-VALVEValve and Actuator Install+213no
MEC-TESTHydrostatic Test Process Piping+213no
ELE-CONDConduit and Cable Tray Rough-In+213no
ELE-MCCSet MCC and VFD Line-Up+213no
ELE-CABLEPower and Control Cable Pull+213no
ELE-TERMTerminate and Point-to-Point Check+213no
MS-ENERGPermanent Power Energized+213no
COM-FLUSHSystem Flush and Chlorination+213no
COM-LOOPInstrument Loop Checks+213no
COM-FUNCFunctional Testing All Modes+173no
COM-PERFPerformance and Capacity Demonstration+173yes
COM-DEMOBDemobilize and Turnover Documentation+173yes
MS-SCSubstantial Completion+173yes
CIV-WALLForm Reinforce and Pour Wet Well Walls+152no
CIV-CUREWall Cure and Strip Formwork+152no
MS-CONCConcrete Structure Complete+152no
CIV-BKFBackfill and Compact Around Structure+152no
CIV-SLABGrade Slab and Equipment Pads+152no
MEC-SETSet Pump Skids and Grout Baseplates+152no
BLD-ERECTErect Pre-Engineered Building Frame+152no
BLD-ROOFRoof Deck and Membrane+152no
BLD-CLADWall Cladding and Flashing+152no
BLD-DOOROverhead Doors and Louvres+152no
ELE-PROCMCC and VFD Fabrication and Delivery+121no
CIV-BASEForm Reinforce and Pour Base Slab+81yes

26 activities moved at least once across the run.

Critical path membership change, every window 3 rows

The critical path shrinks across the run because activities complete and completed activities are not critical. No activity became newly critical in any window, which is consistent with the only thing changing being duration on paths that were already critical.

Critical path membership change per window
WindowCritical, priorCritical, laterNewly criticalNo longer critical
W12117noneCIV-EXC, CIV-MUD, MS-NTP, PRE-PERMIT
W21711noneBLD-ERECT, BLD-ROOF, CIV-BASE, CIV-CURE, CIV-WALL, MS-CONC
W3113noneCOM-FLUSH, COM-FUNC, COM-LOOP, ELE-CABLE, ELE-COND, ELE-MCC, ELE-TERM, MS-ENERG
What did not change 4 checks, all zero

Worth stating explicitly, because in a real matter these are where the arguments live.

logic changes      added 0   removed 0   type_changed 0   lag_changed 0
activities added    0   (all three windows)
activities removed  0   (all three windows)
out-of-sequence     0   (all three windows)

So in this example there is no retroactive baseline edit, no scope creep hidden in an activity insert, no relationship retyped to shorten a path, and no progress recorded against work whose predecessor had not finished. A real schedule chain rarely looks like this. The example is deliberately clean on those axes so the day arithmetic can be checked without them.

The part the software cannot do

Attribution.

The conserved attribution for this run is:

{
    "Owner": 0,
    "Contractor": 0,
    "Concurrent": 0,
    "Force Majeure": 0,
    "Unattributed": 17
}

Every working day is unattributed. That is the correct answer for this input, not a failure of the run. The generator script says which duration grew and by how much; it does not contain a change order, an RFI response, a weather record or a letter, and without those there is no honest basis to move a day from Unattributed into Owner or Contractor. The method flags where the attribution decision has to be made. Making it is the analyst's work and it needs documents.

The conservation check. The attribution figures sum to 17 working days, which equals the project drift of 17 working days. The engine also reports a second, deliberately unusable figure for comparison: the raw sum of the slip register across all windows, which is 448 days. That second number is what you get by adding up every activity's slip, and it over-counts by a factor of about 26 because one upstream growth pushes many downstream activities and each push is counted again. The engine ships both figures and names the non-conserved one so it cannot be quoted as an entitlement.

The engine's own wording for that second figure, verbatim:

cascade-inclusive raw slip-register sum across all windows (double-counts a root delay across its downstream victims); NOT conserved to project drift. Use cumulative.attribution_summary for the conserved per-party total.
Re-run it

Reproducibility manifest.

Three commands, in this order, from the folder holding the four XER files. Step one rebuilds the schedules from the generator, so a reader who wants to change the delay story can edit one dictionary and see the whole analysis move.

python build_cedarline_schedules.py .
python run_mip33.py .
python build_worked_example_page.py

Verify each input hash before re-running. A changed input is a different analysis, not a failed reproduction.

On hash stability. The generator pins the XER export header rather than stamping it with the current time, so the four input files are byte-identical every time step one runs and the SHA-256 values below stay true. The run itself is not byte-stable and is not meant to be: the skill manifest records the moment it ran, and the deliverable filenames carry the run date, so re-running on a different day changes the output hashes while leaving every computed figure the same. Check the inputs against the hashes; check the outputs against the numbers.

Inputs

The four schedule snapshots
SnapshotFileData dateScheduled finishActsRelsComplete / active / not startedBytesSHA-256
BaselineCEDARLINE-BL-2025-02-03.xer2025-02-032025-09-1235420 / 0 / 3520,1039ecb3f40150d2811385d3dcfd8ea742ba633df5ca8a756f19653d158ab1ec41c
Update 1CEDARLINE-U1-2025-03-31.xer2025-03-312025-09-2435428 / 3 / 2420,12569328b92ea1530c92b2b0e96a17acaa3897800876768ade9d2e16d36508bf3ec
Update 2CEDARLINE-U2-2025-06-30.xer2025-06-302025-10-03354219 / 3 / 1320,099f99704e94d7eb7cb6e06922b6d66bf342150bff708f0d5e7c7279df47e378eb4
Update 3CEDARLINE-U3-2025-09-30.xer2025-09-302025-10-07354232 / 1 / 220,042e896186581da7e324ce278d988f7e3b7d80e70d35ffa463adf664b40f17c4a45

4 input files. SHA-256 in full; click a filename to download it.

Input topology

Reproducibility manifest, inputs
InputActivitiesRelationshipsCalendarsData dateTopology hash
CEDARLINE-BL-2025-02-03.xer354212025-02-03v2:a8efb57a84ec2578f9a9dce51cc3c7e0414a55499adc63bbf8c52d34f3b0232c
CEDARLINE-U1-2025-03-31.xer354212025-03-31v2:855dfe0cd0689590b0d5bb96107cf0ad8aeb837b87f4a6b7b91f82e23e5a996a
CEDARLINE-U2-2025-06-30.xer354212025-06-30v2:ed50450f6059825809c9c8d23857d60811c27318cf57ac36038f668d40f97617
CEDARLINE-U3-2025-09-30.xer354212025-09-30v2:8610c8f25eb0de549050db9c193661cec85bdd127d13f4df1a83f274b7a4c945

Topology hash is a canonicalized signal over activity codes, durations and predecessor links, types and lags. All four hashes differ because durations differ. It is a change signal, not a statement that two schedules are forensically equivalent.

Engine and environment

skill              forensic-delay-analysis v3.2
method             AACE 29R-03 MIP 3.3 (Observational/Dynamic/Contemporaneous As-Is — windows analysis)
method id          windows_analysis
engine version     2.9.40
verification       release-evidence/v2.9.40/
python             3.12.10
platform           Windows-11-10.0.26200-SP0
manifest schema    cpp-skill-manifest/v1
generated (UTC)    2026-08-18T01:25:31Z
baseline index     0
task types excluded TT_LOE, TT_WBSSummary
completion filter  zero-remaining-duration dropped (milestones preserved)
activities dropped 0
engine alerts      0 total {"ALERT": 0, "WARN": 0, "INFO": 0, "OTHER": 0}
Deliverables the skill wrote, with sizes and hashes 6 files

These are the skill's own outputs, unedited. The HTML dashboard and the DOCX report are the skill's deliverable format; this page is a separate write-up of the same run.

Deliverables the skill wrote, with hashes
FileBytesSHA-256
Cedarline_Pump_Station_Retrofit_Forensic_Analysis_2026-08-17.html191,14889f8d2aa829321565c560eaa2139723ca9fd7fc6c31f2c3871360c94e39ab596
Cedarline_Pump_Station_Retrofit_Forensic_Analysis_2026-08-17.docx64,811f54466d401a50a3103f92a8032a13609e6bd5993d0fd3336a86f53ebc975b7ba
Cedarline_Pump_Station_Retrofit_Windows_Narrative_2026-08-17.txt11,160930d75567bbe24e988cc5d20885ba8284e2329b7d35b612e5cd41eb842cd0022
Cedarline_Pump_Station_Retrofit_Delay_Drivers_2026-08-17.csv5,15430624c7a86323559b93234316598773278efef8f131b7b0484d7e0be12154b57
Cedarline_Pump_Station_Retrofit_Completion_Tracking_2026-08-17.csv246b34215b60d8dbf31dd2ebb9c241b421946011fe28dbe5cfe0f1c3a96d6797479
Cedarline_Pump_Station_Retrofit_Delay_Register_2026-08-17.csv7376b768d65b69255bac5631b00f4bc58a794a891352b60cfb3441b34c8fb9686c
Where the manifest came back empty 9 null fields

The skill's manifest schema declares fields that this run did not populate. Rather than leave the gap unstated or fill it from assumption, both lists are published and the source of every substitute is named.

input fields returning null:
  activity_count, calendar_count, data_date, relationship_count, topology_hash

convention fields returning null:
  calendar_basis_id, excluded_from_analysis, float_basis, scheduling_mode_as_read

The five input fields were recomputed directly from the XER files by the run script, using the same parser and the same topology-hash function the engine uses, and those recomputed values are what the Input topology table above shows. The four convention fields are reported as null. The float-basis row in the Conventions table describes the behaviour observed in this run and says so; it is not presented as a manifest value.

The engine's own limitations list, verbatim 6 items

Copied from the manifest without edit, including the em-dashes and section references in the original.

  1. Engine `computeCPM` (Section C) is the calendar-aware path. Section D / `runCPM` is NOT used in forensic deliverables (it is the Monte Carlo inner-loop engine, intentionally not calendar-aware).
  2. Bayesian and kinematic public-API surfaces are JS-only and excluded from JS↔Python parity claims (see cpm-engine DAUBERT.md §11).
  3. Multi-jurisdiction default holiday rule sets are framework-aligned defaults sufficient for general-purpose date math; analysts must verify the operative jurisdiction's statute for forensic use (see cpm-engine docs/jurisdictions.md).
  4. Topology hash is a canonicalized-topology signal under the hashed-field set (codes, durations, predecessor links + types + lags); it is NOT a forensic-equivalence statement.
  5. Windows analysis (AACE 29R-03 MIP 3.3) is observational; it does NOT prove causation. Causation is the analyst's burden.
  6. Concurrent-delay attribution uses the engine's attribution rules (see SKILL.md). Other AACE-recognized attribution methods (Time Impact, As-Planned vs As-Built, Collapsed As-Built) may produce different attributions on the same fact set.
Read this before citing anything above

What this example establishes, and what it does not.

What it does establish

  1. The arithmetic is checkable. The four input files, the generator, the run script and the page generator are all published. Anyone can re-run the chain and compare.
  2. The windows close. Three window shifts summing to 17 working days against a baseline-to-final drift of 17 working days, computed by two different routes through the same data.
  3. Float is handled, not assumed away. Four of the six duration changes reached the completion date and two did not. ELE-PROC grew 12 working days and MEC-PIPE grew 6, and neither moved completion, because their paths carried float. The register shows total float before and after for every row so that claim can be checked rather than taken.
  4. Recovery is credited. Window three nets a real compression against a real slip instead of dropping the negative movement.
  5. The registers are complete. 64 slip rows, 26 cumulative activity rows, 6 duration changes, 8 milestone movements, 6 non-green integrity findings. Every one is on the page.

What it does not establish

  1. Not causation. A windows analysis is observational. It records that the completion date moved and which activity moved it. It does not establish why, and the method's own limitations list says so in the words quoted above.
  2. Not entitlement. All 17 working days are unattributed. No day here belongs to an owner or a contractor, because nothing in the input assigns responsibility. A real submission needs the contemporaneous record.
  3. Not concurrency. Concurrent delay could not be assessed on this input at all. Concurrency is a question about two parties delaying at once, and with every day unattributed there are no parties to compare. The example does not demonstrate concurrency analysis and should not be cited as if it did.
  4. Not a substitute for the other methods. MIP 3.3 is one method. A subtractive but-for analysis or an additive fragnet analysis on this same data could produce a different figure, and the manifest's limitations list says exactly that. A single method producing a number is not corroboration.
  5. Not proof the files import into P6. The four XERs carry the real P6 22.x to 24.x column sets and are read by the canonical parser, and their dates and float come from the canonical CPM engine rather than being typed. They have not been imported into a Primavera P6 installation and verified there, because no P6 licence was used in producing this page. Treat them as parser-verified, not P6-verified.
  6. Not a real project. The delay events were chosen to be legible: one clean growth per window, no logic churn, no out-of-sequence progress, no calendar change, no rebaseline. Real schedule chains are messier on every one of those axes, and the messy parts are usually where the dispute is.
  7. Not evidence about the baseline being sound. The integrity gate returned one RED and two AMBER on the baseline, two of them traceable to the start milestone and one to the criticality percentage. Those were left in rather than fixed. A real engagement resolves them or records why they were accepted before relying on the result.

Standards named on this page

One: AACE International Recommended Practice 29R-03, Forensic Schedule Analysis, and within it the MIP 3.3 method identifier (Observational / Dynamic / Contemporaneous As-Is). That is the method the skill implements and the method label it stamps on its own manifest. No case, statute or other protocol is cited on this page. Where a general statement would do, this page makes the general statement rather than reaching for a specific authority.