Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
danafitkowski avatar

Cpp Cpm Engine

  • Updated July 16, 2026
  • danafitkowski/cpp-cpm-engine

An open-source CPM engine with AACE-aligned methodology and a published [Daubert disclosure](DAUBERT.

About

An open-source CPM engine with AACE-aligned methodology and a published [Daubert disclosure](DAUBERT.md). [![npm version](https://img.shields.io/badge/npm-v2.9.34-blue.svg)](https://www.npmjs.com/package/@critical-path-partners/cpm-engine) [![license: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) [![tests: 1128 passing](https://img.shields.io/badge/tests-1128%20passing-brightgreen.svg)](cpm-engine.test.js) [![crossval: 747/747](https://img.shields.io/badge/JS%E2%86%94Python-747%2F747-brightgreen.svg)](cpm-engine.crossval.js)

  • [![npm version](https://img.shields.io/badge/npm-v2.9.34-blue.svg)](https://www.npmjs.com/package/@critical-path-partner
  • [![license: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
  • [![tests: 1128 passing](https://img.shields.io/badge/tests-1128%20passing-brightgreen.svg)](cpm-engine.test.js)
  • [![crossval: 747/747](https://img.shields.io/badge/JS%E2%86%94Python-747%2F747-brightgreen.svg)](cpm-engine.crossval.js)
  • [![Daubert: disclosed](https://img.shields.io/badge/Daubert-disclosed-blueviolet.svg)](DAUBERT.md)

Cpp Cpm Engine by the numbers

  • Exposes 13 verified tools (MCP introspection)
  • Data as of Jul 16, 2026 (Skillselion catalog sync)
terminal
claude mcp add --transport http cpp-cpm-engine https://mcp.criticalpathpartners.ca/mcp

Add your badge

Show developers this MCP server is listed on Skillselion. Paste this into your README.

Listed on Skillselion
TransportHTTP
AuthNone
Tools13
Last updatedJuly 16, 2026
Repositorydanafitkowski/cpp-cpm-engine

How do agents access cpm-engine capabilities without custom integration code?

An open-source CPM engine with AACE-aligned methodology and a published [Daubert disclosure](DAUBERT.md).

Who is it for?

Developers wiring cpm-engine into Cursor, Claude Desktop, or other MCP clients.

Skip if: Teams that need features outside the documented cpm-engine tool surface.

What you get

Configured MCP host can call cpm-engine tools with schemas from the server README.

  • MCP connection to CPP CPM Engine remote endpoint
  • Agent-assisted forensic schedule analyses on P6 XER inputs
  • Repeatable quantitative checks aligned with advertised AACE, DCMA, Monte Carlo, and TIA scope

By the numbers

  • Catalog version 2.9.19
  • 1 streamable-http remote at mcp.criticalpathpartners.ca
At a glance

Cpp Cpm Engine capabilities & compatibility

Capabilities
[![npm version](https://img.shields.io/badge/npm · [![license: mit](https://img.shields.io/badge/li · [![tests: 1128 passing](https://img.shields.io/b · [![crossval: 747/747](https://img.shields.io/bad
Use cases
api development · orchestration
Runs
Local or remote
Pricing
Free

Tools 13

Public tool metadata - what this server can do for an agent.

forensic_windows_analysis5 params

Run forensic windows analysis (AACE RP 29R-03 §3.3, MIP 3.3 Observational / Dynamic / Contemporaneous As-Is) across multiple Primavera P6 XER snapshots and return the full analysis dict. This is the headline forensic tool — it computes per-window completion shifts, per-window slip registers (per-activity slip with critical/non-critical flag), per-window duration growth on critical-path activities, per-window per-party attribution (Owner / Contractor / Concurrent / Force Majeure / Unattributed), and cumulative project drift from baseline. The attribution math satisfies the AACE 29R-03 §4.1 conservation rule (per-party day buckets sum to project drift within ±1 day, no cascade-double- counting). Use this tool for the full multi-window forensic claim. If you already have a windows result and only want the per-window ×

  • schedulesarrayrequired
  • project_namestring
  • baseline_idxinteger
  • entitlement_milestonestring
  • output_dirstring
concurrent_delay_matrix2 params

Build the per-window x per-party concurrent-delay attribution matrix from a chronological list of XER snapshots. Implements the per-window concurrency view per AACE RP 29R-03 §4.2.B (concurrent delay apportionment). Where ``forensic_windows_analysis`` answers "how many days does each party own across the whole project?", this tool answers "how did each window distribute its shift across the parties?" — useful when defending or attacking concurrency findings on a window-by-window basis. Conservation rule (AACE 29R-03 §4.1): the sum of per-party column totals equals the sum of per-window completion shifts within ±1 day of rounding. The ``conservation_check`` field on the response reflects this; ``conservation_diff_days`` carries the exact gap. Use this tool when you only need the matrix view; use ``forensic_

  • xer_pathsarray
  • xer_contentsarray
woet_classifier5 params

Worked-vs-On-time Execution Timeline (WOET) per-activity day-by-day classification of as-built execution against baseline. For each pairable activity (matched by ``task_code``), classifies execution into 4 day-states: - PROGRESS: work performed during the baseline-planned window - GAIN: work performed BEFORE the baseline window opened - EXTENDED: work performed AFTER the baseline window closed - VOID: baseline-window day where activity was NOT active This is a CPP-disclosed enhancement layered on top of AACE 29R-03 §3.3 Windows Analysis — a per-day execution classifier (Progress/Gain/Extended/Void) NOT itself AACE-defined. It is not a substitute for fragnet-based AACE 29R-03 §3.7 (TIA) modeling. It gives the trier-of-fact a calendar picture of how the project executed versus how it was supposed to execu

  • baseline_xer_pathstring
  • actual_xer_pathstring
  • baseline_xer_contentstring
  • actual_xer_contentstring
  • todaystring
slip_velocity2 params

Per-window slip velocity & acceleration trend across XER snapshots. Computes three signed metrics per window from the underlying forensic windows analysis: - slip_velocity_days_per_day: completion shift / window duration (positive = slipping, negative = recovering) - slip_acceleration: velocity[n] - velocity[n-1] (positive = slip rate increasing, negative = decelerating/recovery) - half_period_estimated_slip_days: shift / 2 (forensic "where were we at the midpoint" centroid estimate) Cumulative aggregates ``mean_velocity_days_per_day``, ``max_velocity_window``, accelerating/decelerating/recovery window counts. Honest caveats embedded in the response (mandatory for expert reports): midpoint estimates are probabilistic centroids, not observed events; velocity is per-window average, not inst

  • xer_pathsarray
  • xer_contentsarray
collapsed_as_built7 params

Collapsed As-Built / But-For analysis on a post-impact XER. Implements AACE RP 29R-03 §3.8 Modeled / Subtractive / Single Base method (paired with MIP 3.3 Windows for the dual-method gap report per SCL §11.5). Validates a forensic windows analysis (MIP 3.3) by independently computing the same project drift via subtractive removal of delays from the as-built schedule. For each delay event, the as-built duration of every ``affected_activity`` is shortened by ``impact_days`` (or removed entirely if ``removal_method="remove"``), then CPM re-runs and the resulting "but-for" finish date is compared to the as-built finish. Cumulative pass removes ALL events at once for a project-level but-for finish. Use this tool when opposing counsel demands a but-for analysis or you need a dual-method validation pairing §3.3 (windows) wit

  • as_built_xer_pathstring
  • delay_eventsarray
  • as_built_xer_contentstring
  • output_dirstring
  • project_namestring
  • removal_methodstring
  • contractor_filterboolean
time_impact_analysis_fragnet6 params

Time Impact Analysis (TIA) — prospective fragnet insertion into a pre-impact baseline schedule. Supports two modes. **Single-base mode** (legacy): supply ``baseline_xer_path`` or ``baseline_xer_content``. All fragnets are inserted into the same shared baseline XER and impact is measured against that shared baseline. The result carries a ``single_base_disclosure`` warning explaining this is an AACE 29R-03 §3.7 simplification — acceptable when all events share a single baseline window, but not strict MIP 3.7 Multiple Base. **Multi-base mode** (AACE 29R-03 MIP 3.7 Multiple Base): supply ``per_event_bases`` — a dict keyed by each fragnet's ``id``, with each value a dict containing EITHER ``xer_path`` OR ``xer_content`` for that event's pre-event contemporaneous baseline. Each fragnet is inserted into its OWN ba

  • baseline_xer_pathstring
  • fragnetsarray
  • baseline_xer_contentstring
  • per_event_basesobject
  • output_dirstring
  • project_namestring
critical_path_validator6 params

Critical-path validation, logic health, and DCMA-14 assessment of a Primavera P6 schedule. Runs the CPP critical-path validator: checks for false criticality, constraint-driven CP segments, open ends, broken logic, and surfaces a DCMA-14 block with the 14 metrics (logic, leads, lags, FS%, hard constraints, high float, high duration, invalid dates, resources, missed tasks, critical tasks, CPLI, BEI, etc.) at the chosen profile threshold (commercial / nuclear / mining). When ``baseline_xer_path`` is supplied, BEI (Baseline Execution Index) is computed. Use this tool to grade a schedule's logic health and find what should be fixed before forensic analysis. For the full HTML health-dashboard PDF render, use ``dcma14_health_check``. Args: xer_path: server-side path to the schedule XER. xer_content: full

  • xer_pathstring
  • project_indexinteger
  • profilestring
  • baseline_xer_pathstring
  • xer_contentstring
  • baseline_xer_contentstring
dcma14_health_check8 params

Full Schedule Health Dashboard HTML report — DCMA-14 + CPLI + BEI + variance/slip register against the baseline. Wraps the CPP Schedule Health Review skill, which produces a self-contained ~1.3 MB HTML dashboard. The dashboard renders DCMA metrics, charts, baseline-vs-current variance, slip register, GAO/AACE compliance bands, and a reproducibility manifest. Baseline XER is OPTIONAL as of Round 7 (Fix MCP-8). When omitted, the tool runs in "degraded mode": the current XER is used as its own baseline for a synthetic 0-variance run. The result carries ``degraded_mode: true`` and ``degraded_mode_reason`` explaining that BEI / variance / slip register KPIs are NOT meaningful in this mode. Supply baseline_xer_path or baseline_xer_content to get the real two-XER variance dashboard. REQUIRES Node + Playwright on

  • current_xer_pathstring
  • baseline_xer_pathstring
  • current_xer_contentstring
  • baseline_xer_contentstring
  • output_pathstring
  • timeout_secondsinteger
  • debugboolean
  • return_html_inlineboolean
path_explorer6 params

Logic-trace driver-chain explorer — answers "WHY is this activity critical?" and "WHAT does it drive?". Traces driving predecessors backward from a target activity to project start (the "why critical" chain) and/or driving successors forward to project finish (the "what it drives" chain). Detects constraint-driven artificial criticality and cites AACE RP 24R-03 §4 when found. Supports multiple parallel critical paths (MCPM) and near-critical paths. Use this tool when investigating a single activity's logic chain. For a project-wide CP / logic health audit, use ``critical_path_validator``. Args: xer_path: server-side path to the schedule XER. xer_content: full text of the schedule XER (alternative for hosted/remote use). Supply EXACTLY ONE of path/content. target_activity_codes: list of

  • xer_pathstring
  • target_activity_codesarray
  • directionstring
  • include_near_criticalboolean
  • output_dirstring
  • xer_contentstring
monte_carlo_p50_p809 params

Monte Carlo Schedule Risk Analysis — P10/P50/P80/P90 completion-date forecast for a Primavera P6 schedule. Implements an AACE-style quantitative SRA (the same math as CPP's browser Tool_11 Portfolio Risk Engine, scripted Python counterpart). For each iteration, every activity duration is sampled from the chosen distribution (Triangular, BetaPERT, Uniform, Lognormal, etc.) parameterized by % of baseline duration; CPM re-runs and the project finish date is recorded. After all iterations, P10/P50/P80/P90 completion dates and a sensitivity tornado (per-activity correlation to project finish) are reported. Use this tool when you need probabilistic completion forecasts or a tornado/sensitivity ranking. For the AACE 122R-22 QRAMM maturity badge on the result, pipe the response into ``qramm_maturity``. Args:

  • xer_pathstring
  • iterationsinteger
  • distributionstring
  • optimistic_pctnumber
  • most_likely_pctnumber
  • pessimistic_pctnumber
  • seedinteger
  • output_dirstring
  • xer_contentstring
qramm_maturity1 param

AACE 122R-22 QRAMM maturity tier badge for an SRA result. Scores a Schedule Risk Analysis run (from ``monte_carlo_p50_p80`` or any equivalent dict) against AACE RP 122R-22 (Quantitative Risk Analysis Maturity Model) structure: tier 1 (Initial) through tier 4 (Optimized) per CMMI-style framing of evidence the SRA carries. Inputs the SRA inspects (defensively, all keys optional): - baseline.percentiles (P50 / P80 presence) - baseline.config (iterations, opt/ml/pes %, distribution) - baseline.sensitivity (per-activity tornado rows) - mitigated (scenario comparison evidence) - risk_register_simulation + risk_register_used (Hulett qualitative risk register evidence) - convergence (optional MC convergence diagnostics) Use this tool any time you have an SRA result and want a

  • sra_resultobjectrequired
claim_workbench_evidence_ledger6 params

Forensic claim workbench — analyzes a folder of mixed evidence (XER chain + MSG/PDF/DOCX/XLSX correspondence) and produces a unified workbench dashboard. Built from the real-world workflow where forensic delay analysis starts from a folder containing schedule updates, owner correspondence, RFIs, change orders, and meeting minutes — all mixed together. The workbench produces: - Evidence ledger (chronological): all artifacts dated and summarized - Schedule chain-diff: 14-category manipulation log (TASKPRED add/remove, constraint flips, retroactive baseline edits, completion reversals) - Rolling baseline: per-activity baseline-at-introduction across the entire XER chain - Trust score: statistical impossibilities flagged (zero-duration-variance schedules, no-new-activities,

  • folder_pathstringrequired
  • output_dirstring
  • project_namestring
  • original_baseline_xer_filenamestring
  • contract_formstring
  • run_forensicboolean
xer_parser2 params

Parse a Primavera P6 XER file and return a TABLE SUMMARY (not the full row-level data — XER row dumps explode the MCP context window). For each table in the XER, returns the table name, field list, and record count. Per-row data is intentionally omitted — for forensic / DCMA / windows analysis use the dedicated tools (``forensic_windows_analysis``, ``critical_path_validator``, etc.) which consume the parsed XER internally and return analytical summaries, not raw rows. Use this tool to confirm an XER is parseable, list its tables, see the data date / project name from PROJECT, or count activities in TASK before deciding which deeper tool to run. Args: xer_path: server-side filesystem path to the XER file. xer_content: full text of the XER file (alternative for hosted/remote use). Supply EXACTLY ONE of path/content. Returns: {

  • xer_pathstring
  • xer_contentstring
README.md

cpm-engine

npm version license: MIT tests: 1128 passing crossval: 747/747 coverage: 93% verify Daubert: disclosed AACE: 29R--03 / 49R--06 / 52R--06

An open-source CPM engine with AACE-aligned methodology and a published Daubert disclosure. Open source. AACE-aligned. Daubert-disclosed. JS/Python parity across 1,128 unit tests + 747 cross-validation checks on the enumerated CPM comparison surface (see DAUBERT.md §3.1).

Court-facing usage: pair this engine with the analyst-application discipline in FORENSIC_USE_SOP.md, the verification chain in VERIFY_RELEASE.md, the per-release receipts in release-evidence/, and the field-level P6 comparison framework in validation/p6-comparison/. Do NOT cite README in a court-facing report — cite the documents listed in DAUBERT.md and FORENSIC_USE_SOP.md §Required pairing.

Maintained by Critical Path Partners — a forensic-scheduling consultancy.


Quick start

npm install @critical-path-partners/cpm-engine
const E = require('@critical-path-partners/cpm-engine');

const result = E.computeCPM(
    [
        { code: 'A', duration_days: 5, early_start: '2026-01-05', clndr_id: 'MF' },
        { code: 'B', duration_days: 3, clndr_id: 'MF' },
        { code: 'C', duration_days: 4, clndr_id: 'MF' },
    ],
    [
        { from_code: 'A', to_code: 'B', type: 'FS', lag_days: 0 },
        { from_code: 'B', to_code: 'C', type: 'FS', lag_days: 0 },
    ],
    {
        dataDate: '2026-01-05',
        calMap: { MF: { work_days: [1, 2, 3, 4, 5], holidays: [] } },
    }
);

console.log('Project finish:', result.projectFinish);     // 2026-01-21
console.log('Critical path:', result.criticalCodesArray); // ['A', 'B', 'C']
console.log('Engine version:', result.manifest.engine_version); // 2.9.34

That's it. Forward pass, backward pass, total float, free float, calendar arithmetic, P6-conventional date math, multi-jurisdiction holidays — all done.


Why this engine?

Capability cpm-engine
Open source yes
AACE-canonical method labels (29R-03 / 49R-06 / 52R-06) yes
Daubert / FRE 702 disclosure (built-in DAUBERT.md) yes
JS-Python bit-identical parity on enumerated CPM surface yes
Topology fingerprint hash (SHA-256, copy-detection signal) yes
Kinematic delay dynamics (pre-publication, JS-only) yes
Bayesian update with hierarchical pooling (pre-publication, JS-only) yes
66 default holiday rule sets (multi-jurisdiction; framework-aligned defaults, not legally certified — see docs/jurisdictions.md) yes
MIT licensed yes

(Vendor comparison removed in the v2.9.33 audit cycle. Comparisons against specific commercial CPM tools should be supplied by an independent reviewer, not authored by the engine's maintainer.)

The engine math is a commodity. What carries a forensic schedule analysis is the workflow, the methodology discipline, and the Daubert disclosure posture — not the forward pass itself. Critical Path Partners open-sources the engine so any academic, any solo forensic scheduler, any contractor's internal scheduler can build on a transparent, citable foundation.


What you can build

  • Forensic delay analysis primitives — CPM forward/backward pass that supports analyses under AACE 29R-03 MIPs 3.3 (windows), 3.6/3.7 (prospective TIA single-base / multi-base), and 3.8 (collapsed as-built). The engine provides the CPM math; full method implementations (period selection, fragnet integration, as-built reconstruction) live in the CPP forensic skill suite — this OSS engine is the math core they build on, not the full method.
  • Claim packages — owner-submission EOT bundles with cover letter, exhibits, mitigation logs
  • Daubert disclosures — FRCP 26(a)(2)(B) reports, FRE 702/707 four-prong methodology statements
  • Schedule risk primitives — Bayesian posterior estimation (computeBayesianUpdate); per-iteration CPM (runCPM) suitable as an inner loop for Monte Carlo wrappers built on top of this engine. Full Monte Carlo / QRAMM scoring lives in the CPP forensic skill suite (schedule-risk-analysis), built atop this primitive.
  • Schedule health — DCMA-14 assessment, A-F auto-grade, baseline-vs-current diff
  • Multi-jurisdiction calendars — 66 default holiday rule sets (CA-FED + 13 provinces/territories, US-FED + 50 states + DC). These are framework-aligned defaults sufficient for general-purpose date math — see docs/jurisdictions.md for the per-jurisdiction reference table and forensic-use verification guidance. They are not legally certified calendars; for forensic use, override with the project's contract calendar via opts.calendar.

AACE alignment

The engine implements the math behind these AACE Recommended Practices:

RP Title Method labels emitted
29R-03 Forensic Schedule Analysis MIP 3.3 / 3.6 / 3.7 / 3.8
49R-06 Identifying the Critical Path LPM, TFM, MFP
52R-06 Prospective Time Impact Analysis MIP 3.6 (Single Simulation) / MIP 3.7 (Multiple Base)
122R-22 Quantitative Risk Analysis Maturity Model (QRAMM) (badge surface)
PPG #20 (2nd Ed 2024) Forensic Schedule Analysis Practice Guide (general acceptance)

Method labels are emitted in result.manifest.methodology — exactly the strings AACE peer-reviewers and opposing experts expect.


Verifiable provenance

Every computation emits a manifest:

result.manifest = {
    engine_version: '2.9.34',
    method_id: 'computeCPM',
    activity_count: 3,
    relationship_count: 2,
    data_date: '2026-01-05',
    calendar_count: 1,
    computed_at: '2026-05-10T14:32:01.847Z',
}

Plus, for forensic provenance, every input carries a SHA-256 topology hash:

const hash = E.computeTopologyHash(activities, relationships);
console.log(hash.topology_hash);  // 64-char hex over canonical (code, duration, sorted preds + types + lags)
// Two XERs with identical hashes have IDENTICAL CANONICALIZED TOPOLOGY under the hashed-field
// set (activity codes, durations, predecessor links + types + lags). NOT a forensic-equivalence
// statement — different calendars, resources, WBS, names, or constraints can still produce
// different schedules under the same hash. The hash is a signal, not a schedule-equivalence proof.

This is the engine's network-topology fingerprint. Bid-collusion signal, retroactive-manipulation signal, and copy-detection signal across XERs all rely on it. It is also the foundation that lets opposing counsel verify topology-level integrity of a CPP analysis post-hoc — they can recompute the hash from the same XER and confirm the activity/relationship network was not altered between submission and review.


JavaScript - Python parity

The engine has a Python sibling (_cpp_common/scripts/cpm.py) used by every CPP forensic skill. The two implementations are kept bit-identical via cross-validation:

npm run crossval
# 43 fixtures × 747 checks. 0 deviations as of v2.9.34.

Plus a 282-activity real-XER stress test reports 0 mismatches.

This means a forensic analysis run in JavaScript (browser, Node) produces the same numbers as one run in Python (claims-preparation skill, MCP server, batch pipeline). Every CPP deliverable carries the same manifest regardless of which surface produced it.


Independent verification

The same-author crossval is honest about its limit: both JS and Python implementations are maintained here. To close the Daubert "no independent testing" objection, the engine ships with a one-command third-party reproduction harness:

git clone https://github.com/danafitkowski/cpp-cpm-engine
cd cpp-cpm-engine
git checkout <commit-sha>     # the SHA cited in the disclosure
npm run verify                # runs unit + crossval + citation tests
# → attestations/latest.json   ← machine-readable witness file

Engine has zero npm dependencies, so reproduction requires only Node 18+ and Python 3.10+. The witness file contains:

  • Engine SHA-256 + Python-reference SHA-256
  • Commit SHA + git ref + workflow URL (in CI)
  • Test counts: unit-tests passed/failed, crossval fixtures + checks, citation regression status
  • Timestamp + Node version + platform
  • Verdict (PASS/FAIL)

Compare your locally-generated witness against the CI-signed witness (published on every push as a workflow artifact + Sigstore-signed via actions/attest-build-provenance). Bit-identical SHA-256s + matching pass counts on a clean clone = third-party reproduction confirmed.

Verify a signed CI attestation:

gh attestation verify attestations/latest.json --owner danafitkowski

See DAUBERT.md §3.1 — Independent Verification for the full Daubert framing.


Production use

The engine runs live at mcp.criticalpathpartners.ca — try it in your browser. The same cpm-engine.js file is served over the wire and embedded inline in every report CPP produces.

The CPP forensic suite (forensic-delay-analysis, claims-preparation, claim-workbench, time-impact-analysis, schedule-risk-analysis, collapsed-as-built, counter-claim-analysis) all consume this engine — the JS port for browser/MCP, the Python sibling for batch pipelines.


Citation

If you use this engine in academic work or expert-witness reports, please cite:

Fitkowski, D. (2026). cpm-engine: An open-source critical-path-method engine with AACE-canonical method labels and a published Daubert disclosure. Critical Path Partners. Version 2.9.34. https://github.com/danafitkowski/cpp-cpm-engine

Algorithm citations are in docs/citations.md. All citations have been verified against primary sources.


License

MIT — see LICENSE.

You can use this engine in commercial forensic consulting, in academic research, in your own scheduling product, in court-filed expert reports. Just keep the copyright notice. No support is implied; no warranty is provided. You are responsible for the conclusions you draw with the engine. A Daubert disclosure is built in (DAUBERT.md) — you may use it as a starting point for your own FRCP 26(a)(2)(B) report.


Release notes

v2.9.12 (2026-05-16) — Round 9 engine math fix wave. ~30 substantive math defects closed across four buckets: T1 constraint handling (MS_Start backward LF clamp, AACE 29R-03 §4.3 actual_start immutability, Section D Monte Carlo actual_start pinning, INFO task-dropped alerts, constraint-unrecognized / incomplete WARNs, CS_MANSTART/CS_MANFINISH aliases, Section D SNLT/FNLT/MS_Start violated+applied alerts); T2 calendar/lag arithmetic (calendar-aware Free Float on binding link, signed _countWorkDaysBetween, negative-FF preserved, dateToNum rollover guard, non-finite lag rejection, invalid-calendar-falling-back WARN, SUB_DAY_LAG_ROUNDED direction-bias disclosure); T3 in-progress + actuals (remaining_duration P6 retained-logic, backward LS=ES pin for in-progress, Section C EF>=ES guard, OoS enumerates every pred, hammock-orphan ALERT, hammock duration_working_days, unrecognized-task-type WARN); T4 Python parity (R8A-1 backport, ALAP secondary slot, forward ES gate). 792 unit tests / 416 crossval checks / verify PASS. See CHANGELOG.md for the full T1-T4 fix index.

v2.9.11 (2026-05-16) — Round 8 R8A engine math fix wave. Four T1 silent-wrong-answer paths closed: actual_finish without actual_start no longer collapses ES to EF; sub-day fractional lags emit SUB_DAY_LAG_ROUNDED ALERT; FF / SF Free Float uses the successor's calendar; Section D constraint clamps emit constraint-skipped WARN when opts.projectStart is missing.

v2.9.10 (2026-05-16) — Round 7-8 hardening. Independent-verification infrastructure (public CI on 9 OS × Node combos, Sigstore-signed witness JSONs, one-command local reproduction via npm run verify) ships as a tagged release. Engine math byte-identical to v2.9.9; that is a docs + infra release. See DAUBERT.md §3.1 and the new §10 Roadmap.

See CHANGELOG.md for the full release history through v2.9.34.


Contributing

See CONTRIBUTING.md. Forensic correctness is enforced — every commit must pass 1,128 unit tests and 747/747 cross-validation checks across 43 fixtures, plus the citation regression, truncation regression, and version-drift regression gates (all wired into npm run test:all and npm run verify). New citations require WebSearch-verified URLs. No fabricated case names. No LLM-generated narratives in core engine paths.


Companion repositories

Two companion repositories are public:

  • cpp-xer-parser — the canonical Primavera P6 XER parser. The engine consumes its parse output as the canonical XER → JS-object layer; cpp-xer-parser has no dependency on this engine.
  • cpp-critical-path-validator — critical path validation and DCMA-14 assessment. Optionally consumes this engine for the LPM cross-check; degrades gracefully when absent.

Additional CPP skills (forensic-delay-analysis, claims-preparation, claim-workbench, time-impact-analysis, collapsed-as-built, counter-claim-analysis, schedule-risk-analysis) are private; contact Critical Path Partners for access.


Strategic note

CPP is a forensic-scheduling consultancy. The engine is open-source as a deliberate posture choice: the CPM math is a decades-old peer-reviewed commodity (Kelley & Walker 1959, Kahn 1962, Tarjan 1972); the workflow, methodology discipline, and Daubert-disclosure posture are where forensic value lives. Open-sourcing the math layer means any academic, solo forensic, contractor's internal scheduler, or independent reviewer has a transparent, citable foundation to inspect, modify, or build on.

If you ship something built on this engine, we'd love to hear about it: danafitkowski@gmail.com.

Recommended MCP Servers

How it compares

Domain-specific P6 forensic analytics MCP, not a generic Gantt chart plugin or Claude markdown skill.

FAQ

What does cpm-engine do?

An open-source CPM engine with AACE-aligned methodology and a published [Daubert disclosure](DAUBERT.

When should I use cpm-engine?

An open-source CPM engine with AACE-aligned methodology and a published [Daubert disclosure](DAUBERT.md).

Is cpm-engine safe to install?

Review the Security Audits panel on this page before installing in production.

Developer Toolsintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.